VBAのDictionaryを使って、テーブルの列に同じ文字列があるかないかをチェックしようと試していたのですが、結構苦労したのでメモしておきます。
DictionaryのExistsがうまく動作しなかったときのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub ダメだったとき() '宣言 Dim Data As Variant Dim Dic As New Dictionary Dim i As Long 'Dictionaryに追加 For i = 1 To 10 Dic.Add Cells(i,1), Cells(i,2) Next 'テーブルにあるか確認 For Each Data In Range("テーブル名[列名]") If Dic.Exists(Data) then テーブルにある場合に実行 End If Next End Sub |
宣言が悪いかと思い、
Dim Dic As Object
Set Dic = CreateObject(“Scripting.Dictionary”)
を試してみたり、Dictionaryへの追加方法が悪いのかと思い、一度配列に保存してから追加したりといろいろ試しましたが、やっぱりうまくいきません。
ひょっとしたらと思い、次の方法を試してみました。
DictionaryのExistsがうまく動作したときのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub うまくいったとき() '宣言 Dim Data As Variant Dim Dic As New Dictionary Dim i As Long 'Dictionaryに追加 For i = 1 To 10 Dic.Add Mid(Cells(i,1), InStr(Cells(i,1), " ")+1), Cells(i,2) Next 'テーブルにあるか確認 For Each Data In Range("テーブル名[列名]") If Dic.Exists(Mid(Data, InStr(Data, " ")+1)) Then テーブルにある場合に実行 End If Next End Sub |
DictionaryのExistsが機能しなかった原因は?
なぜ動作しなかったのかというと、原因はこれでした。
Cells(1,1) = “1 山田太郎”
Mid関数とInStr関数を使って、名前だけにしたらやっと思った通りに動いてくれました。
数字から始まっているからか、半角スペースが入っているかまでは断定しませんでしたが、いずれかが原因でExistsがうまく機能しなかったようです。