• 締切済み

VLOOKUP関数をVBAで使用したい

VLOOKUP関数をVBAで使用したい 「検索」シートにID番号を入力すると、「データ」シートのA列に入っているデータから入力されたID番号を検索し、該当するID番号のある行の横並びに入っている別の列データ(B~AG列)を取り出し、それぞれを「検索」シートの様々なセルに表示するVBAを作っていますが、VBAでVLOOKUP関数を用いる方法がよく分からず苦戦しています。 「データ」シートの1、2行目は見出しで、検索されるデータが入っているのは3行目からです。また、「データ」シートには不定期に新しいデータが追加されていきます。 「検索」シートに検索結果を表示する際も、以下のように規則性のないセル配置なので少しややこしいです。 「検索」シートのセル=「データ」シートの列 B6=B列  B8=C列  B10=D列  B11=E列  B12=F列 B13=G列  B14=H列  B16=I列  D16=J列  F16=K列 B17=L列  D17=M列  F17=N列  B20=O列  C20=P列 E20=Q列  B21=R列  C21=S列  E21=T列  B22=U列 C22=V列  E22=W列  B23=X列  C23=Y列  E23=Z列 B24=AA列  C24=AB列  E24=AC列  B26=AD列 E26=AE列  B29=AF列  B31=AG列 このような動作をVBAでさせることは可能でしょうか? また、検索して該当するID番号がなかった際も、VBAだとそこで動作が止まってしまうので、「該当するID番号がありません」といったエラー判定が出るようにすることはできますか? 教えてください。よろしくお願いします。

この投稿のマルチメディアは削除されているためご覧いただけません。

みんなの回答

  • mimeu
  • ベストアンサー率49% (39/79)
回答No.3

> エラーは出ないものの動作もせず ??? 動作しないのなら、エラーが出ないワケはないのですが (^-^) VBAの編集画面で メニュー > デバッグ > VBAプロジェクトのコンパイル を実行してください プログラムとして形式的に間違っている部分を指摘してくれます > >Case ・・・ 以下省略 ・・・ > ここの部分をよく理解できていないかもしれません・・・。 ここは、その上の行を参考に "B8" ~ "B31" につき記述します もし Case 文をご存じなければ、参考書かヘルプをご覧くださいね > 参考画像を添付してみました 折角ですが、その画像は表示されていません VBAといえども作ったプログラムが一発で正解稼働することは まずありません 何度もデバッグしながら仕上げるものですよ 常套手段は随所に Debug.Print 変数名 で変数の値を表示させ ウマク行ってるか一行ずつ確認しながら進めます

marron_cream
質問者

お礼

お礼が遅くなって申し訳ありません。 試行錯誤の結果、無事に完成させることができました! ありがとうございました。

  • mimeu
  • ベストアンサー率49% (39/79)
回答No.2

> 上記コードのどの箇所を訂正すれば良いでしょうか?   キー = "B6" ' 実際は検索シートに入力された ID番号 の部分です

marron_cream
質問者

補足

ありがとうございます。 補足の回答を踏まえてコードを入力してみましたが、エラーは出ないものの動作もせず行き詰ってしまいました。 >Case ・・・ 以下省略 ・・・ ここの部分をよく理解できていないかもしれません・・・。 質問の説明が分かりづらかったかもしれないので、こういう動作をさせたいという参考画像を添付してみました。 画像の上が「データ」シートにデータが入っている状態で、下が「検索」シートで検索した結果です。実際はもっとたくさんの行と列があります。 (画像が大きすぎて添付した際に潰れ気味になってしまいました、見づらかったらすみません)

  • mimeu
  • ベストアンサー率49% (39/79)
回答No.1

こんな感じです Sub tes()   Dim 列 As Long, キー As String   キー = "B6" ' 実際は検索シートに入力された ID番号   Select Case キー   Case "B6" : 列 = 2   Case ・・・ 以下省略 ・・・   End Select   On Error Resume Next   Debug.Print Application.WorksheetFunction.VLookup(キー, Worksheets("データ").Range("A1:AG100"), 列, False)   If Err.Number = 1004 Then     Debug.Print "該当キーがない"     Err.Clear   End If End Sub

marron_cream
質問者

補足

詳しく書いてくださってありがとうございます! 今改めて書き忘れに気付いたのですが、「検索」シートで検索するID番号を入力するセルはB4です。この場合、上記コードのどの箇所を訂正すれば良いでしょうか? 確認漏れでお手数をお掛けして申し訳ありません・・・。

