- ベストアンサー
マクロでVLOOKUPを使用した複数シートのデータを一覧シートへ
VLOOKUP関数を使用してシートを跨いでデータを一覧へもってくることができないようなので、 マクロを使用して以下のような作業をしたいです。 【Sheet1】:データベース(1) A列 B列 1行 0001 あ 2行 0003 う 【Sheet2】:データベース(2) A列 B列 1行 0002 い 2行 0004 え 3行 0005 お というデータから 【Sheet3】:一覧 A列 B列 1行 0001 あ 2行 0002 い 3行 0003 う 4行 0004 え 5行 0005 お を作成したい。 データベース(1)(2)は各々で全て手入力をし、 一覧のA列は予め入力しておき、B列の情報だけを一覧シートにもってくるという内容です。 (実際はセル数もシート数ももっと多いです) Application.WorksheetFunction.VLookup()を使うのかな? とは過去の質問から、なんとなく想像はつくのですが 素人なもので、例文を見てもよくわかりません・・・。 ご教授いただけると大変助かります。 よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
簡単にこんな感じじゃダメなんですか? Sub DataMerge() Dim SH1 As Worksheet, SH2 As Worksheet, SH3 As Worksheet Set SH1 = Sheets("Sheet1") Set SH2 = Sheets("Sheet2") Set SH3 = Sheets("Sheet3") 'Sheet3初期化 SH3.Cells.Clear 'Sheet1の最終行 lngR = SH1.Range("A65536").End(xlUp).Row 'Sheet1のデータをSheet3へコピー SH1.Range("A1:B" & lngR).Copy Destination:=SH3.Range("A1") 'Sheet2の最終行 lngR = SH2.Range("A65536").End(xlUp).Row 'Sheet2のデータをSheet3へコピー SH2.Range("A1:B" & lngR).Copy _ Destination:=SH3.Range("A65536").End(xlUp).Offset(1) 'Sheet3の最終行 lngR = SH3.Range("A65536").End(xlUp).Row '並べ替え SH3.Range("A1:B" & lngR).Sort Key1:=Range("A1"), Order1:=xlAscending Set SH1 = Nothing Set SH2 = Nothing Set SH3 = Nothing End Sub
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
Findメソッドでやってみました。 Sheet1が「一覧」A列にコードあり Sheet2,Sheet3が検索表(A列にコード、B列に意味)の例です。 Arrayのところで、検索表のシート名を増やしてください。 VLOOKUP利用でも、関数と、エラー検出の部分を少し変えれば同じ骨格でできます。 (コードが短いことを旨として作成) Sub test02() Dim sh As Worksheet Dim sh1 As Worksheet Dim x As Range Set sh1 = Worksheets("Sheet1") t = Array("Sheet2", "Sheet3") d1 = sh1.Range("A65536").End(xlUp).Row For i = 1 To d1 y = sh1.Cells(i, "A") For Each sh In Worksheets(t) d = sh.Range("A65536").End(xlUp).Row Set x = sh.Range(sh.Cells(1, "A"), sh.Cells(d, "A")).Find(y) If x Is Nothing Then sh1.Cells(i, "A").Offset(0, 1) = "Not Found" Else ' MsgBox x.Address & sh.Name sh1.Cells(i, "A").Offset(0, 1) = x.Offset(0, 1) Exit For End If Next Next i End Sub
お礼
回答ありがとうございます。 かなりハイレベルな感じがしますが、実際に自分のデータに応用する際に、参考になります。 わざわざ、ありがとうございました。
- onlyrom
- ベストアンサー率59% (228/384)
>VLOOKUP関数を使用してシートを跨いでデータを一覧へもってくることができないようなので こんな無責任なこと誰が言いました? 自分で確認しましたか? No.1さんの回答にもありますが出来ますよ。 但し、No1さんの回答にある絶対参照云々は関係ありません、相対参照でもOK。 相対だと式のコピーは出来ませんが。
お礼
回答ありがとうございます。 No.1様のお礼欄に記載しましたが、私の説明不足でした。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
Public Sub sample() Dim r As Range Dim x Dim list Dim index As Long list = Array(Sheets("Sheet1").Range("A1:B2"), Sheets("Sheet2").Range("A1:B3")) '参照範囲のリスト On Error GoTo DontFind For Each r In Sheets("Sheet3").Range("A1:A5") '固定にしない方がいいかも? index = 0 x = Application.WorksheetFunction.VLookup(r.Value, list(index), 2, False) r.Offset(0, 1).Value = x Next Exit Sub DontFind: If index < UBound(list) Then index = index + 1 Resume Else x = "#N/A": Resume Next ' MsgBox "検索値がみつからない" ' Stop End If End Sub
お礼
回答ありがとうございます。 とりあえず実行したところ、うまくいきました!! あとは、1文1文解析して実際に使用するファイルに応用してみます。 助かりました。
- moon00
- ベストアンサー率44% (315/712)
VLOOKUPでの参照範囲を絶対参照で行えば、別シートの表でも 参照できると思います。 また、表の内容が変わる可能性のある場合は、名前定義を利用するのも便利です。
お礼
回答ありがとうございます。 私の説明が足りませんでした。 紹介していただいたVLOOKUPの使い方だと Sheet3の B1 = VLOOKUP(A1,Sheet1!$A$1:$B$2,2,FALSE) B2 = VLOOKUP(A2,Sheet2!$A$1:$B$3,2,FALSE) B3 = VLOOKUP(A3,Sheet1!$A$1:$B$2,2,FALSE) B4 = VLOOKUP(A4,Sheet2!$A$1:$B$3,2,FALSE) B5 = VLOOKUP(A5,Sheet2!$A$1:$B$3,2,FALSE) とシートを指定しないといけなくなってしまいます。 イメージとしては、 VLOOKUP(A5,OR(Sheet1!$A$1:$B$2,Sheet2!$A$1:$B$3),2,FALSE) って感じにしたかったのですがダメだったので関数ではなくマクロしかないなということで質問をさせていただきました。
お礼
回答ありがとうございます。 初心者の私が言うのもなんですが、 とてもすっきりしていて、応用もメンテナンスもしやすそうです。 こちらも、私が今まで使ったことのない単語が多いので、一つ一つ解析していきたいと思います。 本当にありがとうございました!!