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

VBA|Keyプロパティ(Dictionaryオブジェクト)

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

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

PR

スクール選びにお悩みですか?

動画編集、ロボット、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プロパティ構文

連想配列(Dictionaryオブジェクト).Key(登録されているキー(Key))= 新しいキー(NewKey)

すでに登録されているキー(Key)の値を新しい値(NewKey)に更新します。

Dictionaryオブジェクトに登録されていないキーを指定した場合は実行時エラーが発生します。

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)の値を新しい値に変更します。

  
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)となっています。

  
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)は登録されていません。

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プロパティの実行前に存在の判定をする処理を含めたマクロを紹介します。

  
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)の存在判定には、ほかの記事で紹介したDictionaryオブジェクトのExistsメソッドを利用しています。

以下のフローチャートで処理のながれが把握できると思います。
(※変数への代入などの詳細な処理については割愛しています。)

それでは、このマクロを実行して、「MyDic3」に登録されているキー(Key)のうち、「ニャオハ」を「ニャローテ」に変更した結果をみます。

実行結果を確認していきます。

出力結果は、Join関数とKeysメソッドで「MyDic3」のキーをまとめて取り出しています。「MyDic3」に登録されている「クワッス、ホゲータ、ニャオハ」のうち、“ニャオハ”が”ニャローテ”に変更されました。

Keyプロパティの処理の前に判定をしておくとエラーを回避できるね。

Keyプロパティでまとめてキー(Key)を変更する1

こちらのサンプルマクロでは、連想配列(Dictionaryオブジェクト)である「MyDic4」に登録されているすべてのキー(Key)を新しい値に変更します。ひとことで言ってしまえば、全部まとめて変更するマクロになります。

  
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)に対して入力ボックスであることがわかりやすくなるね。

入力ボックスで入力された値が空欄やキャンセルされたときと、すでに「MyDic4」に登録されている3つのキー(Key)が入力されたときの対処として以下の処理を入れています。

  • 入力ボックスで空欄やキャンセルとなったとき

    値が入力がされるまで入力ボックスをくり返し表示する。
  • すでに「MyDic4」に登録されている3つのキー(Key)が入力されたとき

    エラーメッセージを表示してプログラムを終了する。

これらの条件に当てはまらない値が入力されたときに正常な処理として、Keyプロパティをつかって新しい値がキー(Key)として書きかえられます。

それでは、クワッスをウェルカモ、ホゲータをアチゲータ、ニャオハをニャローテに書きかえてみます。

出力結果は、Join関数とKeysメソッドで「MyDic4」のキーをまとめて取り出しています。「MyDic4」に登録されていた「クワッス、ホゲータ、ニャオハ」が、「ウェルカモ,アチゲータ,ニャローテ」に変更されました。

登録されているキー(Key)をまとめて変更することができたね。

Keyプロパティでまとめてキー(Key)を変更する2

こちらのサンプルマクロでは、連想配列(Dictionaryオブジェクト)である「MyDic5」に登録されているすべてのキー(Key)を新しい値に変更します。ひとことで言ってしまえば、全部まとめて変更するマクロになります。

直前に紹介したプログラムとのちがいは、くり返しの指定の方法でFor Each文を使っているところと、条件分岐でSelect Calseステートメントを利用しているところになります。

  
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)と同じ値だったときの対処をしており、正常な処理ができないすべてのケースでメッセージを表示した上で処理を停止する手段にしています。

書きかたはちがうけど、こちらもまとめてキーを変更できるよ。

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

コメント

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