「型が一致しません。」の原因と対策

中級VBA

はじめに

 このエラーは、ある変数にその型と異なる値を代入させた時に発生します。
 例えば以下の様に数値型(Long型)文字列型(String型)を代入しようとした時などです。

Sub testVariableType1()
    Dim d As Long  'エラー:型が一致しません
    d = "文字列"
End Sub

 ただ、ExcelVBAでは型の自動変換が起こるため、「型が一致しません。」というエラーが出ない場合もあるので注意しましょう。 具体的には以下のような場合です。

 ・数値型に文字列の数字を代入した。(自動変換されます)
 ・数値型や日付型を文字列型に代入した。(自動変換されます。)
 ・バリアント型やセルの値を代入した。(代入先の変数型によってはエラーとなります。)
 ・数値型に空白(””)を代入しようとした。

型が不一致でもエラーとならない例

 数値型に文字列の数値を代入してもエラーは発生せず数値に変換されて代入されます。

Sub testVariableType2()
    Dim d As Long
    d = "123"
    Debug.Print d   '123
End Sub

 dには自動変換されて123という数値が代入されます。
 
 以下の例では、文字列から小数。小数から整数への丸めを経て値が代入されています。

Sub testVariableType3()
    Dim d As Long
    d = "45.6"
    Debug.Print d   '46 数値の丸めが行われた
End Sub

バリアント型やセルの値を代入する場合の注意点

 バリアント型セルの値は、代入後に型が決まるため、代入する際には注意が必要です。
 以下のプログラムでは、エラーとなる場合と、ならない場合があるでしょう。

Sub testVariableType4()
    Dim d As Long
    d = Range("A1")
    Debug.Print d
End Sub

 このようなプログラムは結果が不安で良くないプログラムと言えます。
 ちなみに、A1セルが空白の場合は、d = 0 となりエラーにはなりません。これはセルが空白の場合には0を返すからです。
 ただし、以下はエラーとなります。

Sub testVariableType5()
    Dim d As Long
    d = ""
    Debug.Print d   
End Sub

 この場合は明確に空白(””)を代入しようとしたのでエラーとなります。

インプットボックスでのエラー

Sub testInputBox1()
    Dim d As Long
    d = InputBox("整数を入力してください。")
    Debug.Print d
End Sub

 インプットボックスでは、「OK」と「キャンセル」ボタンがあります。
 上記のプログラムで、空白のまま「OK」を押すとエラー。また「キャンセル」ボタンを押してもエラーとなります。
 これは、どちらもインプットボックスが空白を返してくるからです。

 もし値を計算などで使う場合は、バリアント型などで一旦受けてから、値を調査して使うようにしましょう。

Sub testInputBox2()
    Dim d As Variant
    d = InputBox("整数を入力してください。")
    
    If Not IsNumeric(d) Then    '数値かどうか?
        MsgBox "数値ではないので終了します。"
        Exit Sub
    End If
    
    Debug.Print d
End Sub

 同じような事がユーザーフォームのインプットボックスなどでも起こります。

まとめ

 「型が一致しません。」というエラーは理由が明白ですが、インプットボックスの例にもあるように、意図していない入力を行う場合を想定していなかったというケースもあります。
 
 それまでエラーなく使用していたプログラムで、「型が一致しません。」というエラーが出た場合は、セルやインプットボックスなどから直接値を受けていないかを確認してみましょう。

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