【VBA】Variant型の中身をTypeName関数で判定する方法

目次

はじめに

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

引数 inputDataVariant 型で受け取る関数を定義しています。これにより、この関数を呼び出す際に、文字列、セル範囲、数値など、様々な種類のデータを渡すことが可能になります。

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 にはカンマ区切りで複数の値を指定できます。この例では、データ型が DoubleLongInteger のいずれであっても、同じ「数値の場合」の処理を実行するようにまとめています。


まとめ

今回は、VBAの TypeName 関数を使って Variant 型変数の中身を判定する方法を解説しました。

  • Variant 型は、様々な種類のデータを格納できる便利な型。
  • TypeName 関数を使うと、Variant に今入っているデータの型名を文字列で取得できる。
  • Select Case と組み合わせることで、データの種類に応じた処理の分岐をスマートに記述できる。

このテクニックをマスターすれば、より柔軟で、予期せぬデータが渡された場合でもエラーを起こしにくい、堅牢なプロシージャを作成することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次