Collectionオブジェクトを用いて作成した独自のオブジェクトは、Addメソッド
による要素追加時に指定したKeyを用いて各要素にアクセスすることができまし
た。インデックスだけでなく、指定した任意の文字列で、データにアクセスで
きることを応用し、以下のサンプルでは科目マスターをもとにして複数シート上
のデータを集計します。
例 Dim MyCollect as New Collection
MyCollect.Add 10, "KAMOKU1001"'
とすれば、それ以降では、
MyCollect("KAMOKU1001")
で、10を取得できる
具体的には、経理データなどで言えば、勘定科目マスターに登録された各勘定科
目をKeyとし、対応する要素として格納されたインデックス番号を割り出し、この
番号をインデックスとして持つ配列に金額をたしこんでいきます。
なお、集計結果はさまざまな損益計算書に対応できるよう、集計先シートで勘定
科目コードが入力されたセルを検索し、その3列目に金額を書き込むようにして
います。必要に応じてマスターシートと集計先シートを分けてご利用ください。
(前提)・マスター兼集計先ワークシート(シート名:科目マスター)
※1列目:勘定科目コード、2列目:勘定科目名(使用しない)
3列目:集計値格納用の空欄、1行目は項目行
・ワークシート(Sheet1〜Sheet3)に1列目を勘定科目、2列目を金
額データ
※各シート1行目は項目行とする
'================================================================
'================================================================
Type Shukei
CD As String '勘定科目コード
Amount As Currency '金額
End Type
Sub MyProc()
Dim LastRow As Long
Dim MyCollect As New Collection
Dim MyVar() As Shukei
Dim Temp As Integer
Dim Rng As Range
Dim i As Integer, j As Integer, k As Long, l As Long
'マスターシート最終行取得
LastRow = Sheets("科目マスター").Range("A65536").End(xlUp).Row
'配列の最宣言
ReDim MyVar(2 To LastRow)
'================================================================
'マスターデータ(コード)をユーザ定義型配列に格納
'================================================================
With MyCollect
For i = 2 To LastRow
MyVar(i).CD = Sheets("科目マスター").Cells(i, 1)
'マスターデータ件数分コレクションに要素を追加(
'コード番号をKeyの一部としている)
.Add i, "Kamoku" & Sheets("科目マスター").Cells(i, 1).Value
Next i
'================================================================
'集計
'================================================================
For j = 1 To 3 'シート数分ループ
With Sheets("Sheet" & j)
'項目行をのぞいて明細データ件数分ループ
For k = 2 To .Range("A65536").End(xlUp).Row
'対象明細に含まれるコードをキーとしてコレクションの
'要素に格納された配列検索用インデックスを取得
Temp = CInt(MyCollect("Kamoku" & .Cells(k, 1)))
'インデックスを指定してユーザ定義型配列に金額を足しこむ
MyVar(Temp).Amount = _
MyVar(Temp).Amount + .Cells(k, 2).Value
Next k
End With
Next j
'================================================================
集計先シートへの金額書き込み
'================================================================
'配列の下限から上限までループ
For l = LBound(MyVar) To UBound(MyVar)
If MyVar(l).Amount <> 0 Then
'対応するコードを持つセルを検索し、3列目に金額を書き込む
Set Rng = Sheets("科目マスター").UsedRange. _
Find(MyVar(l).CD)
End If
If Not Rng Is Nothing Then _
Rng.Offset(, 2).Value = MyVar(l).Amount
End If
Next l
End With
End Sub
'================================================================
'================================================================
ここではコレクションの実用的なサンプルとして複数シートのデータの集計を
行いました。実際には複数シートの集計の場合でも、ピボットテーブルを使う
など、他の方法もあります。
|