スポンサーリンク

【Excel/VBA】ディクショナリに配列を持たせる

excelVBA vba
スポンサーリンク
※当サイトは広告を含みます

VBAのディクショナリが好きです。

ということで、前回はキーと値をディクショナリにセットしていく方法を書きました。

mwkexcel.hatenablog.com

今回はディクショナリの値の部分に複数の値を入れていこうと思います。

たまにやろうとすると、あれ、どうやって配列の値を取り出すんだっけ???って毎回焦るので、この機会に整理。

値に配列を入れるやり方をやってみます。

こんな表があります。

IDがキーで、IDに対する各科目の点数を値として入れていきます。

(1)ディクショナリに配列を入れる

コードです。

①B~E列の数値を配列arrにいったん入れて、

Dim dic As Dictionary
Set dic = New Dictionary     ’①

Dim i As Long, j As Long
With ActiveSheet
 For i = 2 To .Range(“A1”).End(xlDown).Row
  Dim arr(3) As Long      ’②
  For j = 0 To 3
   arr(j) = .Cells(i, j + 2).Value
  Next j
  dic.Add .Cells(i, 1).Value, arr  ’③
 Next i
End With

①ディクショナリの宣言。

参照設定をしているときの書き方です。

参照設定はVBAエディターで「ツール」→「参照設定」から、Microsoft Scripting Runtime にチェックを入れ、「OK」で設定します。

参照設定していないときは

Dim dic As Object
Set dic = CreateObject(“Scripting.Dictionary”)

このように書きます。

②B~E列の数値を配列arrにいったん入れています。

③ディクショナリdicにキー:A列のID、アイテム:配列arrを入れます。

(2)ディクショナリに入れた配列の値の取り出し方法

 dic(キー)(配列インデックス)

と書くと、キー値に対応する配列の指定されたインデックスの値が取り出せます。

もしくは

 変数=dic(キー)

とすると変数にdicのキー値に対応する配列を入れられます。変数はVariantにしておくか、変数() と配列の形にしておきます。

15行目以降にA列のIDに対応する点数を入れていきます。

インデックスを指定して出力する方法です。

Dim key As String
With ActiveSheet
 For i = 15 To 18
  key = .Cells(i, 1).Value
  For j = 0 To 3
   .Cells(i, j + 2).Value = dic(key)(j)   ’①
  Next j
 Next i
End With

①でインデックスを指定して取り出ししています。

いったん配列に入れてから出力する方法です。

 Dim key As String, arr1 As Variant
 With ActiveSheet
 For i = 15 To 18
  key = .Cells(i, 1).Value
  arr1 = dic(key)        ’②
  For j = 0 To 3
   .Cells(i, j + 2).Value = arr1(j)   ’③
  Next j
 Next i
 End With

②でいったん配列arr1に入れます。

③で配列の値を出力しています。

ちなみに、セルの範囲で配列に入れると、二次元配列の形になりちょっとうざいです。

Dim dic As Dictionary
Set dic = New Dictionary

Dim i As Long, j As Long
With ActiveSheet
 For i = 2 To .Range(“A1”).End(xlDown).Row
  Dim v As Variant
  v = .Range(.Cells(i, 2), .Cells(i, 5)).Value
  dic.Add .Cells(i, 1).Value, v
 Next i
End With

Dim arr As Variant
arr = dic(“A01”)

dic(“A01”)(1, 2) こうすると取り出せるけどいまいちうざい。

以上です。

最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました