• ベストアンサー

ExcelのVBAに詳しい方、教えて下さい。

VBAの中でVLOOKUP関数を使っています。 対象となるリストの中に、検索値に相当する文字列が無かったとき、 「WorksheetクラスのVlookupプロパティを取得できません。」という表示がでて、演算が止まってしまいます。 excel単体でVlookupを使ったときのように、検索値が無い場合は「N/A#」と表示させるか、 他の表示をさせて演算を継続させたいのですが、 どのようにしたら良いでしょうか? ご存じの方、教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

こんにちは、 >連続してエラーが出た場合は、この方式ではダメなのでしょうか…。 連続していても、大丈夫の様ですが、 On Error GoToの使い方が間違っては いませんか エラー処理した後、 エラーからResume Next で、復活させないと駄目ですよ。 サンプルを書いておきます Public Sub ff() Dim smoji As String Dim hani As Range Dim keka As Variant On Error GoTo trap 'エラーする文字 smoji = "x" Set hani = Sheet1.Range("A1:B8") keka = WorksheetFunction.VLookup(smoji, hani, 2, False) Debug.Print keka 'エラーする文字 smoji = "x" Set hani = Sheet1.Range("A1:B8") keka = WorksheetFunction.VLookup(smoji, hani, 2, False) Debug.Print keka 'エラーしない文字 smoji = "e" Set hani = Sheet1.Range("A1:B8") keka = WorksheetFunction.VLookup(smoji, hani, 2, False) Debug.Print keka Exit Sub trap: keka = "erro" Resume Next End Sub 実行結果 call ff erro erro 5

FUJIKUN_45
質問者

お礼

有り難うございますm(_ _)m サンプルコードまで書いて頂きすいませんm(_ _)mm(_ _)m 無事解決致しました。m(_ _)mm(_ _)mm(_ _)m

その他の回答 (2)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

.VLookup() よりも前に、 On Error Goto Next と記載すると、それ以降に発生するエラーを無視して実行可能になります。 そして、.VLookup() 実行後にエラー番号(Err.Number)を取得すれば、エラーの内容を検知して対応する処理を実行出来ます。 エラートラップと言います。 http://t_shun.at.infoseek.co.jp/My_Page/Excel-VBA/vba_page21.htm

FUJIKUN_45
質問者

お礼

回答有り難うございます。 On Error Goto… を使ってみました。 エラーが1回の時はOKなのですが、2回連続してエラーが出ると 止まってしまうようです…。 教えていただいたサイトを確認してみます。

  • gif317
  • ベストアンサー率32% (71/216)
回答No.1

これだけではなんとも言えないですが、VLOOKUPを使っていると子だけでもコードを書いてもらわないと答えようが無いような気がします。あと、このサイトよりもこちらの方がいいかもしれません。

参考URL:
http://www2.moug.net/bbs/exvba/
FUJIKUN_45
質問者

補足

回答有り難うございます。 つたないコードですが、以下のように作っています。 '---DATA1に有ってDATA2に無いもの--- COUNT = 0 Do Until COUNT = 7500 Do Until COUNT = 7500 Windows(myname).Activate Sheets("Sheet2").Select COUNT = COUNT + 1 CHECK = Sheets("DATA2").Cells(COUNT, 1) If CHECK = "" Then Exit Do Else End If On Error GoTo TRAPa ANS = _ WorksheetFunction.VLookup(CHECK, Sheets("DATA1").Range("A1:E7500"), 5, False) Worksheets("Sheet2").Cells(COUNT, 1) = ANS Loop TRAPa: If Sheets("DATA2").Cells(COUNT, 1) = "" Then Exit Do Else End If ANS = "×" Worksheets("Sheet2").Cells(COUNT, 1) = ANS Loop '----------------------- 以上です。 ここで、COUNT値が1382、1383の時に、連続して検索値が無い場合、 1382に対しては"×"が表示されるのですが、1383の時に 「WorksheetクラスのVlookupプロパティを取得できません。」 のメッセージが出て止まってしまうのです。 連続してエラーが出た場合は、この方式ではダメなのでしょうか…。

