Dictionaryオブジェクトは、連想配列や辞書とよばれるオブジェクトのひとつでキー(Key)とアイテム(Item)とよばれる値をセットにして追加(登録)することができることが大きな特徴です。またDictionaryオブジェクトは、複数の便利なメソッドとプロパティをもっています。
こちらの記事では、連想配列(Dictionaryオブジェクト)のメソッドやプロパティの使いかたを紹介しています。
スクール選びにお悩みですか?
動画編集、ロボット、AIとテクノロジーの進化が目まぐるしい時代だからこそ身につけるなら即戦力のスキル。
豊富なコースが選べて、独自開発されたカリキュラムの採用で業界有数の学習継続率!
さらにスキル習得だけじゃない。卒業後の転職や副業まで激アツなサポートが無料!!
Keyプロパティは連想配列(Dictionaryオブジェクト)のキーの値を更新する
VBAの連想配列(Dictionaryオブジェクト)のKeyプロパティは、ひとことで言えばキー(Key)の書きかえです。
連想配列(Dictionaryオブジェクト)に登録されている要素のキー(Key)に対して新しいキー(Key)を設定します。プログラミングでは変数を書きかえること場面が多く登場しますが、Keyプロパティは、変数の書きかえのDictionaryオブジェクトのキー(Key)版だと言えるので、すでに設定されているキー(Key)の値を他の値に更新することができます。
VBAの連想配列(Dictionaryオブジェクト)のプロパティやメソッドには、このKeyプロパティと似たものとしてKeysメソッドがありますが、こちらのKeyプロパティは単数形の「Key」と書くところに注意が必要です。
Keyプロパティの引数にはキー(Key)の値を指定しますが、登録されていないキー(Key)の値が指定された場合はエラーが発生します。
VBAの連想配列(Dictionaryオブジェクト)は複数のデータを登録ができることから、配列のようにデータリストをあつかうことができるオブジェクトです。最大の特徴は、キー(Key)とアイテム(Item)のペア単位で要素を管理し、キー(Key)をつかってアイテム(Item)を取り出すことができます。また要素は追加・変更・抽出・削除などが可能です。
VBAの連想配列(Dictionaryオブジェクト)については、ほかの記事で紹介しています。連想配列(Dictionaryオブジェクト)の詳しい特徴や基本的な使い方、具体的な使用方法などについて知りたい人は以下のリンクをクリックして記事をご覧になってください。
※連想配列(Dictionaryオブジェクト)についてはこちら
Keyプロパティ構文
Keyプロパティの構文
連想配列(Dictionaryオブジェクト).Key(登録されているキー(Key))= 新しいキー(NewKey)
すでに登録されているキー(Key)の値を新しい値(NewKey)に更新します。
Dictionaryオブジェクトに登録されていないキーを指定した場合は実行時エラーが発生します。
Keyプロパティの構成要素と引数
Keyプロパティの構成要素と引数
要素/引数 | 必須/任意 | 説明 |
---|---|---|
オブジェクト (object) |
必須 | Dictionaryオブジェクトの名前を指定します。 |
キー (Key) |
必須 | Dictionaryオブジェクトに登録されているキー(Key)の値を指定します。 |
新しい値 (NewKey) |
必須 | 新しいキー(NewKey)の値です。 キー(Key)が未登録の場合は実行時エラーが発生します。 |
Dictionaryオブジェクトのキー(Key)を新しい値にしてくれるよ。
Keyプロパティをつかったサンプルマクロ
ここでは、連想配列(Dictionaryオブジェクト)のKeyプロパティをつかったサンプルマクロのVBAコードを紹介します。
Keyプロパティの基本的な使用例として、もっともシンプルなキー(Key)の値の変更のほか、Dictionaryオブジェクトのキー(Key)をまとめて書きかえる方法や未登録のキー(Key)を指定した場合のエラー動作をサンプルマクロのVBAコードとともに見ていきます。
KeyプロパティでDictionaryオブジェクトのキー(Key)を変更する
以下のマクロは、連想配列(Dictionaryオブジェクト)である「MyDic」に登録されているキー(Key)の値を新しい値に変更します。
VBAサンプルコード
Option Explicit
Sub Dic_study1() 'DictionaryオブジェクトのKeyプロパティはキーを新しい値に設定します。
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic As Dictionary
Set MyDic = New Dictionary'Addメソッドで要素を追加する(要素は左からキー、アイテムの順番で指定する)
MyDic.Add "クワッス", "あお" '「クワッス」がキー、「あお」がアイテムになる
MyDic.Add "ホゲータ", "あか"
MyDic.Add "ニャオハ", "みどり"
'Keyプロパティを使ってDictionaryオブジェクトのKeyに新しい値を設定する。
MyDic.Key("ホゲータ") = "アチゲータ"
'Keysメソッドを利用してすべてのキーを取り出す
Debug.Print Join(MyDic.Keys, ",")
End Sub
宣言したDictionaryオブジェクトである「MyDic」にAddメソッドで3つの要素を追加しています。その後、Keyプロパティをつかってキー(Key)”ホゲータ”を”アチゲータ”に変更してみます。
サンプルマクロの実行結果をみていきましょう。
マクロの実行結果
クワッス,アチゲータ,ニャオハ
出力結果は、Join関数とKeysメソッドで「MyDic」のキーをまとめて取り出しています。Addメソッドで「MyDic」に登録された3つのキー(Key)のうち、“ホゲータ”の値が”アチゲータ”がKeyプロパティの処理によって変更されました。
KeyプロパティはDictionaryオブジェクトのキー(Key)の変更ができるんだね。
Keyプロパティは存在しないキー(Key)を引数にするとエラーになる
以下のマクロは、連想配列(Dictionaryオブジェクト)である「MyDic2」のキー(Key)を新しい値に変更できるか試してみます。ただし、前項のマクロとの違いは、Keyプロパティの引数に指定した値は「MyDic2」に存在しないキー(Key)となっています。
VBAサンプルコード
Option Explicit
Sub Dic_study2() 'DictionaryオブジェクトのKeyプロパティはキーを新しい値に設定します。
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic2 As Dictionary
Set MyDic2 = New Dictionary
'Addメソッドで要素を追加する(要素は左からキー、アイテムの順番で指定する)
MyDic2.Add "クワッス", "あお" '「クワッス」がキー、「あお」がアイテムになる
MyDic2.Add "ホゲータ", "あか"
MyDic2.Add "ニャオハ", "みどり"
'Keyプロパティを使ってDictionaryオブジェクトのKeyに新しい値を設定する。
MyDic2.Key("アチゲータ") = "ラウドボーン" '存在しないキーを指定すると実行時エラーが発生します。
End Sub
宣言したDictionaryオブジェクトである「MyDic2」にAddメソッドで3つの要素を追加しています。その後、Keyプロパティを使ってキー(Key)を変更する内容になっています。しかし、「MyDic2」には”アチゲータ”というキー(Key)は登録されていません。
KeyプロパティのVBAコード
MyDic2.Key(“アチゲータ“) = “ラウドボーン“
書きかえまえのキー(Key)である値に”アチゲータ“を指定し、新しいキー(Key)の値である”ラウドボーン“をイコールの右側(右辺)に書きます。
サンプルマクロの実行結果をみていきましょう。
マクロの実行結果
上の画像のように実行時エラーが発生します。
サンプルマクロのように、連想配列(Dictionaryオブジェクト)に登録されている要素の数が少ないものであれば記憶していることもあるかもしれませんが、マクロを利用するときにそんなことを事前に意識しておかなければならないのは使い勝手が良いものとは言えませんよね。
Keyプロパティで存在しないキー(Key)を指定するとエラーになるんだね。
Keyプロパティでキー(Key)を指定する場合は、その連想配列(Dictionaryオブジェクト)にキー(Key)が登録されていない場合にエラーがでるため、このエラーを回避するには、キー(Key)が登録されていることを事前に判定することが必要であるということがわかりました。
それでは、次項でKeyプロパティを実行する前に指定したキーが連想配列(Dictionaryオブジェクト)に存在するかの判定処理をいれたマクロのVBAコードを紹介します。
Keyプロパティの実行前にキー(Key)の存在を判定する
こちらのサンプルマクロでは、連想配列(Dictionaryオブジェクト)である「MyDic3」に登録されているキー(Key)を新しい値に変更します。ただし、Keyプロパティの引数に「MyDic3」に登録されていないキー(Key)を指定すると実行時エラーが発生してしまいます。
もう1つ気をつけておくべき点として、新しくキー(Key)に設定する値が「MyDic3」にすでに登録されている場合も実行時エラーが発生します。つまり、Keyプロパティを使う上でエラーの発生を予防するには、Keyプロパティの引数に指定する値が存在するのかを判定しておくことが重要になってきます。
それでは、Keyプロパティの実行前に存在の判定をする処理を含めたマクロを紹介します。
VBAサンプルコード
Option Explicit
Sub Dic_study3() 'DictionaryオブジェクトのKeyプロパティはキーを新しい値に設定します。
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic3 As Dictionary
Set MyDic3 = New Dictionary
'Addメソッドで要素を追加する(要素は左からキー、アイテムの順番で指定する)
MyDic3.Add "クワッス", "あお" '「クワッス」がキー、「あお」がアイテムになる
MyDic3.Add "ホゲータ", "あか"
MyDic3.Add "ニャオハ", "みどり"
'Keyプロパティを使ってDictionaryオブジェクトのKeyに新しい値を設定する。
Dim ExistingKey As String
ExistingKey = Application.InputBox("変更したいキー(Key)を指定してください。", "既存キーを指定", Type:=2)
'Existsで指定されたキーがDictionaryオブジェクトに存在するかをチェックする
If MyDic3.Exists(ExistingKey) Then '有りの場合
Dim NewKey As String
NewKey = Application.InputBox("新しいキー(Key)を指定してください。", "新しいキーを指定", Type:=2)
Do While MyDic3.Exists(NewKey)
NewKey = Application.InputBox _(NewKey & " はすでに登録されているキーです。" & vbCrLf & "ほかの値を指定してください。",ExistingKey & " を新しいキーに変更",Type:=2)
Loop
MyDic3.Key(ExistingKey) = NewKey
Else'無しの場合
MsgBox "指定されたキーは存在しません。", vbOKOnly + vbCritical, "入力値不正通知"
End If
'Keysメソッドを利用してすべてのキーを取り出す
Debug.Print Join(MyDic3.Keys, ",")
End Sub
これまでと同じようにDictionaryオブジェクトである「MyDic3」を宣言したあと、3つの要素を登録しています。
文字列型の変数「ExistingKey」には変更する前のキー(Key)を代入するので、「MyDic3」に登録されている3つのキー(Key)「クワッス、ホゲータ、ニャオハ」のうちのいずれかを選択します。これらのキー(Key)ではない値がKeyプロパティに指定された場合はエラーが発生します。
一方、変数「NewKey」は、変更した後のキー(Key)を代入するので、こちらは「MyDic3」に登録されていないキー(Key)を指定しないとエラーが発生するので、この2つの処理を実行する前に存在判定をする処理を入れています。
Keyプロパティでエラーが発生しないようにした2つのポイント
- 登録されていないキーを変更しようとしていないか。
- 新しく設定するキーの値がすでに登録されているものと同じになってはいないか。
キー(Key)の存在判定には、ほかの記事で紹介したDictionaryオブジェクトのExistsメソッドを利用しています。
以下のフローチャートで処理のながれが把握できると思います。
(※変数への代入などの詳細な処理については割愛しています。)
それでは、このマクロを実行して、「MyDic3」に登録されているキー(Key)のうち、「ニャオハ」を「ニャローテ」に変更した結果をみます。
実行結果を確認していきます。
マクロの実行結果
クワッス,ホゲータ,ニャローテ
出力結果は、Join関数とKeysメソッドで「MyDic3」のキーをまとめて取り出しています。「MyDic3」に登録されている「クワッス、ホゲータ、ニャオハ」のうち、“ニャオハ”が”ニャローテ”に変更されました。
Keyプロパティの処理の前に判定をしておくとエラーを回避できるね。
Keyプロパティでまとめてキー(Key)を変更する1
こちらのサンプルマクロでは、連想配列(Dictionaryオブジェクト)である「MyDic4」に登録されているすべてのキー(Key)を新しい値に変更します。ひとことで言ってしまえば、全部まとめて変更するマクロになります。
VBAサンプルコード(For Nextのくり返し文での書きかた)
Option Explicit
Sub Dic_study4()'DictionaryオブジェクトのKeyプロパティはキーを新しい値に設定します。
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく
Dim MyDic4 As Dictionary
Set MyDic4 = New Dictionary
'Addメソッドで要素を追加する(要素は左からキー、アイテムの順番で指定する)
MyDic4.Add "クワッス", "あお" '「クワッス」がキー、「あお」がアイテムになる
MyDic4.Add "ホゲータ", "あか"
MyDic4.Add "ニャオハ", "みどり"
Dim i As Long
Dim ExistingKey As String, NewKey As String
'キー(Key)の値をまとめて書きかえる(ForNext版)
For i = 0 To UBound(MyDic4.Keys)
ExistingKey = MyDic4.Keys(i)
'空欄とキャンセル操作対策
Do While NewKey = "" Or NewKey = "False"
NewKey = Application.InputBox("キー(Key)「" & ExistingKey & "」に新しいキー(Key)を指定してください。", "新しいキーを指定", Type:=2)
Loop
If MyDic4.Exists(NewKey) Then
MsgBox "指定された値はすでに登録されています。", vbOKOnly + vbCritical, "入力値不正通知"
End
Else
MyDic4.Key(ExistingKey) = NewKey
NewKey = ""
End If
Next i
'Keysメソッドを利用してすべてのキーを取り出す
Debug.Print Join(MyDic4.Keys, ",")
End Sub
Dictionaryオブジェクトである「MyDic4」を宣言したあと、3つの要素を登録しています。すべての要素のキーを変更するくらいなら新しくオブジェクトを作ってしまえばいいと考えられるので、事例としては稀なものになるかもしれません。
UBound(MyDic4.Keys)でくり返し文をつかっていますが、Keysメソッドでくり返す回数を指定しています。「MyDic4」の要素の数である3回くり返す処理になります。変数「ExistingKey」に「MyDic4」のキー(Key)が一つずつ代入されていき、現在のキー(Key)の値を新しいキー(Key)の値に変えられます。
新しいキー(Key)は、Application.InputBoxメソッドで表示される入力ボックスに入力した値が変数「NewKey」に代入されますが、このInputBoxメソッドの案内文に「ExistingKey」を利用することで、使用者にどのキー(Key)に対しての変更なのかがわかりやすくなるようにしています。
変更対象のキー(Key)を表示した入力画面
どのキー(Key)に対して入力ボックスであることがわかりやすくなるね。
入力ボックスで入力された値が空欄やキャンセルされたときと、すでに「MyDic4」に登録されている3つのキー(Key)が入力されたときの対処として以下の処理を入れています。
- 入力ボックスで空欄やキャンセルとなったとき
値が入力がされるまで入力ボックスをくり返し表示する。 - すでに「MyDic4」に登録されている3つのキー(Key)が入力されたとき
エラーメッセージを表示してプログラムを終了する。
これらの条件に当てはまらない値が入力されたときに正常な処理として、Keyプロパティをつかって新しい値がキー(Key)として書きかえられます。
それでは、クワッスをウェルカモ、ホゲータをアチゲータ、ニャオハをニャローテに書きかえてみます。
マクロの実行結果
ウェルカモ,アチゲータ,ニャローテ
出力結果は、Join関数とKeysメソッドで「MyDic4」のキーをまとめて取り出しています。「MyDic4」に登録されていた「クワッス、ホゲータ、ニャオハ」が、「ウェルカモ,アチゲータ,ニャローテ」に変更されました。
登録されているキー(Key)をまとめて変更することができたね。
Keyプロパティでまとめてキー(Key)を変更する2
こちらのサンプルマクロでは、連想配列(Dictionaryオブジェクト)である「MyDic5」に登録されているすべてのキー(Key)を新しい値に変更します。ひとことで言ってしまえば、全部まとめて変更するマクロになります。
直前に紹介したプログラムとのちがいは、くり返しの指定の方法でFor Each文を使っているところと、条件分岐でSelect Calseステートメントを利用しているところになります。
VBAサンプルコード(For Nextのくり返し文での書きかた)
Option Explicit
Sub Dic_study5() 'DictionaryオブジェクトのKeyプロパティはキーを新しい値に設定します。
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic5 As Dictionary
Set MyDic5 = New Dictionary
'Addメソッドで要素を追加する(要素は左からキー、アイテムの順番で指定する)
MyDic5.Add "クワッス", "あお" '「クワッス」がキー、「あお」がアイテムになる
MyDic5.Add "ホゲータ", "あか"
MyDic5.Add "ニャオハ", "みどり"
Dim Targetkey As Variant
Dim ExistingKey As String, NewKey As String
'キー(Key)の値をまとめて書きかえる(ForEach版)
For Each Targetkey In MyDic5.Keys
ExistingKey = Targetkey
NewKey = Application.InputBox("キー(Key)「" & ExistingKey & "」に新しいキー(Key)を指定してください。", "新しいキーを指定", Type:=2)
Select Case NewKey '入力された値によって処理を分岐する
Case "" '空白であるとき
MsgBox "キー(Key)に空白は指定できません。", vbOKOnly + vbCritical, "入力値不正通知"
Exit Sub
Case False 'キャンセルされたとき
MsgBox "キー(Key)を入力してください。", vbOKOnly + vbCritical, "入力値不正通知"
Exit Sub
Case Else 'それ以外
If MyDic5.Exists(NewKey) Then
MsgBox "指定された値はすでに登録されています。", vbOKOnly + vbCritical, "入力値不正通知"
Exit Sub
Else
MyDic5.Key(ExistingKey) = NewKey
End If
End Select
Next Targetkey
'Keysメソッドを利用してすべてのキーを取り出す
Debug.Print Join(MyDic5.Keys, ",")
End Sub
こちらのプログラムでは、くり返しの指定方法としてFor Eachステートメントで「MyDic5」のすべてのキー(Key)の数だけくり返すことになります。「MyDic5」には3つのキー(Key)が登録されていますので3回くり返します。
入力ボックスで新しく設定したいキー(Key)を入力していくわけですが、これまでのプログラムと同じように空白やキャンセル、またはすでに登録されているキー(Key)と同じ値だったときの対処をしており、正常な処理ができないすべてのケースでメッセージを表示した上で処理を停止する手段にしています。
書きかたはちがうけど、こちらもまとめてキーを変更できるよ。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント