• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Exel VBA 別シートから該当データを取得する)

Exel VBAで別シートから該当データを取得する方法

このQ&Aのポイント
  • エクセルVBAを使用して別のシートから該当するデータを取得する方法について教えてください。
  • 日付表と一覧表という2つのシートがあり、日付表のC列に一覧表から商品番号と日付が一致するコードを貼り付けたいです。
  • 目視で入力しているため、マクロで一度に処理したいか、マッチしたら一覧表側のコードセルにマークをつける方法が知りたいです。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1635/2480)
回答No.1

関数でもいけそうですが C2に =IFERROR(INDEX(一覧表!$A$1:$AE$31,MATCH(日付表!B5,一覧表!$A:$A,0),MATCH(日付表!A5,一覧表!$1:$1,0)),"該当なし") 下にコピーで VBAでしたら(上記の式を当てはめてもいけると思いますがFindを使いました) 日付の検索になりますのでヒットしない場合は Sh1.Cells(i, "A").Value を DateValue(Sh1.Cells(i, "A").Value) とかにしたりして探ってください。この場合日付以外のデータがあるとエラーになりますのでIsdate()で日付(数値)かどうか確認が必要です。 Sub Test() Dim Sh1 As Worksheet, Sh2 As Worksheet Dim FrR As Range, FrC As Range Dim LastRow As Long, mRow As Long, mColumn As Long Dim i As Long, flg As Boolean Set Sh1 = Sheets("日付表") Set Sh2 = Sheets("一覧表") LastRow = Sh1.Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To LastRow flg = True Set FrR = Sh2.Range("1:1").Find(What:=Sh1.Cells(i, "A").Value, LookIn:=xlValues, lookat:=xlWhole) If Not FrR Is Nothing Then mColumn = FrR.Column Else flg = False '"見つかりません" End If Set FrC = Sh2.Range("A:A").Find(What:=Sh1.Cells(i, "B").Value, LookIn:=xlValues, lookat:=xlWhole) If Not FrC Is Nothing Then mRow = FrC.Row Else flg = False '"見つかりません" End If If flg = True Then Sh1.Cells(i, "C").Value = Sh2.Cells(mRow, mColumn).Value Else Sh1.Cells(i, "C").Value = "該当なし" End If Next Set Sh1 = Nothing Set Sh2 = Nothing End Sub

cz9d39
質問者

お礼

大変助かります。 思い通りになりました。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

データ例 Sheet1 A1:C4 C列が求める結果です。当初は空白。 日付 対象商品番号 コード 2020/6/1 U-1325-L 789879 2020/6/2 R-134256 456456 2020/6/3 L-456632 642122 ーーー Sheet2 A1:F4 商品番号 2020/6/1 2020/6/2 2020/6/3 2020/6/4 2020/6/5 R-134256 123123 456456 741741 741723 753753 U-1325-L 789879 963963 852852 851674 951951 L-456632 653123 645231 642122 611216 683211 ーー コード 標準モジュールに Sub test01() Set Sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '--- lr = Sh1.Range("A100000").End(xlUp).Row 'Sh1の最終行番号数 MsgBox "Sh1の最下番号" & lr For i = 2 To lr 'Sheet1の各行に対し、繰り返し処理 x = Sh1.Cells(i, "B") 'Sh1のB列の商品番号 MsgBox "Sh1から取得 商品番号" & x r = sh2.Range("A:A").Find(what:=x).Row 'Sh2のA列のどの行にあるか MsgBox "Sh2で 商品番号見つかった行" & r '--- y = Sh1.Cells(i, "A") 'Sh1のA列の日付け取得 MsgBox "Sh1から取得 日付け" & y c = sh2.Range("a1:z1").Find(what:=y).Column MsgBox "Sh2で日付けが見つかった列" & c Z = sh2.Cells(r, c) 'Sh1で其れらの行、列の交差セルデータ Sh1.Cells(i, "C") = Z 'Sh1のC列へセット Next i End Sub --- テストが終わればMsgboxの行はすべて削除して実行。 商品番号、日付がSheet2で存在しないという前例は考えてない。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1635/2480)
回答No.2

