テーブルから別テーブルへの転記 ③ 配列と連想配列の組合せ ~その2.全部転記~

前回はテーブル間の転記について、配列と連想配列の組合せによる転記を紹介した。
infoment.hatenablog.com
前回までは指定列をキーに、もう一つの指定列を転記対象として処理していた。
つまり、転記対象が一列のみであった。

ということで今回は、テーブルをガバッと全部転記することに挑戦する。
f:id:Infoment:20210802064052p:plain

といっても今回は、前回作成した短列コピーのモジュールをループで回すだけ
だったりする。

↓ これだけ。

' テーブル間のデータ受け渡し。
' 各テーブルの指定列をkeyに、転記先テーブルにある全項目について転記する。
' ※転記先テーブルにあって転記元テーブルに無いレコードは保持される。
Function Transcription_Tb2Tb_All(src_tb As ListObject, _
                                 dst_tb As ListObject, _
                                 src_key As Variant) As Excel.ListObject

    Dim ItemLabel As Variant
    Dim SrcItem As Variant
        For Each ItemLabel In src_tb.HeaderRowRange
            SrcItem = ItemLabel.Value
            If SrcItem <> src_key Then
                Transcription_Tb2Tb src_tb, dst_tb, src_key, SrcItem
            End If
        Next
    
    Set Transcription_Tb2Tb_All = dst_tb

End Function

この方式の利点は、

  • レコードの並び順不問(各レコードを一旦、連想配列に格納しているので)
  • ラベル列の並び順不問(ラベル名称で列を特定しているので)

であること。転記元と転記先のテーブルでフォーマットが違っていても、
これなら気にせず転記できる。
※ただし転記元のキー情報が、転記元で複数回登場しないことが条件。

例えば今回はテーブルCをテーブルAに、コード情報をキーに転記してみる。
f:id:Infoment:20210802065136p:plain
※御覧のとおり行も列も、テーブルAとテーブルCで並び順を変えてある。


それでは、動作を確認してみよう。

Sub test4()

    Transcription_Tb2Tb_All src_tb:=ActiveSheet.ListObjects(3), _
                            dst_tb:=ActiveSheet.ListObjects(1), _
                            src_key:="コード"

End Sub

結果がこちら。
f:id:Infoment:20210802065635g:plain

行や列の並びが転記元と転記先で違っていても、正しく転記できたようだ。
これはこれで、それなりに使えそうだ。でも転記元に新たなキーを含む
レコードが追加された場合に、今回までのマクロは対応できていない。

ということで次回は、今回の結果をさらに機能拡張して紹介します。

参考まで。