Dictionaryオブジェクトは、連想配列や辞書とよばれるオブジェクトのひとつでキー(Key)とアイテム(Item)とよばれる値をセットにして追加(登録)することができることが大きな特徴です。またDictionaryオブジェクトは、複数の便利なメソッドとプロパティをもっています。
こちらの記事では、連想配列(Dictionaryオブジェクト)のメソッドやプロパティの使いかたを紹介しています。
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
Keysメソッドは連想配列(Dictionaryオブジェクト)のキーを配列にしてかえす
Itemsメソッドは、連想配列(Dictionaryオブジェクト)のキー(Key)を配列データとして返します。
返される配列データを利用して、キー(Key)の取り出しや特定のデータの抽出、計算などの処理ができます。
連想配列(Dictionaryオブジェクト)の大きな特徴は、キー(Key)とアイテム(Item)とよばれるものをセットにして追加(登録)することができる点です。これにより配列などでよく見かけるインデックスでの値の取り出しだけでなく、キー(Key)と呼ばれる文字列を使ってもアイテム(Item)の値を取り出すことができます。
また、連想配列(Dictionaryオブジェクト)はキー(Key)の重複ができないといった特徴も持っているので、この特性を活かした場面に利用できれば、今まで連想配列(Dictionaryオブジェクト)を使ったことがなくても便利さを感じられるでしょう。
※連想配列(Dictionaryオブジェクト)についてはこちら
Keysメソッド構文
Keysメソッドの構文
連想配列(Dictionaryオブジェクト).Keys
Keyではなく、Keysであることに注意が必要です。
Itemsメソッドの構成要素と引数
Keysメソッドの構成要素と引数
要素/引数 | 必須/任意 | 説明 |
---|---|---|
オブジェクト (object) |
必須 | Dictionaryオブジェクトの名前を指定します。 |
Keysメソッドで返される結果
Dictionaryオブジェクトに登録されているキー(Key)の配列データを返します。
Dictionaryオブジェクトのキー(Key)をまとめて返すことができるよ。
Keysメソッドをつかったサンプルマクロ
連想配列(Dictionaryオブジェクト)のKeysメソッドをつかったサンプルマクロを紹介します。
Keysメソッドでキー(Key)の取り出しや、配列変数への代入などのシンプルなものから、特定の文字列を含むキー(Key)の抽出など、使いかたの参考例としてご覧ください。
KeysメソッドでDictionaryオブジェクトのアイテムを取り出す
以下のマクロは、Keysメソッドを利用して連想配列(Dictionaryオブジェクト)である「MyDic」にキー(Key)を取り出します。また、Keysメソッドはキー(Key)を配列データとして返すため、その配列を変数に代入して値の取り出しも行っています。
サンプルコード
Option Explicit
Sub Dic_study1() 'DictionaryオブジェクトのKeysメソッドはキー(Key)を配列データにする
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic As Dictionary
Set MyDic = New Dictionary
'Addメソッドでキーとアイテムを要素として追加する
MyDic.Add "クワッス", "あお"
MyDic.Add "ホゲータ", "あか"
MyDic.Add "ニャオハ", "みどり"
'MyDicのキー(key)の配列データを取り出す
Debug.Print Join(MyDic.Keys, " ・ ") '実行結果>>>クワッス ・ ホゲータ ・ ニャオハ
'Addメソッドでさらにキーとアイテムを要素として追加する
MyDic.Add "メッソン", "あお"
MyDic.Add "ヒバニー", "あか"
MyDic.Add "サルノリ", "みどり"
'MyDicのキー(key)の配列データを代入する変数を宣言する
Dim DicKeys As Variant
'keysメソッドを利用して配列変数にデータを代入することもできる
DicKeys = MyDic.Keys
'配列データを取り出す
Debug.Print Join(DicKeys, " ・ ") '実行結果>>>クワッス ・ ホゲータ ・ ニャオハ ・ メッソン ・ ヒバニー ・ サルノリ
'keysメソッドで添え字にインデックスを指定すると個別にキー(Key)を取り出す
Debug.Print MyDic.Keys(1) '実行結果>>>ホゲータ
Debug.Print MyDic.Keys(3) '実行結果>>>メッソン
Debug.Print MyDic.Keys(5) '実行結果>>>サルノリ
End Sub
1度目のDebug.Printでは、Keysメソッドを利用してキー(Key)に含まれる値を取り出せました。2度目のDebug.Printでは、Keysメソッドを変数「DicKeys」に代入したあとで値を取り出しています。また、Keysメソッドでインデックスを添え字にすると個別のキー(Key)を取り出すこともできます。
Tips
実行結果はJoin関数を使って配列データをまとめて取り出しているよ。
実行結果
クワッス ・ ホゲータ ・ ニャオハ
クワッス ・ ホゲータ ・ ニャオハ ・ メッソン ・ ヒバニー ・ サルノリ
ホゲータ
メッソン
サルノリ
Keysメソッドを利用した1度目のDebug.Printでは3つのキー(Key)が取り出せました。その後で要素を追加してあらためてKeysメソッドの配列データを変数に代入した2度目のDebug.Printでは、6つアイテム(Key)が取り出せました。また、MyDic.Keys(1)などのインデックスを添え字にしたときのDebug.Printは個別のキー(Key)が返ってきます。
Keysメソッドで条件にあう要素を取り出す
以下のマクロは、連想配列(Dictionaryオブジェクト)である「MyDic2」に登録されているキー(Key)とアイテム(Item)のうち、指定した条件にあったキー(Key)の要素を取り出します。条件の指定にはKeysメソッドを利用しています。
サンプルコード
Option Explicit
Sub Dic_study2() 'Itemsメソッドで条件にあうキー(Key)から要素を取り出す
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic2 As Dictionary
Set MyDic2 = New Dictionary
'Addメソッドでキーとアイテムを要素として追加する
MyDic2.Add "クワッス", "あお"
MyDic2.Add "ホゲータ", "あか"
MyDic2.Add "ニャオハ", "みどり"
MyDic2.Add "メッソン", "あお"
MyDic2.Add "ヒバニー", "あか"
MyDic2.Add "サルノリ", "みどり"
MyDic2.Add "アシマリ", "あお"
MyDic2.Add "ニャビー", "あか"
MyDic2.Add "モクロー", "みどり"
'くり返し用変数の宣言
Dim i As Integer
'MyDic2のキー(Key)の数だけくり返す
For i = 0 To UBound(MyDic2.Keys) 'Keysメソッドは配列を返すためUBound関数を利用できる
'Keysメソッドを利用してキー(Key)にア,カ,サ,タ,ナのいずれかが含まれるものを抽出
If MyDic2.Keys(i) Like "*[ア,カ,サ,タ,ナ]*" Then
Debug.Print MyDic2.Keys(i) & " : " & MyDic2(MyDic2.Keys(i)) '条件にあう要素を取り出す
End If
Next i
End Sub
MyDic2のキー(Key)のうち、ア,カ,サ,タ,ナのどれかの文字を含む要素を取り出す処理です。サンプルの場合、すべてのキー(Key)の中で条件に一致するのは”ホゲータ“、”サルノリ”、”アシマリ”の3つなので、それらを抜き出すことができれば成功です。
Tips
くり返す回数を指定している方法として、UBound関数はキー(Key)のインデックスの最大値を返します。サンプルのケースではキー(Key)の要素数は9つなので、最大インデックスは8になります。
条件判定で利用しているLike演算子は、文字列を比較をするときに部分一致の判定を可能にするものです。サンプルのケースではキー(Key)に「ア,カ,サ,タ,ナ」のいずれかが含まれるときは処理を実行することになります。
Ubound関数や添え字を使うなど、Keysメソッドを配列として利用してみたよ。
実行結果
ホゲータ : あか
サルノリ : みどり
アシマリ : あお
キー(Key)のうち、「ア,カ,サ,タ,ナ」がいずれかが含まれる項目を取り出すことができました。
Dictionaryオブジェクトの条件にあうキー(Key)から項目を取り出したよ。
Keysメソッドを利用してセルの入力規則のリストに設定する
こちらのマクロは、Keysメソッドで返される配列データをつかって、セルの入力規則を設定しています。
セルの入力規則は、設定したセルに入力する条件を指定するもので、例えば、シートのA1セルに血液型を入力をしてもらいたい場合、A、B、O、ABから選択させるためのリストを入力規則で設定しておくことで、ドロップダウンリストからこれらの項目を選択する入力方式になります。
入力規則を設定するメリットは、どんな人が入力しても限られた条件の値に制限することができる点です。血液型のセルに誤って関係ない値が入力されることや、記入誤りを防止するために役立ちます。
処理のイメージとしては、以下の画像のとおりです。
F列の値をキー(Key)、G列のアイテム(Item)として、連想配列(Dictionaryオブジェクト)である「MyDic3」に登録していきます。シートのF列には”クワッス“が2つあるので、おなじキー(Key)となってしまいます。Dictionaryオブジェクトはキー(Key)が重複されるとエラーになるため、Existsメソッドで判定して未登録のキー(Key)の場合のみ追加する処理にします。
Dictionaryオブジェクトにすべてのキー(Key)とアイテム(Item)が登録されたら、Keysメソッドを利用してB列3行目から7行目のセルに入力規則のリストを設定します。
サンプルコード
Option Explicit
Sub Dic_study3() 'Keysメソッドを使ってセルの入力規則のリストに設定する
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic3 As Dictionary
Set MyDic3 = New Dictionary
'Dictionaryオブジェクト「MyDic3」にセルの値を追加する
Dim i As Integer 'くり返し用変数の宣言
With ThisWorkbook.Worksheets("サンプル")
For i = 3 To .Cells(Rows.Count, 6).End(xlUp).Row 'F列の最終行まで
If MyDic3.Exists(.Cells(i, 6).Value) = False Then 'Existsメソッドで重複エラー回避
'AddメソッドでDictionaryオブジェクトにキー(Key)とアイテム(Item)を追加する
MyDic3.Add .Cells(i, 6).Value, .Cells(i, 7).Value
End If
Next i
'セルの入力規則にDictionaryオブジェクト「MyDic3」のキー(Key)を設定する
With .Range("B3:B7").Validation
.Delete '既に設定がある場合は一旦、
.Add Type:=xlValidateList, _
Operator:=xlEqual, _
Formula1:=Join(MyDic3.Keys, ",") 'Keysメソッド
End With
End With
End Sub
連想配列(Dictionaryオブジェクト)の「MyDic3」にシートのF列の内容を登録していきます。このとき、Existsメソッドでキーが既に登録されているものであるかの判定をしています。
「MyDic3」にキー(Key)とアイテム(Item)が登録されたら、いよいよ入力規則の指定になりますが、入力規則の設定には、ValidationオブジェクトのFormula1プロパティに、Keysメソッドを利用して「MyDic3」のキー(Key)の配列データを指定しています。
Join関数を使ってKeysメソッドで返される値をカンマで区切るように指定してね。
それでは、入力規則にKeysメソッドで返される配列データが設定されているか確認してみましょう。
実行結果
セルB3からB7の入力規則に「MyDic3」のキー(Key)である、「クワッス、ホゲータ、ニャオハ、ニャローテ、ラウドボーン、アシマリ、サルノリ」の7つのキー(Key)がリストで設定されました。
キー(Key)は同じものが登録できないので、重複しない入力規則リストが作れるね。
Tips
セルに入力規則リストを設定するときにリストとして指定する内容が255文字を超えると、ブックが破損したメッセージが表示されることがあります。入力規則に設定するリストの項目数が多い、各項目の文字数が長い場合は、セル範囲の名前定義などの他の方法で入力規則を設定してください。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント