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

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

連想配列(Dictionaryオブジェクト)は、連想配列や辞書とよばれるオブジェクトのひとつで、複数の便利なメソッドとプロパティをもっています。こちらの記事では、連想配列(Dictionaryオブジェクト)のメソッドやプロパティの使いかたを紹介しています。

PR

PCでスキルアップをしたい・Excelをしっかり学んで社内の評価を高めたい人は必見!
実務をプロから学べる「ユースフル」は講座の動画は永年見放題。安心のQ&A機能で分からないを解決。

Existsメソッドは連想配列(Dictionaryオブジェクト)のキーの重複を判定する

Existsメソッドは、連想配列(Dictionaryオブジェクト)のキー(Key)が既に登録されているかを判定します。
判定結果は真偽値であらわされ、指定したキーが既に存在すると判定されたときはTrue、まだ登録されていないキーのときはFalseが返されます。

連想配列(Dictionaryオブジェクト)は、既に登録されているキー(Key)を登録しようとするとエラーが発生することから、Existsメソッドを利用することでエラーを回避できます。

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

Existsメソッド構文

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

Existsメソッドの引数には判定したいキー(Key)を指定します。

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

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

判定結果を真偽値(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が返されています。

Existsメソッドでキー(Key)の存在をチェックしてから登録する

以下のマクロは、エクセルのシート1の表にあるデータを宣言した連想配列(Dictionaryオブジェクト)である「MyDic2」にキーとアイテムの要素をAddメソッドで追加します。
わかりやすくするため赤字にしていますが、以下の表の11行目以降は既に登録されているキーになるため登録されません。

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)を登録します。

登録する要素はエクセルのシートに書かれたもので、内容は以下の画像になります。

クワッスからマスカーニャが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

キー(Key)の重複を回避するために、キーとなる文字列の末尾に番号をつけることができました。

Existsメソッドはキーの存在をチェックをするんだね。

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

コメント

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