その1では、必要な行のデータを転記する例でした。次は、2つの表から1つの表を作る方法を説明します。
その1で作った配列は、そのまま引数arGouとして使う。セルの範囲を指定をする引数rAddressは、受講台帳のデータ範囲を指定する。変数名のarやrは、arはArray配列、rはRangeの意味で付けてます。
'合格者の配列と受講台帳のセル範囲で照合する
Function myAddr(arGou, rAddress As Range)
Dim ar() 'Rangeの範囲のデータを入れる動的配列
ar = rAddress 'こちらは全部の値をチェックする
Dim i As Integer, j As Integer, k As Integer
j = 1 'For文の中で使い始めで0だと飛ぶため。
ReDim arr(1 To UBound(ar, 1), 1 To UBound(ar, 2)) 'データ以上になることは無い
Dim iii As Integer 'arrの行番号用、列はjを使う
For i = 1 To UBound(ar, 1) '2次元配列の1番目、行。1から始めるのはrがRangeだから
For k = 1 To UBound(ar, 1) 'iの各行に全arGouの名前と照合するために繰り返す
If arGou(i, 2) = ar(k, 4) Then 'arGouの2列目とarの4列を比較
iii = iii + 1 'スタートが1なので先に1にしておく
For j = 1 To UBound(ar, 2) '2次元配列の2番目、列
arr(iii, j) = ar(k, j) 'iではなくk
Next
End If
Next
Next
myAddr = arr
End Function
'=myAddr(myGoukaku(テーブル3),テーブル12)
その1のmyGoukakuで合格者だけの2次元配列、myAddrで降格者だけの受講台帳の2次元配列を作ることができた。では、この2つの2次元配列を使って合体させるのがmyTennkiです。
'2つの2次元配列から転移目的の関数の完成です
Function myTennki(arTest, arAddress)
Dim i As Integer, j As Integer, k As Integer
If UBound(arTest, 1) > UBound(arAddress, 1) Then
i = UBound(arTest, 1)
Else
i = UBound(arAddress, 1)
End If
If UBound(arTest, 2) > UBound(arAddress, 2) Then
j = UBound(arTest, 2)
Else
j = UBound(arAddress, 2)
End If
ReDim arr(1 To i, 1 To j) '2つの引数の最大でメモリを確保
j = 1 'For文の中で使い始めで0だと飛ぶため。
Dim iii As Integer 'arrの行番号用、列はjを使う
For i = 1 To UBound(arTest, 1) 'rTestの方の行処理
For k = 1 To UBound(arAddress, 1) 'rAddreの方の行の処理
If arTest(i, 2) = arAddress(k, 4) Then '名前が一致するか
iii = iii + 1 'スタートが1なので先に1にしておく
arr(iii, 1) = arAddress(i, 2) 'クラス番号
arr(iii, 2) = arAddress(i, 3) '出席番号
arr(iii, 3) = arAddress(i, 4) '名前
arr(iii, 4) = arTest(k, 3) '設備
arr(iii, 5) = arTest(k, 4) '取扱
arr(iii, 6) = arTest(k, 5) '法規
End If
If VBA.IsEmpty(arTest(i, 1)) Then Exit For
If VBA.IsEmpty(arAddress(k, 1)) Then Exit For
Next
Next
myTennki = arr
End Function
'myTennki(myGoukaku(rTest), myAddr(myGoukaku(rTest), rAddress))
実際に使う時は、以下のmyKansei関数を使います。引数は、2つの表の範囲を指定するだけです。今まで、作った関数を内部で使ってます。これをラッパー関数という。ラッピンですね。包装です。使いやすくするのが目的です。
内部で使っているmyTennkiやmyAddrはPrivate Functionにしてセルの入力時に使えないようにします。myKanseiだけ使えればいいので問題ありません。
'使いやすくする。ラッパー関数。2つのテーブルを引数にする
Function myKansei(rTest As Range, rAddress As Range)
myKansei = myTennki(myGoukaku(rTest), myAddr(myGoukaku(rTest), rAddress))
End Function
2つの表のデータ作成用マクロは その1にあります。
エクセルマクロとは、ExcelオブジェクトとVBA仕様です。こうした関数は、ほぼVBAの知識だけでできます。