関連するQ&A

  • IFとVLOOKUP関数

    VLOOKUP関数を使って検索結果を出そうと思いましたが、 データ量が93000行X8列になりますので、 共通分けして複数のシート(A、B、C、D)に分けました。 あるセルに『A』と入れると『シートA』の表から検索を行う、 あるセルに『B』と入れると『シートB』の表から検索するといった感じにするには、 IFとVLOOKUPを使用するなら、どのような式を入れたらいいのでしょうか? また、他の関数を使う式があるのでしょうか? マクロやVBAも考えましたが、 あまり知識がありません。 データ量から考えると マクロやVBAで行った方がいいのでしょうか?

  • Excel VLOOKUPをVBAでやりたいのですが、分からなくて困っ

    Excel VLOOKUPをVBAでやりたいのですが、分からなくて困ってます。 Sheet1のC列2行目行こうにSheet2のI列のデータを取得し (A列にデーターが入っている分、(時と場合により表示数が違う為)) なおかつ Sheet1のD列2行目以降にB-Cの差し引きをおこなう 以上のことをSheet1をアクティブにした時VBAでおこなうには、? 教えて下さい。宜しくお願い致します。

  • VLOOKUP関数をVBAで書くには

    EXCEL VBAの初心者です VLOOKUP関数をVBAで書きたいのですが、よくわかりません すいませんがどなたかご教授、願えないでしょうか? sheet1     sheet2 A    B  A    B      名称 CD    名称 CD 滋賀県 25     滋賀県  25 京都府 26     大阪府 27 大阪府 27 兵庫県 28     兵庫県 28 sheet2のA列をキーにsheet1のA列と照合して sheet2のB列にsheet1で一致した行のB列をコピーする VLOOKUP関数を使うと、sheet2のB2は =IF($A2="","",VLOOKUP($A2,Sheet1!$A$2:$B$5,2,0)) としたら、25を得ることができました VBAでする場合、どのように書けばいいのでしょうか? よろしくお願いします

  • VLOOKUP関数 列番号の設定の仕方教えて下さい

    VLOOKUP関数の列番号を 1、2、とかではなく、 計算して列番号を設定することはできますか? シート2 に入っているデータを参照して シート1 に関数をいれて、表示させたいと思っています。 シート2 データは 3行目に、項目(品名、(1)材料名、(2)数量、(2)材料名、(2)数量、...、(10)材料名、(10)数量) A列、 B列、 C列、 D列、 E列、...、 M列、 N列 クッキー、小麦粉、100、卵、1、...、砂糖、20 クラッカー、小麦粉、100、米粉、10、...、りんご、0.2 が入っていて、4行目から100行目くらいまでデータがはいっています。 シート1 の セルA5に品名を入力すると、 シート2の(1)材料名がセルA6に、 (1)数量がセルB6に、 (2)材料名がセルA7に、 (2)数量がセルB7に、 ... (10)材料名がセルA15に、 (10)数量がセルB15に、 入るように作りたいのですが、VLOOKUPの列番号を COLUMNやINDEXなど試してみましたが、エラーばかりで うまくできません...VLOOKUPでは無理なのでしょうか? どなたか詳しい方教えてください。よろしくお願いします・

  • Vlookup関数で検索結果がエラーになってしまう

    お世話になります。 Vlookup関数の質問となります。 =VLOOKUP(C2,Sheet2!$A$2:$E$685,1,FALSE) 検索値  →リストを使用(元データはSheet2の指定したセル範囲の表の2列目のデータ) 範囲 →Sheet2の特定のセル範囲 列番号 →1(ここは100-01、100-02などの番号が入力されています) 検索方法 →false(完全一致) この式で「#N/Aエラー」が発生してしまいます。 単純に「氏名」から「社員番号」を引っ張りたいだけなのですが、 なんでエラーになるのでしょうか? 範囲に指定した表には空白行はありますが、書式設定などは特に問題はないです。 恥ずかしい質問なのは十分に理解していますが、 教えて頂きたく思います。 よろしくお願い致します。

  • VLOOKUP関数と同じことをVBAでおこなうには

     初めまして、当方VBAの素人です。よろしくお願いします。  同じような質問で、このようなVBAを見つけました。 Sub Macro1() For n = 2 To 5 '処理するSheet2の行数範囲 a = Sheets("Sheet2").Cells(n, 1) 'aにA列の値を代入 For m = 2 To 5 '検索するSheet1の行数範囲 If Sheets("Sheet1").Cells(m, 1) = a Then 'Sheet2のA列の値とSheet1のA列が一致した場合 v = Sheets("Sheet1").Cells(m, 2) 'vにB列の値を代入 Sheets("Sheet2").Cells(n, 2).Value = v 'Sheet2のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub このVBAではSheet2での検索、入力が列になるのですが、列でなく、行でできないでしょうか。できればSheet1のB列の値をSheet2の1行で検索、Sheet2の2行に入力されるだけではなく、Sheet1のC列の値をSheet3の1行で検索、Sheet3の2行に入力されるようにしたいと思います。  解る方、よろしくお願いします。

  • VLOOKUP関数についての質問

    sheet1にある番号がsheet2にあればBの○×をsheet1に反映させたいのですが VLOOKUPを使用してもうまくいきません。 もしかして文字列と標準になっていたりするとうまく検索できないのか、この関数は不向き なのか、悩んでます。 説明がうまくできないのですが、よろしくお願いします。 sheet1      A       B      C 1 09012345678 2 09012345679 3 4 5 sheet2 番号データ      A       B      C 1 09012345678  ○ 2 09012345679  × 3 09013456569  ○ 4 09089897899  ○ 5

  • エクセルのVLOOKUP関数で・・・

    3時間ほど色々頑張ったのですが、もうお手上げなので教えて下さい・・・。 エクセルでシートが2つあり、シート2から一致するデータのみをシート1に持って行きたいのです。 具体的にはシート1には「F列/カナ氏名・G列/漢字氏名・H列/顧客番号・I列/生年月日」が設定されています。 ただしH列には顧客番号が入力されていません。 シート2より生年月日をキーにして引っ張ってくる予定です。 シート1には1000件データがあり、シート2に載っている該当者が200件程ヒットする予定です。 シート2には「A列/生年月日・B列/カナ氏名・C列/漢字氏名・E列/顧客番号」が設定されています。 仮に1行目からデータが入っているものとして、シート1のH1のセルに次の式を入れました。 =VLOOKUP(I1,'シート2'!範囲,5,FALSE) 範囲には実際の範囲を指定し、5列目がシート2の生年月日なので合ってると思うのですが・・・。 エラーは#N/Aというのが出てしまいます。 何処に問題があるのか分かりません。 説明が下手かもしれませんが、分かる方教えて下さい!

  • vlookup関数について

    vlookup関数について教えてください。    A       B         C      D      E        1  あじ    りんご     2  さば    みかん            3  さんま   ばなな        という内容で、D1セルに入力した内容に応じてE1セルに内容を転記させていました。 E1=VLOOKUP(D1$A$1$B3,2,FALSE) 上記で運用していたときはうまくいったのですが、 Cの列にも文字をいれ、E1セルにはCの内容を検索して、B列の内容を転記したいと 思って作りかえるとうまくいきません。 今回の新しいやり方では、 ・A列からの検索はいらない(でも他ファイルから参照されているので、削除、移動はできない) ・E1=VLOOKUP(D1$A$1$C2,2,FALSE)では #N/A となる ・A列からの検索がいらないから、E1=VLOOKUP(D1$B1$C2,1,FALSE) でも #N/A 調べてみたのですがわからなくて・・・ どこがおかしいのか、教えてください。宜しくお願いします。

  • vlookupに、Indirect と Match 関数を組み合わせる

    vlookup関数で、検索値にSheet1(Book1)から、範囲は、Sheet2(Book1)のセルにある名前のついているSheet1(Book2), そして、列番号は、指定した名前とマッチするSheet1(Book2)の列番号から、導き出そうとしています。 ところが、Matchで指定した範囲は、Indirect内の関数として認識されないようで、結果が得られません。 たとえば、 Book1のA1~E1にタイトルが入っています。(Index, Title, Book, Author, Frequency) Book2には、 シート1: InputName シート2: Output シート2に以下の関数を入れてみましたが、うまくいきません。 ちなみに、VLOOKUPの列番号を Match関数の代わりに、5 とすると、結果オーライですが、Book1 の列順が変わっていることがあるので、Matchを使ってエラーを避けたいのですが、以下の関数のどこを直すべきでしょうか? =IF(ISNA(VLOOKUP(C2,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$2:$E$1400"),MATCH("Frequency",$A$2:$E$2,0),FALSE)),0,VLOOKUP(C2,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$2:$E$1400"),MATCH("Frequency",$A$2:$E$2,0),FALSE)) よろしくお願いします。

専門家に質問してみよう