今回は、VBAプログラムのデータ型の中の一つVariant型について、説明したいと思います。Variant型は、様々なデータ型を格納でき、そのサイズは、16バイトとなっています。
サンプルのダウンロード
また、数値データとして、使用した場合、取りうる範囲は-1.797693134862315E308~1.797693134862315E308となります。ここでの、値の表現ですが、E308は10の308乗を表しています。コンピュータの世界で、数値が大きくなると、このように10のn乗を使った表現を使用します。
ですので、
1.797693134862315E308 ≒ 1.8×(10^308)
ということになります。
エクセルのセルでも数値の桁数(12桁以上)が多くなると、このような表現になりますよね。
Variant型は、いずれのデータ型も格納できますが、値が代入されると、そのタイミングで、代入されたデータの型となります。数値が代入された場合、何かしらの演算中に元の型の上限を超ると、オーバーフローしないサイズのデータ型に昇格します。ただし、Variant型の取りうる上限を超えた場合は、オーバーフローしてしまいます。
ある型のデータが代入されたVariant型変数に新たに、違う型のデータを代入すると今度は、そのデータ型の変数となります。
どの型が代入されていても、String型としての参照や評価が許されています。
以下のように、変数を宣言せずに、使用するとその変数は、Variant型となります(モジュールの先頭に、Option Explicit記述していない場合)。
Public Sub SampleFunction()
a = 200
b = "Thank You!"
a = "You are welcome."
Debug.Print a
End Sub
以上でVariant型の大まかな特徴は説明が出来ましたので、次は、Variant型に代入されたデータの型を取得する方法を説明したいと思います。型を判定するための2つのVarType関数とTypeName関数の使用方法について、紹介します。
一つ目は、VarType関数で、引数に判定したい変数を指定して呼び出します。戻り値に、引数に渡されたデータの型が値として返却されます。返却される値の一覧はMSDNのVarType関数のページを参考にしてください。サンプルプログラムは、サンプルファイルの【VarType】ボタンを押すことで実行できます。
'VarType関数の使用例
Public Sub Sample_VarType()
Dim v As Variant
Dim v1 As Byte
Dim v2 As Integer
Dim v3 As Long
Dim v4 As Boolean
Dim v5 As Single
Dim v6 As Double
Dim v7 As Date
Dim v8 As Variant
Dim typ As VbVarType
'値が設定されていない状態
typ = VarType(v)
Debug.Print "typ=" & typ
'Array
v = Array("Test1", "Test2", "Test3")
typ = VarType(v)
Debug.Print "type=" & typ
'Byte
v1 = 1
v = v1
typ = VarType(v)
Debug.Print "type=" & typ
'Integer
v2 = 1
v = v2
typ = VarType(v)
Debug.Print "type=" & typ
'Long
v3 = 1
v = v3
typ = VarType(v)
Debug.Print "type=" & typ
'Boolean
v4 = True
v = v4
typ = VarType(v)
Debug.Print "type=" & typ
'Single
v5 = 0.1
v = v5
typ = VarType(v)
Debug.Print "type=" & typ
'Double
v6 = 0.1
v = v6
typ = VarType(v)
Debug.Print "type=" & typ
'Date
v7 = Date
v = v7
typ = VarType(v)
Debug.Print "type=" & typ
'Variant変数に-1を代入するとInteger型になります。
v8 = -1
v = v8
typ = VarType(v)
Debug.Print "type=" & typ
End Sub
二つ目は、TypeName関数で、引数に判定したい変数を指定して呼び出します。戻り値に、引数に渡されたデータの型が文字列として返却されます。返却される文字列値は、データの型と同一です。サンプルプログラムは、サンプルファイルの【TypeName】ボタンを押すことで実行できます。
'TypeName関数の使用例
Public Sub Sample_TypeName()
Dim v As Variant
Dim v1 As Byte
Dim v2 As Integer
Dim v3 As Long
Dim v4 As Boolean
Dim v5 As Single
Dim v6 As Double
Dim v7 As Date
Dim v8 As Variant
Dim typ As String
'値が設定されていない状態
typ = TypeName(v)
Debug.Print "typ=" & typ
'Array
v = Array("Test1", "Test2", "Test3")
typ = TypeName(v)
Debug.Print "type=" & typ
'Byte
v1 = 1
v = v1
typ = TypeName(v)
Debug.Print "type=" & typ
'Integer
v2 = 1
v = v2
typ = TypeName(v)
Debug.Print "type=" & typ
'Long
v3 = 1
v = v3
typ = TypeName(v)
Debug.Print "type=" & typ
'Boolean
v4 = True
v = v4
typ = TypeName(v)
Debug.Print "type=" & typ
'Single
v5 = 0.1
v = v5
typ = TypeName(v)
Debug.Print "type=" & typ
'Double
v6 = 0.1
v = v6
typ = TypeName(v)
Debug.Print "type=" & typ
'Date
v7 = Date
v = v7
typ = TypeName(v)
Debug.Print "type=" & typ
'Variant変数に-1を代入するとInteger型になります。
v8 = -1
v = v8
typ = TypeName(v)
Debug.Print "type=" & typ
End Sub
最後に、Variant型の便利な使用法を紹介して、今回のお話を終わりにしたいと思います。
Variant型は、エクセルシートに記述されているデータを、範囲指定して、一括で2次元配列として取り込むことが可能となっています。2次元配列を確保して、プログラムで一つずつ代入しいく方法に比べて、非常に、容易に取り込めますので、是非参考にしてみてください。
Public Sub Sample_ListBox()
Dim lst As Variant
Dim i As Long
'Variant型で、2次元配列としてシートのデータを取得できます。
lst = ThisWorkbook.Worksheets("MST_STAFF").Range("A2:I12")
'一旦リストをクリア
Sheet1.LBoxSample.Clear
'リストを2列表示に設定
Sheet1.LBoxSample.ColumnCount = 2
'リストにデータを設定
Sheet1.LBoxSample.List = lst
'データを出力
For i = 1 To 11
Debug.Print lst(i, 1), lst(i, 2), lst(i, 3), _
lst(i, 4), lst(i, 5), lst(i, 6), _
lst(i, 7), lst(i, 8), lst(i, 9)
Next i
Erase lst
End Sub
サンプルファイルの【ListBox】ボタンで、上記のプログラムが確認できます。
以下から、今回の豆知識で紹介した内容のエクセルファイルがダウンロードできます。
サンプルのダウンロード
私自身、Variant型について少し、曖昧に解釈していたところがありましたので、自分自身が勉強するつもりで、今回は、Variant型をテーマにしてみました。実際に、やってみて、やはり、正しく理解できていないところが、幾つかありましたので、テーマにして良かったと思いました。
サンプルに含まれるデータは、私の創作によるものです、サンプルデータに含まれる個人名、会社名などの情報は、実在の人物とはまったく関係ありません。
ご意見・ご要望等ありましたら、画面最下部のメールアドレスまでご連絡ください。