テーブルから別テーブルへの転記 ① Findメソッドで探して転記

最近Excelで、テーブル間の転記を自動化する依頼を頻繁に受けている。
そこで、これについて思うところを数回に分けて書いてみようと思う。
f:id:Infoment:20210712221337p:plain

例えば、↓ こんな感じのテーブルがあるとする。
f:id:Infoment:20210712221433p:plain

ここで、↓ このテーブルの情報を、商品コードをキーにしてテーブルAに
反映したい(この場合は、「数量」の情報)。
f:id:Infoment:20210712221545p:plain

このケースでは、テーブルAの全コードが更新対象ではないために、
VLOOKUP関数で参照できない。
↓ こうすると、
f:id:Infoment:20210712222012p:plain

テーブル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で数量情報を
得るというもの。正しい結果を得られており、この方法でも問題ないと思う。
ただ、テーブルが数万レコードにも及ぶ場合、結構な処理時間を要すること
がある。テーブルの規模によっては、避けた方が良い方法かもしれない。

ということで、次回は連想配列による転記について紹介します。

参考まで。