VBAで型が一致しないバグの理由が分からなかったとこありませんか?私がこれまで経験したイージーミスから、「型定義しているのになんで?」までをケースごとに解説していきたいと思います。
ケース1:数字での型が一致しない場合
理由
これはExcelのセルを使う時によくやってしまうミスの一つ。しかも、動く時と動かない時があるやつですね。Excelの行は最大1048576行まで取れます。Integerは32767までしか値を保持できません。
対策
Excelのセルを使う時は必ずLongで選択しましょう。
ケース2:Variantによる自動選択による型不一致
理由
Variantは便利な変数である反面、メソッドを使用する時は最大限気を付ける必要があります。「Sheets(e & "明細").Select」がうまく動いているから、「Sheets(e).Select」が、「e」のセルの中の文字列に変換してくれていると思い込んでいるバターンです。「& "明細"」があるとVBAは「e」が文字列であることを判断できます。しかし、「Sheets(e)」だけでは、「e」がRange型として判断してしまいます。
対策
Sheets(e.value)を記載すればうまく動きます。いずれにせよ、このようなことがありますので、Variant型はあまり使わないほうがいいと思います。
ケース3:変数宣言による型不一致
理由
「Dim SHT1, SHT2 As Worksheet」は、SHT2しか「Worksheet型」でしか反映されてません。SHT1はVariant設定になってしまっているという罠です。
対策
「Dim SHT1 As Worksheet, Dim SHT2 As Worksheet」と分けて記載すれば解決します。
あとがき
いかがでしたでしょうか?皆さんのお役に立てれば幸いです。PCが一般化してきた今、他人と差別化を図る一つの手段として、VBAを学んでいくのも一つの手段です。一人で学んでいくのが難しいと思われている方は、ストアカ を利用してみてはいかがでしょうか?