VBAで型が一致しないバグの理由が分からなかったとこありませんか?私がこれまで経験したイージーミスから、「型定義しているのになんで?」までをケースごとに解説していきたいと思います。
ケース1:数字での型が一致しない場合
1 2 3 4 5 6 7 8 9 10 |
Sub test() Dim CellRow As Integer '↓ここでエラー CellRow = Cells(Rows.Count, 1).End(xlUp).Row Debug.Print CellRow End Sub |
理由
これはExcelのセルを使う時によくやってしまうミスの一つ。しかも、動く時と動かない時があるやつですね。Excelの行は最大1048576行まで取れます。Integerは32767までしか値を保持できません。
対策
Excelのセルを使う時は必ずLongで選択しましょう。
ケース2:Variantによる自動選択による型不一致
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub test2() Dim e As Variant For Each e In Sheets("入力").Range("A1:A44") If e <> "" Then Sheets(e & "明細").Select '↓ここでエラー Sheets(e).Select End If Next e End Sub |
理由
Variantは便利な変数である反面、メソッドを使用する時は最大限気を付ける必要があります。「Sheets(e & "明細").Select」がうまく動いているから、「Sheets(e).Select」が、「e」のセルの中の文字列に変換してくれていると思い込んでいるバターンです。「& "明細"」があるとVBAは「e」が文字列であることを判断できます。しかし、「Sheets(e)」だけでは、「e」がRange型として判断してしまいます。
対策
Sheets(e.value)を記載すればうまく動きます。いずれにせよ、このようなことがありますので、Variant型はあまり使わないほうがいいと思います。
ケース3:変数宣言による型不一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub test3() Dim SHT1, SHT2 As Worksheet Set SHT1 = ThisWorkbook.Sheets(1) Set SHT2 = ThisWorkbook.Sheets(2) '↓コンパイルエラーが出る Call SHTName(SHT1, SHT2) End Sub Function SHTName(SHT1 As Workbook, SHT2 As Workbook) Debug.Print SHT1.Name Debug.Print SHT2.Name End Function |
理由
「Dim SHT1, SHT2 As Worksheet」は、SHT2しか「Worksheet型」でしか反映されてません。SHT1はVariant設定になってしまっているという罠です。
対策
「Dim SHT1 As Worksheet, Dim SHT2 As Worksheet」と分けて記載すれば解決します。
あとがき
いかがでしたでしょうか?皆さんのお役に立てれば幸いです。PCが一般化してきた今、他人と差別化を図る一つの手段として、VBAを学んでいくのも一つの手段です。一人で学んでいくのが難しいと思われている方は、ストアカ を利用してみてはいかがでしょうか?