関連するQ&A

  • エクセル、VBA、抽出複数検索について

    エクセル、VBA、VLOOKUP、MATCH関数等について出来る方法があれば教えてください。 インチごとに分けてあるシートがあり、(在庫表です) これを参照して、別ブックへVLOOKUP等を使って、サンプルデータのシート4のように表示させたいのですが、 何か方法を使って出来ることは可能でしょうか? 問題点が複数あります 1、VLOOKUPの範囲について、B列が結合されていて、C列は複数行あるため、商品名が入ってきません。 C列については、何千件とデータがあるため、結合することは不可能です。 一致している条件としては商品コードが必ずあり、商品名には「/」が入っております。 =CONCATENATEとVLOOKUPは一緒に使うことは可能ですか? もしくはINDEX関数やIF、SUMPRODUCT等を使うのでしょうか? シート4のような形に出来る方法があれば、教えてほしいです。 VBAは詳しくはないのですが、VBAで出来るのであれば、教えてほしいです。 在庫表はとても作り方が悪いのですが、これを作り直すと言うことは、不可能です。 グループ会社で使っているため、なんとかこの在庫表を使いたいです。 VBAでA列をA5からA100にコードのみ入れた場合、B列に商品名が入るようにVBAで作ることは可能でしょうか? もしくは、検索条件を2つ使って、一つは商品コード完全一致+あいまい検索で【/】で商品名を入れることは可能でしょうか? 関数は調べたのですが、関数では難しいのかなと思います。 宜しくお願い致します。

  • vbaでvlookup

    エクセルのVBAについて。 指定した範囲の中から検索条件に一致したデータを検索し、取り出してくれる関数vlookup をVBAで実現したいのですが、 目標として、エクセルのセル(列)に、値を入力されているとします。 VBAを実行するボタンをクリックすると、、、 その値に対応する文字列(事前に用意)をその値の右のセルに自動で入力させたいです。 このVBAを作ることが目標です。 vbaでvlookupを実現でなくても、それよりも簡単な方法があれば教えていただきたいです。 お手数ですが、よろしくお願いします。

  • エクセルvbaのフォームでエラーとなります

    ワークシートにIDと名前の対応表があります。 別のシートのA1に検索したいID欄、A2にVLOOKUP関数で結果を表示させています。 VBAの入力フォーム上で、あるIDを入れたときに前途のA1に数値を代入し、A2で得られた結果をフォーム上の欄で取得するようにしています。 この時、表の中に対応する番号と名前があればキチンと結果が出ますが、そもそもデータベースが無ければVBA自体がエラーとなってしまいます。 ワークシート上のVLOOKUPには近似値では困るのでFALSEを指定していますので、該当番号がなければここでの結果は#N/Aとなっています。 フォーム上で該当番号がなければ代わりの文字列、たとえば「なし」などを入力されるようにできるか、最低でもプロセスが中断される事がないようにしたいのですが、どのようにすれば可能でしょうか?

  • [Excel VBA 2003]VBA上でVlookupする方法

    レンジ内に特定の文字列が存在するかをVBA上で判定したいのですが VBA上ではVLookUpが使用できません。VBAでVLookUpのかわりとなる 関数または方法はありますか?

  • エクセルVBA VLOOKUPについて

    エクセル VBA初心者です。 関数でのVLOOKUPをVBAで作りたいのですが、上手くいきません。 あらかじめ、Sheet2の1から300行までに A列  / B列 商品名 / 商品コード が入力されています。(名前の定義=商品コード) Sheet1にユーザーフォームを利用して、データを書き込んだ後、 B列に商品名が書き込まれると、 A列に商品コードが表示されるようにしたいと考えています。 A列に =IF(B2="","",VLOOKUP(B2,商品コード,2,FALSE)) と入力していたのですが、 VBAでIfを使って出来ないかと考えてみたのですが、 上手くいきませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) Dim sRow As Long Dim sColumn As Long sRow = ActiveCell.Row sColumn = ActiveCell.Column If Cells(sRow, 2).Value = True Then Cells(sRow, 1).Value = WorksheetFunction.VLookup(Cells(sRow2).Value, Worksheets("Sheet2").Range("A1:B300"), 2, False) ElseIf Cells(sRow, 2).Value = " " Then Cells(sRow, 1).Value = " " End If End Sub ご教授いただけないでしょうか? エクセル2003 WindowsXP

  • (エクセル)表から1列の別表をつくりたい。

    表に入力されたものを1列に並び替えをしたいのです。(エクセル関数) エクセルの表から、セルに入力された情報を抜き出し、並び替えたいのですが、行き詰ってしまい質問させていただきます。 (やりたいこと) 添付資料のように、事業所ごとに購入した物品が日付ごとに入力されていきます。この表を一列で並び替えることを したいのですが、現状の表の形で1列に抜き出すやり方が思い浮かびません。ひとつずつリンクを設定していけばいいですが、 それですと、空白のセルができてしまうこともあり、空白を消すためにフィルタをやらなくてはいけず、なんとか関数でどうにかできないと質問させていただきました(つまり空白のセルは飛ばし、隙間のない1列の表に変換したいです)。 (試したこと) (1)vlookup関数を使うために、日付の横に検索列を作ってもみましたが、同じ行に複数の抜き出すべくものがあると、 if関数のネストをいれるにも「if(c5="","",vlookup(v5,b5:r10,2,fasle)」みたくやってみましたが、c5までは取り出せても、 d5,e5,f5・・・と右にずらしていく関数式が思い当たりません。 (2)種類、数量データ入力されている全てのセルの横に(1.2.3.4.5.6.7.8.9.・・・)と数字をいれて検索列をつくり、vlookupとmatch関数の 組み合わせも試しましたが、vlookup関数の性質上、複数列に検索値(「vlookup(検索値,範囲,列番号,検索の型)」)が存在しているとこれも出来ず。 説明が不十分な点もあると思いますが、よろしくお願いいたします。もし、VBAでなければ難しいとのことでしたら、どのようなVBAを組めばいいかもお願いいたします。

  • excelにて記号を取り出したい

    お世話になります。 セルの中に、例えば「アアア@イイイ」といったような記号が含まれている文字列があります。その中の記号を検出したいのですが、うまくいきません。 最終的にやりたいことは、そのセルの中に記号が含まれている場合、エラー表示を出したいのですが、VLOOKUPなどを使ってみても、数式的にエラーになるばかりで、うまくいかないのです。 ※記号単体でVLOOKUPを使うと確かに抽出されるのですが、文字列に紛れ込むと、検索しないみたいです。 なんとかならないものでしょうか。(ちなみに記号は不特定です)

  • エクセルVBAで、VLOOKUP関数を使うとエラーが出る

    Excel97を使用しています。 ユーザーフォームを作っています。 下記のコードで、課名に対応した部名を表示させようとしたのですが、 「WorksheetFunctionクラスのVlookupプロパティを取得できません」 と出てきてしまいます。 Private Sub CB_課名_AfterUpdate()  LB_部名.Caption = Application.WorksheetFunction.VLookup(CB_課名, "部", 2, False) End Sub CB_課名はコンボボックス、LB_部名はラベル、 "部"は名前を付けたセル範囲です。その1列目はCB_課名のRowSourceで、2列目が部名です。 VBAでVlookup関数を使ったコードを公開されているサイトがありましたので、使えないことはないと思ったのですが、どこか書き方がおかしいのでしょうか? ご存知の方、どうぞよろしくお願いいたします。

  •  EXCELのVBA,マクロでこれはどう記述するのでしょう?

    先日、類似の質問をしたものですが、下記のような表を作成し、A列の型データーを検索して、参照表からVLOOKUP関数で指定列の品番を表示させています。  先日、質問内容が抽象的で分かりにくかったので再度、質問ですが、  関数では出来ないことが前回の質問で分かり、VBAでないとダメだと言うことなんですが、 私のしたいことは、簡単に言いますと、B列の台数セルについて、セルの値を検索して台数が200以上であつた場合、そのセルのある下段に空白行を200なら1行、300なら2行挿入するという風にしたいのです。  これをVBAで実現するにはどのような記述が必要なのでしょうか?簡単に出来るのでしょうか?私はVBAは素人な者で、コード等は良く知りません。  いつもやっているのは、記録マクロばかりで、定形作業で一度組んだマクロの変化する部分(日付、ファイル名)を編集、修正しかしておりません。だからいつもデバック画面と格闘しています。どなたか知っておられたらご指南、お願いします。    A     B      C     D 1  型   台数  品番 2 検索値 250 3 検索値 100 4 検索値 200 5 検索値 150 6 検索値 350

  • vba vlookupについて

    VBAで範囲検索をしたくて、 vlookuを使おうと思ったのですが 1000~2000 2001~3000 3001~4000 4001~5000 5001~6000 6001~7000 7001~8000 8001~9000 9001~10000 このような表から 1237 を検索しようとすると失敗してしまいました(・・;) wskyu.Range("D24") = Application.WorksheetFunction.VLookup(kihon, .Range("D:H"), 5, True) このコードでエラーは起きず、 kihonに1237が入っています 1000 2001 ↑がD列です H列は 309 359 406 569 630 680 700 703 904 こんな感じです 思い通りにいけば1237を検索するので当てはまるのは1列目で 309が表示される予定だったのですが 実際やってみると630が表示されました、、、 なぜなのでしょうか そもそもVLOOKUPでこのような検索方法はできないのでしょうか? 補足として 最初はSELECT CASEを使い 1000~2000の間にあれば 309を表示 という風にしていたので 表などが間違っているのではないようです しかしそれだとコードがとても長くなってしまうので VLOOKUPにしようと思いました どうかよろしくお願いします!!