はじめに
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
と組み合わせることで、データの種類に応じた処理の分岐をスマートに記述できる。
このテクニックをマスターすれば、より柔軟で、予期せぬデータが渡された場合でもエラーを起こしにくい、堅牢なプロシージャを作成することができます。