TypeName関数とVarType関数の違いを解説します。
同じところ
どちらも変数や値のデータ型を調べるための関数です。
違うところ
TypeName関数が「型名」を返すのに対し、
VarType関数は「型ごとに設定された数値」を返します。
Debug.Print TypeName(1) ' Integer と表示されます Debug.Print VarType(1) ' 2 と表示されます
また、TypeName関数はオブジェクトも判定可能ですが、
VarType関数はすべてのオブジェクトに「9」を返します。
Debug.Print TypeName(シート変数) ' Worksheet と表示されます Debug.Print TypeName(ブック変数) ' Workbook と表示されます Debug.Print TypeName(Range変数) ' Range と表示されます Debug.Print VarType(シート変数) ' 9 と表示されます Debug.Print VarType(ブック変数) ' 9 と表示されます Debug.Print VarType(Range変数) ' 5 と表示されます
Range変数が9でなく「5」になったのはDouble型の設定値であり、
これはこのセルに入力された値が数値だったことを意味しています。
オブジェクトが既定のプロパティ(例:Value)を持っている場合は、
VarType関数は自動でその値を判定します。
TypeName関数で(Rangeかどうかではなく)セル値の判定を行いたい場合は、
Debug.Print TypeName(Range変数.Vlaue) ' Double と表示されます
このように.Valueを明示してあげればOKです。
使い分け
常にTypeName関数を使っておけばOKです。
VarType関数はそもそも返り値が数値で分かりづらい上に、
オブジェクトも判定できないため完全下位互換と言っていいです。
唯一、Objectはひとまとめで判定したいという場合も、
こちらはこちらで上位互換のIsObject関数が存在します。
「データ型の判定はTypeName関数」と覚えてしまってください。