はじめに
VBAの Variant 型は、文字列、数値、日付、さらにはセル範囲(Rangeオブジェクト)まで、あらゆる種類のデータを格納できる非常に柔軟なデータ型です。この特性を活かすと、様々な種類の引数を受け取れる、汎用性の高いマクロ(プロシージャ)を作成できます。
しかし、Variant 型の変数を受け取った後、その中身が「文字列なのか、数値なのか、はたまたセル範囲なのか」を判別して、データの種類に応じた処理に分岐させる必要がでてきます。このデータ型の判別に役立つのが TypeName 関数です。
この記事では、TypeName 関数と Select Case ステートメントを組み合わせて、Variant 型変数の中身をスマートに判定し、処理を分岐させる方法を解説します。
TypeName関数でデータ型を判定するVBAサンプルコード
この例では、Variant 型の引数を受け取り、そのデータ型に応じて異なる方法でメッセージを作成して返す CreateMessage という関数を作成します。
完成コード
' Variant型の引数を受け取り、そのデータ型に応じたメッセージを返す関数
Function CreateMessage(inputData As Variant) As String
' TypeName関数で、inputDataに格納されているデータの型名を取得
Select Case TypeName(inputData)
Case "String"
' 中身が文字列の場合
CreateMessage = "テキストが直接渡されました: 「" & inputData & "」"
Case "Range"
' 中身がセル範囲の場合
CreateMessage = "セル参照が渡されました: アドレス=" & inputData.Address & ", 値=" & inputData.Value
Case "Double", "Long", "Integer"
' 中身が数値の場合
CreateMessage = "数値が直接渡されました: " & inputData
Case Else
' 上記以外の場合
CreateMessage = "判定できないデータ型です: " & TypeName(inputData)
End Select
End Function
' 上記の関数をテストするためのマクロ
Sub Test_CreateMessage()
' Sheet1のA1セルに "Sample Text" と入力されていると想定
Worksheets("Sheet1").Range("A1").Value = "Sample Text"
Worksheets("Sheet1").Range("A2").Value = 12345
Debug.Print CreateMessage("こんにちは")
Debug.Print CreateMessage(Worksheets("Sheet1").Range("A1"))
Debug.Print CreateMessage(Worksheets("Sheet1").Range("A2"))
Debug.Print CreateMessage(Now()) ' 日付型(Date)の例
End Sub
実行結果
Test_CreateMessage を実行すると、VBEのイミディエイトウィンドウに以下のように出力されます。
テキストが直接渡されました: 「こんにちは」
セル参照が渡されました: アドレス=$A$1, 値=Sample Text
数値が直接渡されました: 12345
判定できないデータ型です: Date
コードの解説
Function CreateMessage(inputData As Variant) As String
引数 inputData を Variant 型で受け取る関数を定義しています。これにより、この関数を呼び出す際に、文字列、セル範囲、数値など、様々な種類のデータを渡すことが可能になります。
Select Case TypeName(inputData)
このコードが処理の核心です。
TypeName(inputData):inputData変数に現在格納されているデータの型名を、文字列として返します。例えば、中身が文字列なら"String"、セル範囲なら"Range"という文字列が返されます。Select Case ...:TypeNameが返した文字列に応じて、処理を分岐させています。
Case "String" や Case "Range"
TypeName の戻り値が "String" だった場合、Case "String" 以下のコードが実行されます。同様に、"Range" だった場合は Case "Range" 以下が実行されます。これにより、データの種類に応じた適切な処理を行うことができます。
Case "Double", "Long", "Integer"
Case にはカンマ区切りで複数の値を指定できます。この例では、データ型が Double、Long、Integer のいずれであっても、同じ「数値の場合」の処理を実行するようにまとめています。
まとめ
今回は、VBAの TypeName 関数を使って Variant 型変数の中身を判定する方法を解説しました。
Variant型は、様々な種類のデータを格納できる便利な型。TypeName関数を使うと、Variantに今入っているデータの型名を文字列で取得できる。Select Caseと組み合わせることで、データの種類に応じた処理の分岐をスマートに記述できる。
このテクニックをマスターすれば、より柔軟で、予期せぬデータが渡された場合でもエラーを起こしにくい、堅牢なプロシージャを作成することができます。
