変数や値が何型の変数(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