配列操作

DictionaryのExistsが動作しないのはValueで入れてない為【ExcelVBA】

DictionaryのExistsが動作しない

最近、VBA開発でハマったケースです。
VBAでDictionaryを使用した際、Existsが動作しませんでした。
■現象
・セルの値をDictionaryオブジェクトにキーをAddしたい。
・Existsでキーが存在しているか調べるとFalseが返ってくる。
・セルの値ではなく、キーを直で入力するとTrueが返ってくる。
=セル代入がうまくいってない。

ValueではなくRangeが代入されているのが原因

この記事を書いてから、.Valueを付けないような運用をしていたのが原因でした。
.Valueは必要?不必要?省略しても良い?【ExcelVBA】
Valueを付けなかったため、値(Value)ではなく、Rangeオブジェクトで代入したのが原因です。
Dictionaryは数字、文字列以外にもRangeも代入が可能です。

正常に取得できないサンプルコード

'参照設定 Microsoft Scripting Runtime
Public Sub sample()
    Dim dic As Dictionary
    Set dic = New Dictionary
    
    '■サンプルデータを代入
    Cells(1, 1) = "Excel"
    Cells(2, 1) = "Access"
    
    '■Dictionaryに格納
    dic.Add Cells(1, 1), 1       'Excel
    dic.Add Cells(2, 1).Value, 1 'Access
    dic.Add "Python", 1 'Access

    '■Existsで存在するかどうかチェック
    Debug.Print dic.Exists("Excel")  'False
    Debug.Print dic.Exists("Access") 'True
    Debug.Print dic.Exists("Python") 'True


    '■結果
    'dic.Add Cells(1, 1), 1      の場合は Rangeで代入されたため、文字列でチェックしてもFalseとなる
    'dic.Add Cells(2, 1).Value, 1の場合は Valueで代入されたため、文字列でチェックしたらTrue となる
        
End Sub

関連記事

配列内の重複した要素を削除する【Dictionary】【ExcelVBA】
.Valueは必要?不必要?省略しても良い?【ExcelVBA】

コメント

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