和風スパゲティのレシピ

日本語でコーディングするExcelVBA

変数や値のデータ型を調べる - TypeName関数

変数や値が何型の変数(As ○○)かを調べるには、
TypeName関数を使用します。

基本構文

TypeName(判定したい変数)

返り値一覧

返される文字列 変数
object type objecttype 型のオブジェクト
Byte バイト値
Integer Integer
Long 長整数
Single 単精度浮動小数点数
Double 倍精度浮動小数点数
Currency 通貨値
Decimal 10 進値
Date 日付値
String String
Boolean ブール値
Error エラー値
Empty Variant初期値
Null 有効な値がありません
Object オブジェクト
Unknown 不明な型のオブジェクト
Nothing オブジェクト変数の初期値(未Set時)

判定仕様

TypeName関数は「なんの型で宣言されているか?」ではなく、
「今なんの型が入っているか」を判定してくれる関数です。


Variant変数はVariantと表示されるのではなく

  • 宣言直後はEmpty
  • 「1」を入れたらInteger
  • セルをSetしたらRange

といった判定が返ります。


また「セル As Range」とRange型で宣言していても、
何かをSetするまでは「Nothing」と判定されますのでご注意ください。

詳しい実行結果

TypeName関数の実行結果は以下の通りです。

Sub TypeName関数の結果一覧()

    Dim Long変数 As Long
    Debug.Print TypeName(Long変数) ' Long
    
    Dim String変数 As String
    Debug.Print TypeName(String変数)  ' String

    Dim Range変数 As Range
    Debug.Print TypeName(Range変数) ' (注)Nothing
    
    Set Range変数 = Range("A1")
    Debug.Print TypeName(Range変数) ' Range
    
        ' As ○○で指定しても中身が入るまではNoting判定
        
    Debug.Print TypeName(1) ' Integer
    Debug.Print TypeName("文字列") ' String
    Debug.Print TypeName(True) ' Boolean
    Debug.Print TypeName(Range("A1")) ' Range
    Debug.Print TypeName(Range("A1").Value) ' Double
    
        ' 引数には「varname(変数名)」とあるがリテラルも判定可
    

    Dim Object変数 As Object
    Debug.Print TypeName(Object変数) ' Nothing
    
    Set Object変数 = Range("A1")
    Debug.Print TypeName(Object変数) ' Range
    
    Set Object変数 = Worksheets(1)
    Debug.Print TypeName(Object変数) ' Worksheet
    
        ' As Objectは中身が入ればその型を表示、入るまではNoting


    Dim Variant変数 As Variant
    Debug.Print TypeName(Variant変数) ' Empty

    Variant変数 = 1
    Debug.Print TypeName(Variant変数) ' Integer

    Set Variant変数 = Range("A1")
    Debug.Print TypeName(Variant変数) ' Range

    Set Variant変数 = Nothing
    Debug.Print TypeName(Variant変数) ' Nothing
    
        ' As Variantも中身の型を表示
        ' 宣言直後の初期値はEmptyだが、Notingが入ればNotiong
        
        
    Variant変数 = Null
    Debug.Print TypeName(Variant変数) ' Null
    
    Variant変数 = CVErr(xlErrNA)
    Debug.Print TypeName(Variant変数) ' Error
    
        ' 何らかの結果で返る「Null,Error」なども判定可
    
    
    Dim Long配列変数() As Long
    Debug.Print TypeName(Long配列変数) ' Long()

    Dim Object配列変数() As Object
    Debug.Print TypeName(Object配列変数) ' Object()

    Dim Variant配列変数() As Variant
    Debug.Print TypeName(Variant配列変数) ' Variant()
    
        ' 配列は「型名()」で表示
    
    
    ReDim Variant配列変数(0)
    Set Variant配列変数(0) = Range("A1")
    Debug.Print TypeName(Variant配列変数) ' Variant()
    Debug.Print TypeName(Variant配列変数(0)) ' Range

        ' Variant配列は中身が統一されていてもVariant()
        ' 要素をひとつずつ判定することも可能

    
    Dim TextFrame変数 As TextFrame
    Set TextFrame変数 = ActiveSheet.Shapes(1).TextFrame
    Debug.Print TypeName(TextFrame変数) ' TextFrame
    
    Dim 自作クラス変数 As 自作Class
    Debug.Print TypeName(自作クラス変数) ' Nothing
    
    Set 自作クラス変数 = New 自作Class
    Debug.Print TypeName(自作クラス変数) ' 自作Class
    
    Dim 自作Type変数 As 自作Type
    'Debug.Print TypeName(自作Type変数) ' エラー
    
        ' 自作クラスや珍しいオブジェクトでも名称を表示できる
        ' クラスはNewするまではNotiong
        ' ただしTypeは判定不可。
        

    Debug.Print TypeName(自作クラス変数.Long変数) ' Long
    Debug.Print TypeName(自作クラス変数.Range変数)    ' Nothing
    Debug.Print TypeName(自作Type変数.Long要素) ' Long
    Debug.Print TypeName(自作Type変数.Range要素) ' Nothing
    
        ' Typeやクラスの中見も判定可。初期値Nothingの仕様も同じ

End Sub