テーブルから別テーブルへの転記 ① Findメソッドで探して転記
最近Excelで、テーブル間の転記を自動化する依頼を頻繁に受けている。
そこで、これについて思うところを数回に分けて書いてみようと思う。
例えば、↓ こんな感じのテーブルがあるとする。
ここで、↓ このテーブルの情報を、商品コードをキーにしてテーブルAに
反映したい(この場合は、「数量」の情報)。
このケースでは、テーブルAの全コードが更新対象ではないために、
VLOOKUP関数で参照できない。
↓ こうすると、
テーブルBに含まれない「みかん」と「ぶどう」の数量が消えてしまう。
今回は、更新されなかった「みかん」「ぶどう」は残しておきたい。
ここで、昔の自分だったらどうしたかな?と考えた。多分、こんなコードを
書いていたに違いない。
Sub Sample1() Dim myRng As Range Dim r As Range Dim FindResult As Range ' テーブルAの商品コード範囲。 Set myRng = Range(Cells(3, 1), Cells(Rows.Count, 1).End(xlUp)) ' 商品コードの列をループ。列Eから同じコードを探す。 For Each r In myRng Set FindResult = Columns("E:E").Find(What:=r.Value, LookAt:=xlWhole) If Not FindResult Is Nothing Then r.Offset(, 2) = FindResult.Offset(, 1) End If Next End Sub
テーブルを覚えた頃の私なら、こんな感じだと思う。
Sub Sample2() ' 各テープルを変数にセット。 Dim Table_A As ListObject Set Table_A = ActiveSheet.ListObjects(1) Dim Table_B As ListObject Set Table_B = ActiveSheet.ListObjects(2) Dim r As Range Dim FindResult As Range For Each r In Table_A.ListColumns("商品コード").DataBodyRange Set FindResult = Table_B.ListColumns("商品コード").DataBodyRange.Find(r.Value) If Not FindResult Is Nothing Then r.Offset(, 2) = FindResult.Offset(, 1).Value End If Next End Sub
いずれもFindメソッドで同じコードを探して、見つかればOffsetで数量情報を
得るというもの。正しい結果を得られており、この方法でも問題ないと思う。
ただ、テーブルが数万レコードにも及ぶ場合、結構な処理時間を要すること
がある。テーブルの規模によっては、避けた方が良い方法かもしれない。
ということで、次回は連想配列による転記について紹介します。
参考まで。