※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

VBA|Keysメソッド(Dictionaryオブジェクト)

Dictionaryオブジェクトは、連想配列や辞書とよばれるオブジェクトのひとつでキー(Key)とアイテム(Item)とよばれる値をセットにして追加(登録)することができることが大きな特徴です。またDictionaryオブジェクトは、複数の便利なメソッドとプロパティをもっています。

こちらの記事では、連想配列(Dictionaryオブジェクト)のメソッドやプロパティの使いかたを紹介しています。

PR

残業はしたくない!PCやExcelのスキルアップであなたのプライベート時間を奪わせない!
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。


詳しくは以下のリンクをクリック

Keysメソッドは連想配列(Dictionaryオブジェクト)のキーを配列にしてかえす

Itemsメソッドは、連想配列(Dictionaryオブジェクト)のキー(Key)を配列データとして返します。
返される配列データを利用して、キー(Key)の取り出しや特定のデータの抽出、計算などの処理ができます。

連想配列(Dictionaryオブジェクト)の大きな特徴は、キー(Key)とアイテム(Item)とよばれるものをセットにして追加(登録)することができる点です。これにより配列などでよく見かけるインデックスでの値の取り出しだけでなく、キー(Key)と呼ばれる文字列を使ってもアイテム(Item)の値を取り出すことができます。

また、連想配列(Dictionaryオブジェクト)はキー(Key)の重複ができないといった特徴も持っているので、この特性を活かした場面に利用できれば、今まで連想配列(Dictionaryオブジェクト)を使ったことがなくても便利さを感じられるでしょう。

※連想配列(Dictionaryオブジェクト)についてはこちら

Keysメソッド構文

連想配列(Dictionaryオブジェクト).Keys

Keyではなく、Keysであることに注意が必要です。

Itemsメソッドの構成要素と引数

要素/引数 必須/任意 説明
オブジェクト
(object)
必須 Dictionaryオブジェクトの名前を指定します。

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から選択させるためのリストを入力規則で設定しておくことで、ドロップダウンリストからこれらの項目を選択する入力方式になります。

入力規則を設定するメリットは、どんな人が入力しても限られた条件の値に制限することができる点です。血液型のセルに誤って関係ない値が入力されることや、記入誤りを防止するために役立ちます。

処理のイメージとしては、以下の画像のとおりです。

Keysメソッドを利用して入力規則にリストを設定する処理イメージ

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文字を超えると、ブックが破損したメッセージが表示されることがあります。入力規則に設定するリストの項目数が多い、各項目の文字数が長い場合は、セル範囲の名前定義などの他の方法で入力規則を設定してください。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

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