連想配列(Dictionaryオブジェクト)は、連想配列や辞書とよばれるオブジェクトのひとつで、複数の便利なメソッドとプロパティをもっています。こちらの記事では、連想配列(Dictionaryオブジェクト)のメソッドやプロパティの使いかたを紹介しています。
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
Existsメソッドは連想配列(Dictionaryオブジェクト)のキーの重複を判定する
Existsメソッドは、連想配列(Dictionaryオブジェクト)のキー(Key)が既に登録されているかを判定します。
判定結果は真偽値であらわされ、指定したキーが既に存在すると判定されたときはTrue、まだ登録されていないキーのときはFalseが返されます。
連想配列(Dictionaryオブジェクト)は、既に登録されているキー(Key)を登録しようとするとエラーが発生することから、Existsメソッドを利用することでエラーを回避できます。
※連想配列(Dictionaryオブジェクト)についてはこちら
Existsメソッド構文
Existsメソッドの構文
連想配列(Dictionaryオブジェクト).Exists(Key)
※Existsメソッドの引数には判定したいキー(Key)を指定します。
Existsメソッドの構成要素と引数
Existsメソッドの構成要素と引数
要素/引数 | 必須/任意 | 説明 |
---|---|---|
オブジェクト (object) |
必須 | Dictionaryオブジェクトの名前を指定します。 |
キー (key) |
必須 | 存在の判定をするキーの要素を指定します。 |
Existsメソッドで返される結果
判定結果を真偽値(Boolean)で返します。引数に指定したキーが既に存在しているときはTrue、そうでないときはFalseが返されます。
Dictionaryオブジェクトのキーの存在を判定してくれるんだね。
Existsメソッドをつかったサンプルマクロ
連想配列(Dictionaryオブジェクト)のExistsメソッドをつかったサンプルマクロを紹介します。
連想配列(Dictionaryオブジェクト)では、既に登録されているキー(Key)は登録できないため、Existsメソッドをつかってキー(Key)の重複を判定してから要素の追加をする使いかたが安全です。
Existsメソッドでキー(Key)の存在をチェックする
以下のマクロは、Existsメソッドをつかって宣言した連想配列(Dictionaryオブジェクト)である「MyDic」にキー(Key)が既に存在するかの判定を実行します。
サンプルコード
Option Explicit
Sub Dic_study1()'指定したキーが登録されているかの判定をする
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic As Dictionary
Set MyDic = New Dictionary
'Addメソッドで要素を追加する
MyDic.Add "クワッス", "あお"
MyDic.Add "ホゲータ", "あか"
MyDic.Add "ニャオハ", "みどり"
'Existsメソッドは指定したキーがDictionaryオブジェクトに存在するかを判定する。
'既に存在する場合は「True」、存在しないキーの場合は「False」を返す。
Debug.Print MyDic.Exists("ホゲータ") '実行結果>>>True
Debug.Print MyDic.Exists("ヒトカゲ") '実行結果>>>False
End Sub
実行結果
True
False
ホゲータは既にキーとして登録されていることから判定結果がTrueとなり、ヒトカゲは登録がないためFalseが返されています。
Existsメソッドでキー(Key)の存在をチェックしてから登録する
以下のマクロは、エクセルのシート1の表にあるデータを宣言した連想配列(Dictionaryオブジェクト)である「MyDic2」にキーとアイテムの要素をAddメソッドで追加します。
わかりやすくするため赤字にしていますが、以下の表の11行目以降は既に登録されているキーになるため登録されません。
エクセルのシート1にあるデータ
サンプルコード
Option Explicit
Sub Dic_study2() '指定したキーを判定してから要素を追加する
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic2 As Dictionary
Set MyDic2 = New Dictionary
'シート1の表からデータを取得する
With ThisWorkbook.Sheets(1)
Dim i As Integer 'くり返し用の変数を宣言する
'2行目からA列の最終行(13行目)までくり返す
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 'iが2~13の間はくり返す
If MyDic2.Exists(.Cells(i, 1).Value) = False Then 'キーが存在しない場合
MyDic2.Add .Cells(i, 1).Value, .Cells(i, 2).Value 'セルの値を要素として登録する
End If
Next i
End With
'くり返しによる要素の取り出し
Dim MyDicKey As Variant
For Each MyDicKey In MyDic2 'MyDic2は配列なので要素の分だけくり返す
Debug.Print MyDicKey; ":"; MyDic2(MyDicKey)
Next MyDicKey
End Sub
Existsメソッドの判定結果をIf文で判定します。サンプルマクロでは指定したキー(Key)がまだ登録されていないものであったときは、連想配列(Dictionaryオブジェクト)に要素として追加します。
実行結果
クワッス:あお
ホゲータ:あか
ニャオハ:みどり
ウェルカモ:あお
アチゲータ:あか
ニャローテ:みどり
ウェーニバル:あお
ラウドボーン:あか
マスカーニャ:みどり
「MyDic2」に代入されたキーとアイテムをすべて取り出すことができました。
Existsメソッドでキー(Key)が既に存在したら末尾に番号をつけて登録する
こちらのマクロは、新しく登録しようとするキー(Key)が連想配列(Dictionaryオブジェクト)に既に登録されているものであった場合に、キー(Key)となる文字列の末尾に番号をつける処理をします。
例えば、「クワッス」がキー(Key)として既に登録されていたときは「クワッス2」に、「クワッス2」が既に登録されているのであれば「クワッス3」と文字列の末尾の番号を加算して重複を避けてキー(Key)を登録します。
登録する要素はエクセルのシートに書かれたもので、内容は以下の画像になります。
エクセルのシート1にあるデータ
クワッスからマスカーニャが3回くり返しているデータとなっています。
上から順に要素として登録していくと、色が切りかわる部分でExistsメソッドによってキー(Key)の重複が検出されます。こちらのエクセルシートのデータを連想配列(Dictionaryオブジェクト)である「MyDic3」に登録して動作を確認していきます。
サンプルコード
Option Explicit
Sub Dic_study3() '指定したキーが重複したら末尾に数字を入力する
'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic3 As Dictionary
Set MyDic3 = New Dictionary
'シート1の表からデータを取得する
With ThisWorkbook.Sheets(1)
Dim i As Integer 'くり返し用の変数を宣言する
Dim No As Integer: No = 2
Dim KeyStr As String, KeyStr2 As String
'2行目からA列の最終行(13行目)までくり返す
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 'iが2~13の間はくり返す
If MyDic3.Exists(.Cells(i, 1).Value) = False Then 'キーが存在していない場合
MyDic3.Add .Cells(i, 1).Value, .Cells(i, 2).Value 'セルの値を要素として登録する
Else
KeyStr = .Cells(i, 1).Value 'セルの値を変数に代入する
Do While MyDic3.Exists(KeyStr & No) = True 'キーが存在している間はくり返す
No = No + 1 '末尾のナンバーを加算する
KeyStr = KeyStr & No 'キー(Key)の末尾にナンバーをつける
Loop
KeyStr2 = .Cells(i, 1).Value & No
MyDic3.Add KeyStr2, .Cells(i, 2).Value '変数の文字列とセルの値を要素として登録する
End If
Next i
End With
'くり返しによる要素の取り出し
Dim MyDicKey As Variant
For Each MyDicKey In MyDic3 'MyDic3は配列なので要素の分だけくり返す
Debug.Print MyDicKey; ":"; MyDic3(MyDicKey)
Next MyDicKey
End Sub
実行結果
クワッス:あお
ホゲータ:あか
ニャオハ:みどり
ウェルカモ:あお
アチゲータ:あか
ニャローテ:みどり
ウェーニバル:あお
ラウドボーン:あか
マスカーニャ:みどり
クワッス2:あお
ホゲータ2:あか
ニャオハ2:みどり
ウェルカモ2:あお
アチゲータ2:あか
ニャローテ2:みどり
ウェーニバル2:あお
ラウドボーン2:あか
マスカーニャ2:みどり
クワッス3:あお
ホゲータ3:あか
ニャオハ3:みどり
ウェルカモ3:あお
アチゲータ3:あか
ニャローテ3:みどり
ウェーニバル3:あお
ラウドボーン3:あか
マスカーニャ3:みどり
キー(Key)の重複を回避するために、キーとなる文字列の末尾に番号をつけることができました。
Existsメソッドはキーの存在をチェックをするんだね。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント