• ベストアンサー

XL2003:別ブックを検索してデータを拾った後、ヒットしなかったものも別途拾う方法

あるシートにあるデータを別のシートにまとめようとしています。 具体的には、元シートの電話番号をキーに差分シートの電話番号を検索し、ヒットした行の各データを元シートの所定の行に転記するというものです。 元シート・差分シートともに構成は同じです。元シートのC列以外は歯抜けがあることがありますが、キーとなるC列には歯抜けが無く、この列の最後尾をテーブルのEndとして利用することが可能です。 元シート: C列→ユーザ名 E列→電話番号 G列→項目1 H列→項目2 差分シート: C列→ユーザ名 E列→電話番号 G列→項目1 H列→項目2 要するにVLOOKUPのような事を行いたいのですが、続きがありまして・・・ "差分シートにある電話番号が元シートに存在しない場合"、検索に引っかからなかったからといって無視せず、その情報もあわせて取り込みたいのです。 取り込み先の列は上記のVLOOKUPに準じます。 ダイアログを開いてファイルを選択させるまではわかるのですが、その後の手順がどうにもさっぱりで・・・ 添付ファイルにやりたいことを書いてみました。どなたか手順をご教示いただけませんでしょうか。

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

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

質問には、表題に「VBAで処理したい」ことをはっきり書くこと。 (マクロ実行後を見て始めてそれが判る。VLOOKUPなど出して関数の質問かと誤解する) ーー 添付画像は、読者・回答者がテストで使えるよう、質問の中にデータを書いておいてほしい。回答の時再入力しないといけないのは、かなわない。 ーー この質問も、回答者に全てのコードを書いてくれという、丸投げに近いな。 ーーー これは両データをソートして、マッチングのアルゴリズムでやる問題だが、質問者には説明を要するので、初歩的な蚊mmが得やすいやり方でやってみた。 例データ 以下ーは空白セル(画面で左詰されないようにこの回答だけに入れた) 必要最小限の項目データにしている。多数でテストしてみてください。 Sheet1 ユーザー名 - 電話番号 a - 1 b - 2 c - 3 Sheet2 ユーザー名 - 電話番号 - 項目 c      - 4 - x b      - 2 - y d      - 5 - z e      - 6 - w ーー コード ひょ順モジュールに Sub test01() Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") Set sh3 = Worksheets("Sheet3") '-- d1 = sh1.Range("a65536").End(xlUp).Row d2 = sh2.Range("a65536").End(xlUp).Row 'MsgBox d1 'MsgBox d2 k = 2 '--- For i = 2 To d1 sh3.Cells(k, "A") = sh1.Cells(i, "A") sh3.Cells(k, "C") = sh1.Cells(i, "C") k = k + 1 For j = 2 To d2 If sh2.Cells(j, "J") = "" Then If sh2.Cells(j, "A") = sh1.Cells(i, "A") Then If sh2.Cells(j, "C") = sh1.Cells(i, "C") Then sh2.Cells(j, "J") = "Y" Else sh3.Cells(k, "A") = sh2.Cells(j, "A") sh3.Cells(k, "C") = sh2.Cells(j, "C") sh3.Cells(k, "E") = sh2.Cells(j, "E") k = k + 1 sh2.Cells(j, "J") = "Y" End If Else End If End If Next j Next i '--- For j = 2 To d2 If sh2.Cells(j, "J") = "Y" Then Else sh3.Cells(k, "A") = sh2.Cells(j, "A") sh3.Cells(k, "C") = sh2.Cells(j, "C") sh3.Cells(k, "A") = sh2.Cells(j, "A") sh3.Cells(k, "E") = sh2.Cells(j, "E") k = k + 1 End If Next j End Sub 項目の代入は、手を抜いて、最小限にしてあるので、補ってください。 ーーー Sheet3 ユーザー名 - 電話番号 - 項目 a - 1 - b - 2 - c - 3 - c - 4 - x d - 5 - z e - 6 - w

kanpan_man
質問者

お礼

御礼が遅れました。 いろいろご指摘、およびサンプルスクリプトありがとうございました。 いただいたものをいじって、現在ブック間でのデータ移動に成功してます。 ○投げhご指摘のとおりでお恥ずかしい限り、もっと精進してこちらで回答できるくらいまで勉強します。 ありがとうございました。

その他の回答 (1)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

差分シートを順に頭から処理していくとして 前処理:元シートの最終行+1を取得して追加行とする      その他、元シート.差分シートへの参照を設定 1)処理中の差分シートのキー(ユーザ名で良いのかな?)が元シートに  あるかどうかをチェック。  すでにある場合は、以下をパスして次の行へ 2)未登録の場合は、元シートの追加行へ新しいデータをコピー  追加行のインデックスを+1 以上のループを差分シートのデータが終わるまで繰り返す。 後処理:必要に応じて名簿をソートするなどして、元シートを保存するなど。

kanpan_man
質問者

お礼

ありがとうございました。 いろんな切り口があるかとは思いましたが、この方法でまず電話番号を拾ってしまってから最後に関連項目を拾う形式のほうがすっきりしていますね。 週末に試してみたいと思います。

関連するQ&A