リストHOME  リストOpen Source

第15回VBAプログラム豆知識

概要 ~ データ型のVariant ~

 今回は、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型


 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】ボタンで、上記のプログラムが確認できます。



第14回  <  >  第16回



ダウンロード

 以下から、今回の豆知識で紹介した内容のエクセルファイルがダウンロードできます。

サンプルのダウンロード



所感

 私自身、Variant型について少し、曖昧に解釈していたところがありましたので、自分自身が勉強するつもりで、今回は、Variant型をテーマにしてみました。実際に、やってみて、やはり、正しく理解できていないところが、幾つかありましたので、テーマにして良かったと思いました。



サンプルデータについて

 サンプルに含まれるデータは、私の創作によるものです、サンプルデータに含まれる個人名、会社名などの情報は、実在の人物とはまったく関係ありません。



連絡先

 ご意見・ご要望等ありましたら、画面最下部のメールアドレスまでご連絡ください。




エクセルバックアップ・ページのフッター
管理者のメールアドレス