TypeName
TypeName関数は変数やオブジェクトがどういう種類なのかを”Integer”や”Range”などの文字列で返します。
Integer型やRange型など種類が分かっていれば判定する必要がないため、何が設定されているのか分からない変数がTypeName関数を使う対象になります。
何が設定されているのか分からない変数は、全てのデータが格納できるVariant型か、オブジェクトであればなんでも格納できるObject型のため、これらの変数に対して判定を行うことになります。
構文
Function TypeName(VarName) As String
VarName | 種類を調べたい変数を指定します。 |
戻り値String | VarNameで指定した変数の種類を文字列で返します。 |
変数とオブジェクトの種類
変数型は10個程度ですが、オブジェクト型は無数にあります。
オブジェクト型については代表的なものを紹介します。
変数型
“Boolean” | ブール型 |
“Byte” | バイト型 |
“Integer” | 整数型 |
“Long” | 長整数型 |
“Single” | 単精度浮動小数点数型 |
“Double” | 倍精度浮動小数点数型 |
“Currency” | 通貨型 |
“Date” | 日付型 |
“String” | 文字列型 |
オブジェクト型
“Range” | セル範囲 |
“Workbook” | ワークブック |
“Workbooks” | ワークブックコレクション |
“WorkSheets” | ワークシートコレクション |
“WorkSheet” | ワークシート |
“FileSystemObject” | FileSystemObjectクラス |
“Object” | オブジェクト |
“Dictionary” | Dictionaryクラス |
“Chart” | グラフ |
“TextBox” | ActiveXコントロールのテキストボックス |
“CommandButton” | ActiveXコントロールのコマンドボタン |
その他
Error | エラー値 |
Empty | Variant型の初期値や未設定セルのRange型の値など |
Null | 演算が判定できない場合や無効な場合の値 |
UnKnown | オブジェクトの種類が不明な場合 |
Nothing | オブジェクト変数の初期値 |
TypeName関数の用途とサンプルコード
VBA単体で処理するようなコードの場合ではTypeName関数はあまり使う機会がないのですが、Excelシートの操作を行うようなコードを実行する場合に、結構重要な役割を果たします。
例えば、選択しているセルの色を付ける以下のようなコードがあったとします。
1 2 3 4 5 6 7 |
Sub SetColorRange() Dim r As Range For Each r In Selection r.Interior.Color = RGB(100, 250, 0) Next End Sub |
セル範囲を選択してこの関数を実行すると、選択セルの背景色を緑色にします。
ところが、シートにオートシェイプがあった場合にそれを選択していると、Selectionプロパティが指すのはオートシェイプになるため、SelectionプロパティのループでRangeオブジェクトへの代入ができずにエラーになります。
このように、後続の処理が正しく実行できるかどうかの判定をするためにTypeName関数を使うことが多いと思います。
ちなみに上のコードにTypeName関数を加えるとこんな感じになります。
Rangeオブジェクトの場合のみ後続の処理を動かすようにしています。
1 2 3 4 5 6 7 8 9 10 11 |
Sub SetColorRange() Dim r As Range If TypeName(Selection) <> "Range" Then Exit Sub End If For Each r In Selection r.Interior.Color = RGB(100, 250, 0) Next End Sub |
サンプルコード、その2
上記のコードではTypeName関数でRangeかどうかだけの判定でしたが、セルかオートシェイプ1つかオートシェイプ複数かの判定を行う場合は以下のような感じになります。
オートシェイプが1つの場合は”Rectangle”や”Line”などですが、複数の場合は”DrawingObjects”になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub TypeNameTest() Dim v As Variant '// Selection Dim sType As String '// 種類 '// Selectionを代入 Set v = Selection '// 種類を取得 sType = TypeName(v) '// セル選択時 If sType = "Range" Then Debug.Print "セルでーす" '// オートシェイプを1つ選択時 ElseIf sType = "Rectangle" Then Debug.Print "オートシェイプでーす" '// オートシェイプを複数選択時 ElseIf sType = "DrawingObjects" Then Debug.Print "オートシェイプが複数でーす" End If End Sub |