テーブルから別テーブルへの転記 ③ 配列と連想配列の組合せ ~その9.使用例:其の一~

前々回に、テーブル間のデータ転記をまとめたクラスモジュールを作成した。
(正確には、数学の「集合」を扱うクラスに押し込んだ)。
infoment.hatenablog.com
今回は使用例を一つ、ご紹介。
f:id:Infoment:20210810231753p:plain

例えば、1年1組と1年2組で国語と数学のテストがあって、その成績を
一つの表にまとめるとする。
f:id:Infoment:20210810233118p:plain

国語と数学の先生、あまり交流がないのか、成績表の書式がバラバラだ。

  1. 国語は点数で昇順に並んでいるが、数学は出席番号で昇順の並び。
  2. 国語は「学年」の情報はあるが、「クラス」の情報がない。
    (数学は、その逆になる)。
  3. 列の並びが、国語と数学で揃っていない。

2教科で2クラスなら、まだ手作業する気になるかもしれない。しかし、
9教科で8クラスあって、一クラス30人いるとなると、毎回手作業は
避けたいところ。

ということで、冒頭のクラスモジュールを活用してみる。

まず、集約先テーブルを準備する。
f:id:Infoment:20210810233727p:plain

集約するためのマクロがこちら。

Sub test()
    ' 集合クラス。
    Dim MS As VBAProject.MathSet
    Set MS = New VBAProject.MathSet
    
    ' 各テーブルを変数にセット。
    Dim Tb(4) As ListObject
    Set Tb(0) = ActiveSheet.ListObjects("tbまとめ")
    Set Tb(1) = ActiveSheet.ListObjects("tb国語_1_1")
    Set Tb(2) = ActiveSheet.ListObjects("tb国語_1_2")
    Set Tb(3) = ActiveSheet.ListObjects("tb数学_1_1")
    Set Tb(4) = ActiveSheet.ListObjects("tb数学_1_2")
        
    Dim i As Long
        ' 学生番号をキーに、各教科の結果を転記する。
        For i = 1 To 4
            MS.Transcription_Tb2Tb_All Tb(i), Tb(0), "学生番号", , True
        Next

End Sub

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

意図したとおり、4つの表を1つの表にまとめることができた。
テーブルの名前次第では、もっと短いコードにもできるだろう。

とはいえ、これは最終手段であって、まずやるべきは
「国語と数学の先生の対話と、成績表書式の共有」
に違いない。

次回、もう一つ別の例を紹介します。

参考まで。