【VBA VarType】変数の型を調べる方法!5分で理解できる実践テクニック
セルに入力されたテキストが日付の場合〇〇して、数値の場合××する。というVBAを作りたい。
こんな問題を解決してくれるのがVarType関数です。
VarType関数を使えば、
セルに入力されたテキストが「100」は整数、「こんにちは」は文字列、、「5月20日」は日付と判別する
なんてことができるようになります。
業務内容に合わせて
セルに入力されたテキストが日付だったら1週間後の日付を表示する、数値だったらフォントを赤色にする
といった処理に応用すればエクセル業務の効率を飛躍的にアップさせることが可能です。
この記事では、
VarType関数の使い方、応用方法をサンプルコードを使って解説
しています。
目次
VarTypeとは?VBAで変数の型を調べる基本機能
VarType関数は
変数の型を整数で取得できる関数
のことです。
VarType関数にはいろんな使い道があるのですが私の場合、
セルに入力されている内容が「日付」のときマクロを動作させる
セルに入力されている内容が「数値」のときマクロを動作させる
といった場面でよく活用します。
VBAでプログラミングをする際、変数の型を正確に把握することは非常に重要です。
特にデバッグやエラー処理の場面では、変数がどのような型になっているかを知ることでトラブルを未然に防ぐことが可能。
VarType関数を自由に扱えるようになれば変数の型を数値として取得できるため、プログラム内で型の判定を自動化できます。
VarTypeの基本的な使い方と構文
VarType関数の基本的な使い方はとても簡単です。
関数の中に調べたい変数を入れるだけで、その変数の型を表す数値(整数)が返されます。
構文はこちら
VarType ( 変数名 )
めちゃくちゃシンプルですよね
VarType関数を使った簡単なサンプル事例をご紹介します。
Sub VarType基本例()
Dim 数値 As Integer
Dim 文字列 As String
Dim 日付 As Date
数値 = 123
文字列 = "こんにちは"
日付 = Now()
' 各変数の型を調べる
Debug.Print "数値の型: " & VarType(数値) ' → 2(整数型)
Debug.Print "文字列の型: " & VarType(文字列) ' → 8(文字列型)
Debug.Print "日付の型: " & VarType(日付) ' → 7(日付型)
End Sub
このサンプルコードの実行結果がこちら
各変数の型が数値として表示されます。
VarTypeが返す値の種類と意味一覧
VarType関数が返す数値はそれぞれ特定の型を表しています。
よく使用する変数の型に対応する数値を覚えておきましょう。
以下のサンプルコードは、主な戻り値とその意味をまとめたものです。
Sub VarType戻り値例()
' VarTypeの戻り値を定数名で確認
Debug.Print "vbEmpty: " & vbEmpty ' → 0(未初期化)
Debug.Print "vbNull: " & vbNull ' → 1(Null値)
Debug.Print "vbInteger: " & vbInteger ' → 2(整数型)
Debug.Print "vbLong: " & vbLong ' → 3(長整数型)
Debug.Print "vbSingle: " & vbSingle ' → 4(単精度浮動小数点型)
Debug.Print "vbDouble: " & vbDouble ' → 5(倍精度浮動小数点型)
Debug.Print "vbCurrency: " & vbCurrency ' → 6(通貨型)
Debug.Print "vbDate: " & vbDate ' → 7(日付型)
Debug.Print "vbString: " & vbString ' → 8(文字列型)
Debug.Print "vbObject: " & vbObject ' → 9(オブジェクト型)
Debug.Print "vbBoolean: " & vbBoolean ' → 11(論理型)
Debug.Print "vbVariant: " & vbVariant ' → 12(バリアント型)
Debug.Print "vbArray: " & vbArray ' → 8192(配列)
End Sub
このサンプルコードの実行結果がこちら
VBAには上記の定数が用意されており、数値と定数名を対応させて使うことができます。
例えば、変数が整数型かどうかを確認したい場合は「VarType(変数名) = vbInteger」というように記述しましょう。
VarType関数を使用する際の注意点
VarType関数は便利ですが、使用する際にはいくつかの注意点があります。
まず、配列の判定には少し工夫が必要です。
配列の場合、VarTypeは基本の型コードに8192(vbArray)を加えた値を返します。
例えば、整数の配列なら「8194」(vbInteger + vbArray)となります。
VarType関数で配列の整数を取得するサンプルコードがこちら
Sub VarType注意点()
' 配列の型を調べる
Dim 整数配列() As Integer
ReDim 整数配列(1 To 5)
' 配列の型コードを確認
Debug.Print "整数配列の型: " & VarType(整数配列) ' → 8194(2 + 8192)
' 配列かどうかの判定方法
If (VarType(整数配列) And vbArray) = vbArray Then
Debug.Print "これは配列です"
Else
Debug.Print "これは配列ではありません"
End If
' Emptyとの比較
Dim 未初期化変数 As Variant
If VarType(未初期化変数) = vbEmpty Then
Debug.Print "この変数は未初期化です"
End If
End Sub
7行目のコードを実行すると、「整数配列の型: 8194」という結果が表示されます。
10行目から14行目のコードでは、変数が配列型なのか配列型ではないのかを判別しています。
配列の型を取得する際には注意しましょう。
【実践コード】VarTypeで変数の型を判定する方法
VarType関数を実際のVBAコードで活用するための具体的な方法を見ていきましょう。
変数の型判定は、値の処理やエラー防止のために欠かせないスキルです。
特にユーザー入力値や外部データを扱う場合、想定外の型が入っていることがあります。
そのような場合にVarTypeを使って型を確認することで安全に処理を進めることが重要です。また、マクロの動作を最適化するためにも、変数の型に応じた適切な処理の分岐を設定しましょう。
基本的な変数型の判定方法(数値、文字列、日付など)
VBAを作成する際、数値型、文字列型、日付型などの判定は頻繁に必要になります。
それぞれの型に応じた処理を分岐させる方法を下記のサンプルコードで紹介していきます。
Sub 基本型判定()
Dim テスト変数 As Variant
' 数値型の判定
テスト変数 = 100
If VarType(テスト変数) = vbInteger Or VarType(テスト変数) = vbLong _
Or VarType(テスト変数) = vbSingle Or VarType(テスト変数) = vbDouble Then
Debug.Print "これは数値型です"
End If
' 文字列型の判定
テスト変数 = "こんにちは"
If VarType(テスト変数) = vbString Then
Debug.Print "これは文字列型です"
End If
' 日付型の判定
テスト変数 = Now()
If VarType(テスト変数) = vbDate Then
Debug.Print "これは日付型です"
End If
' 複合的な判定(数値かどうか)
テスト変数 = 123.45
Select Case VarType(テスト変数)
Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency
Debug.Print "これは何らかの数値型です"
Case Else
Debug.Print "これは数値型ではありません"
End Select
End Sub
8行目のコードを実行すると、「これは数値型です」という結果が表示されます。
14行目のコードを実行すると、「これは文字列型です」という結果が表示されます。
20行目のコードを実行すると、「これは日付型です」という結果が表示されます。
27行目のコードを実行すると、「これは何らかの数値型です」という結果が表示されます。
このコードでは、VarType関数を使って変数の型を判定し、それに応じた処理を行っています。
Select Case文を使うと、複数の型を一度にチェックできるため便利です。
数値型には様々な種類があるため上記のように複数の条件で判定しましょう。
配列やオブジェクトの型判定テクニック
配列やオブジェクトは少し特殊な扱いが必要です。
特に配列の場合は、vbArrayとビット演算子(And)を使って判定します。
Sub 配列オブジェクト判定()
' 配列の判定
Dim 文字列配列() As String
ReDim 文字列配列(1 To 3)
' 配列かどうかをチェック
If (VarType(文字列配列) And vbArray) = vbArray Then
Debug.Print "vbArray:"; vbArray
Debug.Print "これは配列です"
' 配列の要素の型を調べる
Dim 基本型 As Integer
基本型 = VarType(文字列配列) - vbArray
Select Case 基本型
Case vbString
Debug.Print "これは文字列の配列です"
Case vbInteger
Debug.Print "これは整数の配列です"
Case Else
Debug.Print "その他の型の配列です"
End Select
End If
' オブジェクトの判定
Dim シート As Worksheet
Set シート = ThisWorkbook.Sheets(1)
If VarType(シート) = vbObject Then
Debug.Print "vbObject:"; vbObject
Debug.Print "これはオブジェクトです"
' オブジェクトの詳細な種類
Debug.Print "オブジェクトの種類: " & TypeName(シート) ' → Worksheet
End If
End Sub
8行目のコードを実行すると、「vbArray: 8192 」という結果が表示されます。
9行目のコードを実行すると、「これは配列です」という結果が表示されます。
17行目のコードを実行すると、「これは文字列の配列です」という結果が表示されます。
30行目のコードを実行すると、「vbObject: 9 」という結果が表示されます。
31行目のコードを実行すると、「これはオブジェクトです」という結果が表示されます。
33行目のコードを実行すると、「オブジェクトの種類: Worksheet」という結果が表示されます。
配列の場合、VarType(配列) And vbArrayという式で配列かどうかを判定します。
さらに、VarType(配列) – vbArrayで配列の要素の型を得ることが可能。
オブジェクトの場合は、VarTypeでオブジェクトかどうかを判定し、TypeNameでそのオブジェクトの種類(クラス名)を取得します。
複数の型を一度に判定する効率的なコード例
複数の型を一度に判定するには、Select Case文やカスタム関数を作成すると効率的です。
特に頻繁に使う判定処理はカスタム関数にしておくと、コードがすっきりするのでおすすめです。
' 変数の型を判定して説明文を返す関数
Function 型の説明(対象変数 As Variant) As String
Select Case VarType(対象変数)
Case vbEmpty
型の説明 = "未初期化変数"
Case vbNull
型の説明 = "Null値"
Case vbInteger
型の説明 = "整数型 (Integer)"
Case vbLong
型の説明 = "長整数型 (Long)"
Case vbSingle
型の説明 = "単精度浮動小数点型 (Single)"
Case vbDouble
型の説明 = "倍精度浮動小数点型 (Double)"
Case vbCurrency
型の説明 = "通貨型 (Currency)"
Case vbDate
型の説明 = "日付型 (Date)"
Case vbString
型の説明 = "文字列型 (String)"
Case vbObject
型の説明 = "オブジェクト型 (" & TypeName(対象変数) & ")"
Case vbBoolean
型の説明 = "論理型 (Boolean)"
Case Else
' 配列の判定
If (VarType(対象変数) And vbArray) = vbArray Then
Dim 基本型 As Integer
基本型 = VarType(対象変数) - vbArray
型の説明 = "配列型 (要素の型: " & 型の説明(基本型) & ")"
Else
型の説明 = "その他の型 (コード: " & VarType(対象変数) & ")"
End If
End Select
End Function
Sub 型判定テスト()
' 様々な型の変数を用意
Dim 整数値 As Integer: 整数値 = 10
Dim 長整数値 As Long: 長整数値 = 1000000
Dim 文字列値 As String: 文字列値 = "テスト"
Dim 日付値 As Date: 日付値 = Now()
Dim 論理値 As Boolean: 論理値 = True
' 配列
Dim 数値配列() As Double
ReDim 数値配列(1 To 3)
' 結果表示
Debug.Print "整数値: " & 型の説明(整数値)
Debug.Print "長整数値: " & 型の説明(長整数値)
Debug.Print "文字列値: " & 型の説明(文字列値)
Debug.Print "日付値: " & 型の説明(日付値)
Debug.Print "論理値: " & 型の説明(論理値)
Debug.Print "数値配列: " & 型の説明(数値配列)
End Sub
このコードでは、「型の説明」というカスタム関数を作成して変数の型を判定し、わかりやすい説明文を返すようにしています。
実行結果がこちら
「型判定テスト」の14行目から19行目を実行するたびに、「Function 型の説明」を参照する。
という内容です。
このような関数を作っておくと、デバッグや値の検証が簡単になります。また、配列の判定も含めて、様々な型に対応できるようになっています。
関連記事「VBA初心者でも簡単にデバックする方法」ではVBAをデバックする方法やコードを1行ずつ順番に実行する方法が紹介されています。
紹介されている方法で上記のサンプルコードを実行するとコードの動きを詳しく理解することができるので是非試してみてください。
初心者でもわかる!VarTypeの活用例3選
VarType関数は使用頻度の高い関数ではありません。
ですが、使い方を理解しておけばより柔軟なマクロを作れるようになります。
以下で紹介するVarType関数の活用事例を参考にして作業効率アップのマクロ作成に役立ててください。
例1: 入力値の型を確認して処理を分岐させる
ユーザーの入力値や外部データは、必ずしも期待した型とは限りません。
VarType関数で入力値の型を確認し、適切な処理を行いましょう。
文字列が入力されたらエラーメッセージを表示し、数値が入力されたら計算を継続するサンプルコードがこちら
Sub 入力値の型確認()
' ユーザーから入力を受け取る
Dim 入力値 As Variant
入力値 = Application.InputBox("数値を入力してください", Type:=1)
' キャンセルを押されたかどうかのチェック
If VarType(入力値) = vbBoolean Then
Debug.Print "キャンセルされました"
Exit Sub
End If
' 入力値の型によって処理を分岐
Select Case VarType(入力値)
Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency
Debug.Print "入力された数値: " & 入力値
Debug.Print "2倍の値: " & 入力値 * 2
Case vbString
MsgBox "数値を入力してください。文字列「" & 入力値 & "」は処理できません。", _
vbExclamation, "入力エラー"
Case vbEmpty
MsgBox "何も入力されていません。", vbInformation, "入力なし"
Case Else
MsgBox "想定外の入力です。", vbCritical, "入力エラー"
End Select
End Sub
実行すると以下のようなメッセージボックスが表示されます。
テキストボックスに文字列を入力するとエラーメッセージが表示
テキストボックスに数値を入力すると計算が継続される
このサンプルコードは、
Application.InputBoxでユーザーからの入力を受け取り、VarType関数でその型を確認する
という内容です。
数値型の場合は計算処理を行い、文字列やその他の型の場合はエラーメッセージを表示。
これにより、ユーザーは正しい入力方法を理解でき、プログラムはエラーを避けることができます。
例2: エラーハンドリングに型判定を組み込む
VBAコードに型を判定するコードを組み込めば、
エラーの発生を未然に防ぐ、エラー発生時効率的にデバックができる
メリットを得ることができます。
VarType関数を使ったエラーハンドリングのサンプルコードがこちら
Sub エラーハンドリング例()
On Error GoTo エラー処理
' セルの値を取得
Dim セル値 As Variant
セル値 = ActiveCell.Value
' 値の型をチェック
Select Case VarType(セル値)
Case vbEmpty
MsgBox "セルが空です。値を入力してください。", vbInformation
Exit Sub
Case vbError
MsgBox "セルにエラー値が含まれています。", vbCritical
Exit Sub
Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency
' 数値の場合は計算処理
Debug.Print "セルの値: " & セル値
Debug.Print "値の2乗: " & セル値 ^ 2
Case vbString
' 文字列の場合は文字数カウント
Debug.Print "セルの値: " & セル値
Debug.Print "文字数: " & Len(セル値)
Case vbDate
' 日付の場合は曜日を表示
Debug.Print "セルの値: " & セル値
Debug.Print "曜日: " & WeekdayName(Weekday(セル値))
Case Else
MsgBox "このタイプの値は処理できません: " & VarType(セル値), vbExclamation
End Select
Exit Sub
エラー処理:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Resume Next
End Sub
このコードでは、アクティブセルの値を取得し、VarType関数でその型を判定しています。
実行結果がこちら
セルが空の場合やエラー値が含まれている場合は、適切なメッセージを表示します。
数値、文字列、日付など、値の型に応じて異なる処理を実行することで安定したマクロの作成が可能です。
例3: 条件付き書式に活用する方法
VBAで条件付き書式を設定する際にVarType関数を活用することで、セルの値の型に応じて異なる書式を適用することが可能です。
Sub 条件付き書式設定()
' 範囲を取得
Dim 対象範囲 As Range
Set 対象範囲 = Range("A1:D10")
' 条件付き書式をクリア
対象範囲.FormatConditions.Delete
' 各セルの値をチェックして書式を設定
Dim セル As Range
For Each セル In 対象範囲
' セルの値を取得
Dim セル値 As Variant
セル値 = セル.Value
' 値の型を調べる
Select Case VarType(セル値)
Case vbEmpty
' 空のセルには何もしない
Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency
' 数値の場合は値に応じて背景色を変える
If セル値 < 0 Then
' 負の値は赤背景
セル.Interior.Color = RGB(255, 200, 200)
ElseIf セル値 > 1000 Then
' 1000以上は緑背景
セル.Interior.Color = RGB(200, 255, 200)
End If
Case vbString
' 文字列の場合は青のフォント
セル.Font.Color = RGB(0, 0, 255)
Case vbDate
' 日付の場合は今日なら太字
If Int(セル値) = Int(Date) Then
セル.Font.Bold = True
End If
Case vbBoolean
' 論理値の場合は値に応じて書式
If セル値 = True Then
セル.Font.Color = RGB(0, 128, 0) ' 緑色
Else
セル.Font.Color = RGB(192, 0, 0) ' 赤色
End If
End Select
Next セル
MsgBox "条件付き書式を適用しました。", vbInformation
End Sub
このコードでは、指定した範囲の各セルの値の型をVarType関数で判定し、型に応じて異なる書式を適用しています。
数値の場合はその値に応じて背景色を変え、文字列の場合はフォント色を青にし、日付の場合は今日であれば太字にする
という内容です。
実行結果がこちら
VBAを使って書式設定を編集することで、効率的に見やすい資料が作れるようになります。
VarTypeを使った実践的なデバッグテクニック
VBAプログラミングでは、変数の型を正確に把握することがエラーの防止や処理の効率化につながります。
VarType関数は変数がどのデータ型なのかを数値で返してくれる便利な機能です。
ここからはデバッグやプログラムの品質向上に役立つVarTypeの実践的な活用方法を紹介します。
コード内の変数型を適切に判断できれば、予期せぬエラーを未然に防ぎ、より安定したマクロを作成することができるでしょう。
エラー発生を防ぐための型チェック活用法
プログラムのエラーは多くの場合、想定と異なる型のデータが変数に格納されることで発生します。
VarType関数を使って事前に変数の型をチェックすれば、こうしたエラーを簡単に防ぐことが可能です。
「型の不一致」エラーを未然に防ぐサンプルコードがこちら
Sub 型チェック例()
Dim myVar As Variant
myVar = Range("A1").Value
' 変数が数値型かどうかをチェック
If VarType(myVar) = vbInteger Or VarType(myVar) = vbLong Or VarType(myVar) = vbDouble Then
' 数値なら計算処理を実行
Debug.Print "数値です。計算結果: " & myVar * 2
Else
' 数値でなければ警告
Debug.Print "数値ではありません。型番号: " & VarType(myVar)
End If
End Sub
A1セルに数値を入れてVABを実行した結果
A1セルに文字列を入れてVABを実行した結果
このようなチェックをプログラム内の重要なポイントに組み込むことで、実行時エラーが大幅に減少し、ユーザー体験も向上します。
処理の高速化につながる型判定の最適化
VBAでは変数の型によって処理速度が大きく変わります。
特に大量のデータを扱う場合、適切な型を使うことで処理時間を大幅に短縮することが可能です。
VarType関数を使って変数の型を確認、最適な型に変換しマクロの実行速度を向上させましょう。
Sub 処理速度最適化()
Dim startTime As Double
Dim myData As Variant
myData = Range("A1:A1000").Value
startTime = Timer
' 配列の各要素を処理
For i = 1 To UBound(myData, 1)
' 文字列型なら数値に変換して処理を高速化
If VarType(myData(i, 1)) = vbString Then
If IsNumeric(myData(i, 1)) Then
myData(i, 1) = CDbl(myData(i, 1))
End If
End If
' 何らかの処理
If VarType(myData(i, 1)) = vbDouble Then
myData(i, 1) = myData(i, 1) * 1.1
End If
Next i
Debug.Print "処理時間: " & Timer - startTime & "秒"
End Sub
9行目から15行目のコードは、
入力されているテキストが数字にも関わらず文字列型のとき数値型に変換する
という内容です。
適切な型判定と変換により、特に大規模なデータ処理では処理時間が数倍速くなることもあります。
VarTypeとTypeNameを組み合わせた高度な型判定
より高度な型判定が必要な場合は、VarType関数とTypeName関数を組み合わせが効率的です。
VarTypeは数値コードを返すため機械的な判断に適しており、TypeNameは人間が読みやすい文字列を返します。
両者を組み合わせることで、より柔軟で読みやすいコードに仕上げることが可能です。
Sub 高度な型判定()
Dim testVar As Variant
Dim typeNum As Integer
Dim typeName As String
testVar = ActiveSheet
' VarTypeとTypeNameを組み合わせた判定
typeNum = VarType(testVar)
typeName = TypeName(testVar)
Debug.Print "型番号: " & typeNum
Debug.Print "型名: " & typeName
' オブジェクトの種類まで詳細に判定
If typeNum = vbObject Then
Select Case typeName
Case "Worksheet"
Debug.Print "これはワークシートオブジェクトです"
Case "Range"
Debug.Print "これはセル範囲オブジェクトです"
Case Else
Debug.Print "その他のオブジェクト: " & typeName
End Select
End If
End Sub
この組み合わせにより、特にオブジェクト型の詳細な識別が可能になり、複雑なプログラムでもより正確な条件分岐ができるようになります。
VarTypeの代替手段と比較
VBAでは変数の型を判定するためにVarType以外にもいくつかの関数が用意されていて、
それぞれの関数には得意な用途があり、状況に応じて使い分けることでコードの可読性と効率が向上します。
ここからは、
代替手段に必要なTypeName関数やIsNumeric関数などの使い方やVarTypeとの組み合わせ方
について解説します。
TypeName関数との違いと使い分け
VarType関数は数値コードを返しますが、TypeName関数は読みやすい文字列でデータ型を表します。
両者にはそれぞれ長所があり、使い分けることでコードの品質が向上します。
VarTypeは条件分岐での判定に向いている、TypeNameはデバッグやログ出力に向いている、
という違いがあります。
2つの関数を比較できるサンプルコードがこちら
Sub VarTypeとTypeName比較()
Dim testVar As Variant
testVar = 123.45
' VarTypeでの判定(数値コード)
Select Case VarType(testVar)
Case vbInteger
Debug.Print "整数型 (Integer)"
Case vbLong
Debug.Print "長整数型 (Long)"
Case vbDouble
Debug.Print "倍精度浮動小数点型 (Double)"
Case vbString
Debug.Print "文字列型 (String)"
End Select
' TypeNameでの判定(文字列)
Debug.Print "TypeNameの結果: " & TypeName(testVar)
End Sub
実行結果がこちら
12行目のコードと18行目のコードが出力結果となります。
複雑な条件分岐ではVarTypeを使った数値での出力が便利ですが、見やすいコードにするならTypeNameの方が便利です。
IsNumeric、IsDate関数との組み合わせ
VarTypeは型そのものを判定しますが、IsNumeric関数やIsDate関数は値が特定の型に変換可能かどうかを判定します。
これらを組み合わせることで、より柔軟なデータ検証が可能になります。特にユーザー入力値のバリデーションに効果的です。
Sub 型判定関数の組み合わせ()
Dim userInput As Variant
userInput = InputBox("数値または日付を入力してください")
' 入力が空でないか確認
If userInput = "" Then
MsgBox "入力がありません"
Exit Sub
End If
' VarTypeとIsNumeric/IsDateの組み合わせ
If VarType(userInput) = vbString Then
If IsNumeric(userInput) Then
MsgBox "これは数値に変換できる文字列です: " & CDbl(userInput)
ElseIf IsDate(userInput) Then
MsgBox "これは日付に変換できる文字列です: " & CDate(userInput)
Else
MsgBox "これは通常の文字列です"
End If
ElseIf VarType(userInput) = vbDouble Or VarType(userInput) = vbInteger Then
MsgBox "これはもともと数値型です"
End If
End Sub
実行するとテキスト入力フォームが表示されます。
入力するテキストの型によって処理結果が変化します。
型の判定だけでなく値の内容まで検証できるので安定したコード作りに役立ちます。
VBAの型判定関数の性能比較
複数の型判定関数がありますが、それぞれ性能特性が異なります。
大量のデータを処理する場合など、状況によって最適な関数を選択することが重要です。
VarType関数とIsNumeric関数の処理速度を比較できるサンプルコードがこちら
Sub 型判定関数の性能比較()
Dim testArray(1 To 10000) As Variant
Dim i As Long, startTime As Double
Dim numericCount1 As Long, numericCount2 As Long
' テストデータの準備
For i = 1 To 10000
If i Mod 2 = 0 Then
testArray(i) = i ' 数値
Else
testArray(i) = "Text" & i ' 文字列
End If
Next i
' VarTypeでの測定
startTime = Timer
For i = 1 To 10000
If VarType(testArray(i)) = vbInteger Or VarType(testArray(i)) = vbLong Or _
VarType(testArray(i)) = vbDouble Then
numericCount1 = numericCount1 + 1
End If
Next i
Debug.Print "VarType処理時間: " & Timer - startTime & "秒"
' IsNumericでの測定
startTime = Timer
For i = 1 To 10000
If IsNumeric(testArray(i)) Then
numericCount2 = numericCount2 + 1
End If
Next i
Debug.Print "IsNumeric処理時間: " & Timer - startTime & "秒"
Debug.Print "VarTypeで見つけた数値: " & numericCount1
Debug.Print "IsNumericで見つけた数値: " & numericCount2
End Sub
実行結果
本来であれば、数値を処理するコードの場合IsNumeric関数の方が処理速度が速くなるはずなのですが、
VarType関数の方が処理速度が速い
という結果になってしまいました。
数値を扱う場合は、なるべくIsNumeric関数を使った方がいい!と思っていたんですがこれからはVarType関数を積極的に使おうと思います。
【VarType関数】よくある質問と回答
VarType関数は非常に便利ですが、使用中に疑問や問題が生じることもあります。
ここからは、
VarType関数を扱うときのポイント、エラー対処法や複雑なケースでの判断方法など、
実務で役立つノウハウをご紹介します。
VarTypeがエラーを返す場合の対処法
VarType関数自体がエラーを返すことは稀ですが、特定の状況では問題が発生することがあります。
最も一般的なのは、
未初期化のオブジェクト変数(Nothingの状態)に対してVarTypeを使った場合
です。
こうした状況を回避するためのサンプルコードがこちら
Sub VarTypeエラー対処法()
Dim objTest As Object
Dim varTest As Variant
' エラーハンドリングを設定
On Error Resume Next
' 未初期化のオブジェクト変数
Debug.Print "オブジェクト変数の型: " & VarType(objTest)
If Err.Number <> 0 Then
Debug.Print "エラー発生: " & Err.Description
Err.Clear
End If
' オブジェクト変数を初期化
Set objTest = ActiveSheet
Debug.Print "初期化後の型: " & VarType(objTest)
' Nothingを明示的に代入
Set objTest = Nothing
Debug.Print "Nothing代入後: " & VarType(objTest)
' Emptyとの比較
varTest = Empty
Debug.Print "Empty変数の型: " & VarType(varTest)
On Error GoTo 0 ' エラーハンドリングを元に戻す
End Sub
10行目から13行目のコードは、エラーが発生した場合エラーをクリアする。
16行目のコードは、オブジェクト変数を初期化する。
という意味です。
オブジェクト変数がEmptyのときは「0」、オブジェクト変数がNothingのときは「9」が出力されます。
実行結果がこちら
特にオブジェクト変数を扱う場合は、Is Nothing判定とVarTypeを併用するとより安全です。
VarTypeの戻り値の解釈で迷ったときは?
VarTypeは数値コードを返すため、その意味を覚えていないと解釈に迷うことがあります。
そんなときは定数名(vbIntegerなど)を使うか、解釈用のヘルパー関数を作成すると便利です。
Function GetTypeName(varValue As Variant) As String
' VarTypeの戻り値を読みやすい文字列に変換する関数
Select Case VarType(varValue)
Case vbEmpty: GetTypeName = "Empty"
Case vbNull: GetTypeName = "Null"
Case vbInteger: GetTypeName = "Integer"
Case vbLong: GetTypeName = "Long"
Case vbSingle: GetTypeName = "Single"
Case vbDouble: GetTypeName = "Double"
Case vbCurrency: GetTypeName = "Currency"
Case vbDate: GetTypeName = "Date"
Case vbString: GetTypeName = "String"
Case vbObject: GetTypeName = "Object (" & TypeName(varValue) & ")"
Case vbBoolean: GetTypeName = "Boolean"
Case vbVariant: GetTypeName = "Variant"
Case vbDataObject: GetTypeName = "DataObject"
Case vbDecimal: GetTypeName = "Decimal"
Case vbByte: GetTypeName = "Byte"
Case vbArray + vbVariant: GetTypeName = "Variant配列"
Case Else
If VarType(varValue) And vbArray Then
GetTypeName = "配列 (" & GetTypeName(varValue(LBound(varValue))) & "型)"
Else
GetTypeName = "不明な型: " & VarType(varValue)
End If
End Select
End Function
Sub VarType解釈テスト()
Dim testVar As Variant
testVar = Range("A1").Value
' 読みやすい形式で型情報を表示
MsgBox "セルA1の内容の型: " & GetTypeName(testVar)
End Sub
実行結果がこちら
Functionを使ってヘルパー関数を作っておくと、デバッグ作業が格段に効率化されます。
複数の型に対応する変数を効率的に扱うには?
VBAでは同じ変数に異なる型の値を格納できますが、これを効率的に扱うにはVarTypeを使った分岐処理が効果的です。
特に外部データを取り込む場合や、ユーザー入力を処理する場合に役立ちます。
Sub 複数型対応の処理例()
Dim dataSheet As Worksheet
Dim dataRange As Range
Dim cell As Range
Dim processedCount As Long
Set dataSheet = ThisWorkbook.Sheets("データ")
Set dataRange = dataSheet.Range("A1").CurrentRegion
' 各セルのデータ型に応じて処理
For Each cell In dataRange
Select Case VarType(cell.Value)
Case vbEmpty
' 空セルは何もしない
Case vbString
' 文字列の場合
If IsNumeric(cell.Value) Then
' 数値として扱える文字列は変換して処理
cell.Value = CDbl(cell.Value)
cell.NumberFormat = "#,##0.00"
Else
' 通常の文字列
cell.Value = UCase(cell.Value) ' 大文字に変換
End If
processedCount = processedCount + 1
Case vbDouble, vbInteger, vbLong
' 数値の場合
If cell.Value < 0 Then
cell.Interior.Color = RGB(255, 200, 200) ' 負数は赤背景
End If
cell.NumberFormat = "#,##0.00"
processedCount = processedCount + 1
Case vbDate
' 日付の場合
cell.NumberFormat = "yyyy/mm/dd"
processedCount = processedCount + 1
Case vbBoolean
' 真偽値の場合
cell.Value = IIf(cell.Value, "はい", "いいえ")
processedCount = processedCount + 1
Case Else
' その他の型
cell.AddComment "未対応の型: " & TypeName(cell.Value)
End Select
Next cell
MsgBox "処理完了: " & processedCount & "個のセルを処理しました"
End Sub
処理結果がこちら
メッセージボックスで処理したセルの個数を表示してくれます。
このように型に応じた分岐処理を実装することで、多様なデータに対応できる堅牢なプログラムが作成できます。
まとめ:思い通りのVABが書けるようになるためにVarTypeは重要
VarType関数の重要ポイント
- エラー防止の強力なツール:変数の型を事前に確認することで、「型の不一致」エラーを未然に防げる
- コードの処理速度向上:適切な型変換によりマクロの実行速度が数倍速くなることもある
- 数値コードでの判定:VarTypeは型を数値で返すため、条件分岐での高速な判定に最適
- TypeName関数との組み合わせ:VarTypeの数値判定とTypeNameの文字列表示を用途に応じて使い分けると効果的
- IsNumeric等との連携:他の型判定関数と組み合わせることで、より柔軟なデータ検証が可能
VBAプログラミングにおいて変数の型管理は、安定したコードを書くための必要なスキルです。
VarType関数はこの型管理を助ける強力なツールでありマクロ開発の効率と品質を飛躍的に向上させます。
VBAの勉強を始めた頃、
変数の宣言や型なんてどうだっていい!作ったコードがちゃんと動けばOK!!
と思っていました。
もしかしたら、マメBlogで「変数なんて気にしないで!!」と紹介している記事があるかもしれません。。。
でも、複雑な処理をVBAで実現しようとしたら変数の宣言や型を正確に把握する行為は必要不可欠です。
VarType関数を自由に扱えるようになれば、文字列や数値、日付を自由自在に扱えるようになり思い通りのVBAコードがスラスラ書けるようになります。
一歩ずつVBAスキルのレベルをアップさせましょうー。
ディスカッション
コメント一覧
まだ、コメントがありません