『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】VarType,TypeNameでデータ型を調べる

【VBA】VarType関数

VBAVarType は引数に指定した値のデータ型を示す数値を返す関数です。たとえば次のようなプロシージャを書いてみましょう。

'[VBA] VarTypeで変数のデータ型を調べるマクロ(1)
Sub DataType_1()
  Dim x As Double
  Debug.Print VarType(x)
End Sub

'DataType_1()の実行結果:
'5

変数 x を Double型で宣言しておいてから、それを VarType 関数に入れてあります。このマクロを実行すると「5」が表示されます。これは変数が Double型であることを示す変数の組込定数 (vbDouble) です。もうひとつ試してみましょう。

'[VBA] VarTypeで変数のデータ型を調べるマクロ(2)
Sub DataType_2()
  Dim mystr As String
  Debug.Print VarType(mystr)
End Sub

'DataType_2()の実行結果:
'8

今度は String型変数 mystr を宣言してあるので、String型に対応する組込定数「8」が返ってきます。

配列に対応する数字は「8192」ですが、実際にこの値がそのまま返されることはありません。必ず要素のデータ型を示す数値に加算した値を返します。たとえば次のようなコードを書いたとします。

'[VBA] VarTypeで配列のデータ型を調べるマクロ
Sub DataType_3()
  Dim x(2) As Integer
  x(1) = 1
  x(2) = 2
  Debug.Print VarType(x)
End Sub

'DataType_3()の実行結果:
'8194

DataType_3() では配列要素が Integer型で宣言されています。Integer型を表す数値は 2 なので、配列を示す数値 8192 に 2 を加えて 8194 が返ってきます。

VarType 関数が使われるのは「このデータの型がよくわからないな」てときです。たとえば Single 型と Double 型の数値を足したとき、その戻り値のデータ型がどうなるのかを調べてみましょう。

'[VBA] VarTypeでSingle+Doubleのデータ型を調べるマクロ
Sub DataType_4()
  Dim x As Single
  Dim y As Double
  Dim z As Variant
  z = x + y
  Debug.Print VarType(z)
End Sub

'DataType_4()の実行結果:
'5

Data_Type_4() を実行すると「5」が返ってくるので、Single 型数値と Double 型数値を加えると Double 型となることがわかります。

【VBA】TypeName 関数

VBA の TypeName は与えられた変数のデータ型を文字列で返す関数です。

'[VBA] TypeName関数のサンプルコード[1]

Sub TypeNameTest_1()

    Dim a As Integer
    Dim b As String
    Dim c As Date
    Dim d As Boolean
    Dim e As Currency

    '各変数のデータ型を文字列で取得
    Debug.Print "a: " & TypeName(a)
    Debug.Print "b: " & TypeName(b)
    Debug.Print "c: " & TypeName(c)
    Debug.Print "d: " & TypeName(d)
    Debug.Print "e: " & TypeName(e)

End Sub

'a: Integer
'b: String
'c: Date
'd: Boolean
'e: Currency

普通は Dim ステートメントで変数を宣言するので、TypeName の使いどころがなさそうに思えます。しかし、VarType でも説明したように、異なる型のデータ同士を演算した戻り値の型がよくわからないことも結構な頻度であります。たとえば、変数 a に Long 型が、変数 b には Decimal という特殊な型のデータが格納されているとします (ちなみに、この Decimal は Dim ステートメントで宣言できない型です)。では、「Long 型データと Decimal 型データを加算した c のデータ型は何ですか?」と訊かれても、よっぽどの VBA オタクでない限り、普通はわかりません。そんな時に活躍するのが TypeName 関数です。

'[VBA] TypeName関数のサンプルコード[2]

Sub TypeNameTest_2()

Dim a As Long
Dim b As Variant, c As Variant

a = 100
b = CDec("200")
c = a + b

Debug.Print "a: " & TypeName(a)
Debug.Print "b: " & TypeName(b)
Debug.Print "c: " & TypeName(c)

End Sub

'a: Long
'b: Decimal
'c: Decimal

上のコードでは TypeName() に c を渡して、その型が Decimal であることが判明しています。もちろん、先ほど紹介した VarType でも同じことができますが、VarType は数値で、TypeName は型名を返すので、一般的には TypeName のほうが使い勝手が良いと思います。

【VBA討論】VarTypeとTypeName

【執筆】ChatGPT
 
【シーン】オフィスの会議室
 
【登場人物】
 マイク:主任ソフトウェアエンジニア
 サラ:システムアナリスト
 ジョン:データベースエンジニア
 
【場面】会議室のテーブルには、VBA のコードの例とコンピューターがセットアップされています。マイク、サラ、ジョンが集まっています。みんな熱心に話し合っています。

マイク:みんな、こんにちは!今日は私たちが使っているVBAのVarType関数について話し合いたいと思います。意見を聞かせてください。
 
サラ:VarType 関数はデータ型を判別するための便利な機能ですが、戻り値が整数で返されるので、どのデータ型なのかを調べるのが手間だと感じています。
 
ジョン:確かに、サラの言う通りです。整数の戻り値だけでは、実際のデータ型を判断するのは面倒です。さらなる条件分岐が必要になります。
 
マイク:それは理解できます。しかし、VarType は VBA でよく使われる機能です。他に代替手段はあるのでしょうか?

サラ:もしかしたら、変数のデータ型を事前に確認する方法があるかもしれません。そうすれば、VarType を使わずにデータ型を把握できるかもしれません。
 
ジョン:確かに、事前にデータ型を確認する方法を探る価値はありますね。そうすれば、コードの可読性と保守性が向上するかもしれません。
 
マイク:なるほど、それは良いアイデアですね。次のプロジェクトで、事前にデータ型を確認する方法を試してみる価値がありそうです。それについて調査してみます。
 
サラ:そうですね。もし他の方法があれば、コードの可読性と保守性が向上し、条件分岐の複雑さを軽減できるかもしれません。
 
ジョン:同意します。どのような方法があるのか、調査結果を楽しみにしています。

(数日後、マイクが新たな情報を持って再び会議室に入ってきます)
 
マイク:みなさん、データ型を事前に確認する方法についての調査結果があります。VBA では、TypeName 関数を使用することで、変数のデータ型を事前に把握することができます。
 
サラ:なるほど、TypeName関数ですね。VarTypeと比べてどのような利点があるのでしょうか?
 
マイク:TypeName関数は、VarTypeとは異なり、文字列としてデータ型を返します。つまり、直接データ型を認識できます。これにより、条件分岐をシンプルに記述できます。
 
ジョン:それは便利そうですね。具体的な例を教えていただけますか?
 
マイク:もちろんです。例えば、変数xが整数型であるかどうかを確認したい場合、以下のようにTypeName 関数を使用します。

If TypeName(x) = "Integer" Then
    ' 整数型の処理
Else
    ' それ以外の処理
End If

サラ:なるほど、TypeName を使えば、直感的にデータ型を確認できますね。これは私たちのプロジェクトで使えるかもしれません。
 
ジョン:素晴らしい! VarType よりも簡潔で理解しやすそうです。マイク、この情報を次のプロジェクトに取り入れてみましょう。
 
マイク:絶対にそうします。チーム全員が理解しやすく、効率的なコードを作ることができるよう、サポートしていきます。

コメント