No1の一部訂正です。 式のコピー元を間違えて5行目の式をコピペしたのでB5とA5をB2とA2に直してください。 =IFERROR(INDEX(一覧表!$A$1:$AE$31,MATCH(日付表!B5,一覧表!$A:$A,0),MATCH(日付表!A5,一覧表!$1:$1,0)),"該当なし") ↑これを以下↓のように =IFERROR(INDEX(一覧表!$A$1:$AE$31,MATCH(日付表!B2,一覧表!$A:$A,0),MATCH(日付表!A2,一覧表!$1:$1,0)),"該当なし")

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Exel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

    部品表というブックがあります A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。 A列     B列     C列       商品名  商品番号  コード モータ  U-1325-L   ホルダ  R-134256 また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。 やりたいことは 部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。 部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。 自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが… Sub 別ブックから貼り付ける()   Dim 検索する As Long Windows("部品表.xls").Activate 検索する = cells(i,2).Value Windows("コード一覧表.xls").Activate ActiveWindow.SmallScroll Down:=-3 Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。 基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。 どうぞよろしくお願いします。

  • エクセル 別シートから一覧を抽出したい

    部品一覧表を作成しているのですが、2シートあり 1入力シート・2部品コードシートとあります。 部品コードシートにはB列に部品番号・C列部品名・D列部品番号・E列部品名と2行ずつ使い番号・品名がB~Wまで47行分入力されています。 B1:C47、D1:E47…と2列47行にはそれぞれ【A】、【B】、…とセルの名前の定義をつけました。現在【H】までありますが、今後増える可能性があります。 入力シートに、セルの名前を指定したときに部品コードのシートから 一覧を抽出したいのですが、どの関数を使えばよいのかわかりません。 入力シート                 |部品コードシート G   H                  | A Bコード C部品名  Dコード E部品名 4式入力用にあけています。     |1 1800  ユニットA   1501 電源A 5コード 部品名             |2 1801  ユニットB   1502 電源B 6                       |3 G4に関数を入れてG6~G52まで部品コードのシートA1~A47を一気に表示 させたいのです。部品コードシートの行数が変わることはありません。 マクロを使わないと、関数では難しいでしょうか?

  • 別シートから該当する項目を引用したい。

    部活のコーチ陣で、毎日、「明日の動き一覧表」を作成しています。 (明日誰が何時に何をする…等、コーチ全員の明日の予定一覧表) シート1に全員分の今月のシフト表があり、 シート2に「明日の動き一覧表」の原本があります。 毎日原本をコピーし、明日の分を作成していくのですが、別シートの明日の日付のシフトが反映するようにしたいです。 VLOOKUP?と思ったのですが、設定の仕方が分からず… どなたかご教示いただけませんでしょうか。 宜しくお願い致します。 シート1: A列に名前があり、1行目に日付(3/1)、交わる部分にその日のシフト(A・B…)があります。 シート2: A列に名前があり、B列にシフト(A・B…)を入力するようになっています。 1列目に時間が記載されており、その時間帯に誰が何をしているかを入力していくのですが、 B列のシフトが反映されるようにしたいです。 ※毎日夜話し合いで作成されるので、明日のシフトが反映されるように。

  • エクセルでリストに対応するデータを別シートの表

    エクセルでリストに対応するデータを別シートの表に参照したいです。 「表シート」のB2にリストを作って、 (リストは「一覧表シート」のA,B,Cが入力されているセルを参照しています。) Aを選択すると101の下の段(B11)に、 「一覧表シート」のAの列101の111が入力されるようにしたいです。 Bを選択すると222、Cを選択すると333が入力できるようにしたいです。 この「表シート」の表がややこしいのですが、 建物の部屋番号に対応しているため、3階2階1階という順になっています。 関数で対応できるものでしょうか? 分かりにくい表ですが、よろしくお願いします。

  • マクロで、データの検索と該当データのコピー、別のシートへ移動

    えー・・っと。初めて質問するものです。 エクセルの関数だけでは 問題が解決できないので、マクロに挑戦してますが、息詰ってしまいました。 はじめに、合計表のB列とJ列に 1と入力されたらaと記入、2と入力されたらb、3と入力されたらcという風にマクロを作成。 ココまではできたのですが・・・。 このB列とJ列。それぞれ、aのシート、bのシート、cのシートと 入力された時点で それぞれのシートにコピー振分けしたいのですが・・・。うまくいきません。 コピーしたいデータは 合計表のA列からG列のaに変更になってるデータの一行を部分。(合計表は2分割されてる表なので、B列とJ列) わかりづらいですかね?言いたいことが伝わってるといいのですが・・・。 作ってみたのはこんな感じです。 private sub worksheet_change dim as integer for i=2to63 if cells(i,"a").value=1then cells(i,"b")="a" endif next * b,cも j列の場合も同様につくりました。 dim cl as range set cl=range("B:B").find(what:="a",lookat:=xlwhole) if cl=xlwhole then cells("A:G")=sheet2("asheet") sheets("合計表").copy before:=cells("A:G") ここまでで・・わけがわからなくなりパニックになりました。 そもそもできるのか?という謎も生まれ・・・。 よろしく御願いします。

  • エクセルのシート間のデータ抽出について

    (1)シートは「集約」用のシートと、「各月」のシートがあります。「集約」シートは、A列には日付、B列には番号、C列には備考欄という表があります。各月のシートも同様ですが、番号の項目だけどの月も「1、2、3,4~」と通し番号でつけてあります。通し番号の数は月によって異なります。多くなる月もあれば、少なくなってしまう月、何もない月もあります。(2)「集約」の日付なり番号なりを入力すると、各月のデータが一つの表に反映されるようにしたいです。何かよい手立てはないものでしょうか?よろしくお願いします。

  • エクセルの1シートを項目別に別シートへ分ける方法

    エクセル2010で1シートのデータを項目別に別シートへ自動的に分割する方法で困っています。 検索するとマクロを使うと書いていますが、マクロはほとんど使ったことが無いのもあって、わかりませんでした。 シート1 A列(日付8ケタ+商品番号6ケタ) B列(売上額) 20130515000004           300 20130515000006           100 20130518000004           300 20130519000001           500 20130519000004           300 ・・・                   ・・・ をA列の日付部分上8ケタを使って日別にシートを分け、 シート名をuriage20130515(uriageと日付8ケタ)という名前にしシート名+CSV形式で保存したいです。 シート2 シート名:uriage20130515 A列         B列 20130515000004 300 20130515000006 100 シート3 シート名:uriage20130518 A列         B列 20130518000004 300 シート4 シート名:uriage20130519 A列         B列 20130519000001 500 20130519000004 300 このように自動で別シートに分割した上で、シート名CSV形式で保存まで自動でできるとありがたいです。 自動化できるならシートを分割するマクロ、シート名でCSV保存するマクロが一つのマクロになっていても、分かれていてもOKです。 このようなことはできますか? よろしくお願いします。

  • エクセルで別シートの値を取得したいです。

    エクセルで質問があります。 別シートからセル値を取得したいです。 ただ、セル番地は行番号、列番号で指定し、 行、列番号はセルに入力してある値を使いたいです。 例 Aシート(値格納シート) B1セル値=1000 -------------- Bシート(値取得シート) A列=行番号入力 B列=列番号入力 C列=Aシートの取得関数 A2セル値=1 B2セル値=2 C2セル=1000(取得値) C2セルの関数に、A2とB2の値を使って Aシートのセル値を取得したいです。 よろしくお願いします。

  • 別シートから値のある行を検索し、別シートに転記

    シート1とシート2があり、 シート1のA7がシート2のB列にあり、シート1のB20がシート2のその行のD列の値と同じ場合、シート2該当行のF列の値をシート1のL20に書き込むのですが、どのようにマクロを記述すればいいでしょうか 例えば、 シート1のA7に「A社」、B20に「商品A」があり、 シート2のB10に「A社」が、D10に「商品A」がある場合、F10の値をシート1のL20に返す方法です。 シート2のB列には「B社」や「C社」もあるため、B列の中からシート1のA7と合致する行を検索することになります。

  • 2つの表を比較して、重複する行を色づけするマクロ

    下記の様な日付の名前の2つのシートが有るのですが、表2の機種を参照して、B~T列全てが一致する場合、U列チェック欄に○と入力する様なマクロを作成したいのですが、何か良い方法が有りましたらご教授下さい。 マクロコードは簡単なものや定番のものなら読めますが 自分ではあまり書けません。 どなたかよろしくお願いいたします。 (日付シート1)              (日付シート2)  B~T列       U列        B~T列      U列 機種 機番 製造日 チェック     機種 機番 製造日 チェック    A-1  00  0000   ○      A-1  00  0000  ○ A-2  01  0001   ○      A-2  01  0001  ○ A-3  02  0002   ○      A-3  02  0002  ○ A-4  03  0003   ○      A-4  03  0003  ○  A-5  04  0004   ○      A-5  04  0004  ○ B-1  00  0000           C-1  00  0000 B-1  01  0001           C-2  01  0001   B-3  02  0002

専門家に質問してみよう