目標
VBAのバリアント型を理解してい利用できる。
VBAのバリアント型の概要と利用方法
バリアント型ってなんだ?(概要)
変数宣言で型を指定しない場合は、このバリアント型として変数が準備されます。バリアント型は、数値だと最大16バイト分、文字列であれば22バイト+超過文字列分の大きなサイズを使用できる『なんでも入る型』です。
バリアント型を使ってみる(利用方法)
ここではバリアント型の変数に色々な値を入れてみるプログラムを作成して動きを確認します。
サンプルプロシージャ1
次のスクリプトを実行してみます。
Option Explicit
Sub varSample_Part1()
Worksheets("Sheet1").Activate
Dim varSample0
Dim varSample1 As Variant
Dim varSample2 As Variant
Dim varSample3 As Variant
Dim varSample4 As Variant
Dim varSample5 As Variant
varSample1 = 12345
varSample2 = 123.456
varSample3 = "文字列"
varSample4 = True
varSample5 = Date
MsgBox _
"varSample0:" & Chr(9) & varSample0 & Chr(9) & Chr(9) & VarType(varSample0) & Chr(9) & Len(varSample0) & Chr(10) & _
"varSample1:" & Chr(9) & varSample1 & Chr(9) & Chr(9) & VarType(varSample1) & Chr(9) & Len(varSample1) & Chr(10) & _
"varSample2:" & Chr(9) & varSample2 & Chr(9) & Chr(9) & VarType(varSample2) & Chr(9) & Len(varSample2) & Chr(10) & _
"varSample3:" & Chr(9) & varSample3 & Chr(9) & Chr(9) & VarType(varSample3) & Chr(9) & Len(varSample3) & Chr(10) & _
"varSample4:" & Chr(9) & varSample4 & Chr(9) & Chr(9) & VarType(varSample4) & Chr(9) & Len(varSample4) & Chr(10) & _
"varSample5:" & Chr(9) & varSample5 & Chr(9) & VarType(varSample5) & Chr(9) & Len(varSample5) & Chr(10)
End Sub
実行結果
以下のように表示されます。
![](https://howahowablog.com/wp-content/uploads/2022/09/バリアント型1.png)
出力を表でまとめてみます。
変数名 | 値 | varType (型を表す番号) | データの長さ |
varSample0 | 空 | 0(Empty) | 0 |
varSample1 | 12345 | 2(Integer) | 5 |
varSample2 | 123.456 | 5(Double) | 7 |
varSample3 | 文字列 | 8(String) | 3 |
varSample4 | True(真偽値) | 11(Boolean) | 4 |
varSample5 | Date(日付) | 7(Date) | 10 |
上記のプログラムでは「varSample0」 から 「varSample5」 は全て「Variant型」として利用されています。値を代入(初期化)すると、MsgBoxの通り、Variant型変数で呼び出せる値の型が確認できます。
Variant型変数では、初期化した後からでも、別の型の代入(整数↔文字列などの型の変更)が行えます。varType関数で返されている型は変数の型ではなく、Variant型変数で呼び出せる値の型となっています。
![](https://howahowablog.com/wp-content/uploads/2024/04/image-30.png)
バリアント型がよく用いられる利用パターンに配列があります。それ以外には、型は決まっていないけど、とりあえず間に合わせの変数が欲しいときなどでも利用します。
バリアント型の変数にオブジェクト型や配列を入れてみる
サンプルプロシージャ2
次のスクリプトを実行してみます。
Sub varSample_Part2()
Worksheets("Sheet1").Activate
Dim varSample6 As Variant
Set varSample6 = Range("C3")
Dim varSample7 As Variant
varSample7 = Array(12345, "あいうえお", 123.456, False, Date)
MsgBox _
"varSample6:" & Chr(9) & VarPtr(varSample6) & Chr(9) & Chr(9) & VarType(varSample6) & Chr(9) & Len(varSample6) & Chr(10) & _
"varSample7:" & Chr(9) & VarPtr(varSample7) & Chr(9) & Chr(9) & VarType(varSample7) & Chr(9) & UBound(varSample7) & Chr(10) & _
"varSample7(0):" & Chr(9) & VarPtr(varSample7(0)) & Chr(10) & _
"varSample7(1):" & Chr(9) & VarPtr(varSample7(1)) & Chr(10) & _
"varSample7(2):" & Chr(9) & VarPtr(varSample7(2)) & Chr(10) & _
"varSample7(3):" & Chr(9) & VarPtr(varSample7(3)) & Chr(10) & _
"varSample7(4):" & Chr(9) & VarPtr(varSample7(4)) & Chr(10) & _
"varSample7:" & varSample7(0) & "," & varSample7(1) & "," & varSample7(2) & "," & varSample7(3) & "," & varSample7(4)
End Sub
実行結果
以下のように表示されます
![](https://howahowablog.com/wp-content/uploads/2022/09/バリアント型2-5.png)
変数名 | VarPtr メモリアドレス | varType (型を表す番号) | データの長さ 配列の長さ |
varSample6 | 1591754063400 | 0(Empty) | 0 |
varSample7 | 1591754063352 | 8204(Variant + Array) | 4 |
今回は参照を代入するというオブジェクト型変数の働きからVarPtr関数で出力したメモリアドレスの値をテーブルに記載してみました。
データの長さについては「0」となっています。これはオブジェクトとして参照しようとするセルC3に数値や文字の値が入っていなかったためです。オブジェクト型変数は参照をSetで代入すします。セルに値がある場合は、値への直接的なアクセスができるようになります。
配列も基本的には参照を利用する変数です。配列の場合はデータの長さをLen関数で表示しようとするとエラーになります。配列についてはUBound関数を利用して要素数を数えています。
参照のイメージ
参照のイメージは値の共有ができるシステムです。オブジェクト型や配列は参照(値を共有できるシステム)で管理されます。その他の基本的な型は値を個別に管理するシステムと言えます。
- 参照…値の共有ができるシステム
- 値を個別に管理…それぞれが値を別々に管理するシステム
イラストでは下のようなイメージです。(左:参照、右:個別に管理)
![](https://howahowablog.com/wp-content/uploads/2024/04/整数を入れるもの-浮動少数点数型を入れるもの-文字列をいれるもの-通貨型-日付型-オブジェクト型-バリアント型-1024x576.jpg)
プログラムでの確認
オブジェクト変数を利用した参照のプログラム
Sub compareVariable1()
Dim Sample1 As Range
Dim Sample2 As Range
Dim Sample3 As Range
Range("C3").Value = "ABC"
Set Sample1 = Range("C3")
Set Sample2 = Range("C3")
Set Sample3 = Range("C3")
Sample1 = "EFG"
MsgBox "Sample2:" & Chr(9) & Sample2 & Chr(10) & _
"Sample3:" & Chr(9) & Sample3 & Chr(10)
End Sub
参照の実行結果
全てのオブジェクト変数に対してRange(“C3”)への参照を代入しています。この時点で全ての変数で”ABC”という値を共有して読み書きができる状態になっています。
その後、Sample1に対して”EFG”を代入していますが、これはSample2やSample3も同時に見ている”ABC”に対して上書きを行うことになります。
![](https://howahowablog.com/wp-content/uploads/2022/09/バリアント型5.png)
参照をしない通常の変数を利用したプログラム
Sub compareVariable2()
Dim Sample1 As String
Dim Sample2 As String
Dim Sample3 As String
Range("C3").Value = "ABC"
Sample1 = Range("C3").Value
Sample2 = Range("C3").Value
Sample3 = Range("C3").Value
Sample1 = "EFG"
MsgBox "Sample2:" & Chr(9) & Sample2 & Chr(10) & _
"Sample3:" & Chr(9) & Sample3 & Chr(10)
End Sub
参照でないプログラムの実行結果
![](https://howahowablog.com/wp-content/uploads/2022/09/バリアント型6.png)
全ての変数に対してRange(“C3”).Value(値)を代入しています。この時点で全ての変数で”ABC”という値が保管されました。
その後、Sample1に対して”EFG”を代入していますが、参照とは違ってSample2やSample3、セルC3には変化はありません。
以上が、参照と値の個別管理のそれぞれの動きです。
バリアント型変数の値を別の値で上書きしてみる
サンプルプロシージャ3(プログラムを書いてみる)
(結果表示に今回はイミディエイトウィンドウを利用しています)
Sub varSample_Part3()
Worksheets("Sheet1").Activate
Dim varSample1 As Variant
varSample1 = 12345
Debug.Print "値"; Chr(9); varSample1 & Chr(9); Chr(9) & " VarType:"; Chr(9); VarType(varSample1)
varSample1 = 123.456
Debug.Print "値"; Chr(9); varSample1 & Chr(9); Chr(9) & " VarType:"; Chr(9); VarType(varSample1)
varSample1 = "文字列"
Debug.Print "値"; Chr(9); varSample1 & Chr(9); Chr(9) & " VarType:"; Chr(9); VarType(varSample1)
varSample1 = True
Debug.Print "値"; Chr(9); varSample1 & Chr(9); Chr(9) & " VarType:"; Chr(9); VarType(varSample1)
varSample1 = Date
Debug.Print "値"; Chr(9); varSample1 & Chr(9) & " VarType:"; Chr(9); VarType(varSample1)
Set varSample1 = Range("C3")
Debug.Print "値"; Chr(9); varSample1 & Chr(9); Chr(9); Chr(9) & " VarType:"; Chr(9); VarType(varSample1)
End Sub
実行結果
![](https://howahowablog.com/wp-content/uploads/2022/09/バリアント型7.png)
同じvarSample1変数を何度も上書きしています。バリアント型は値の上書きが柔軟にできる変数です。今回は以上となります。
![](https://howahowablog.com/wp-content/uploads/2022/09/EXCEL-VBA-おすすめ書籍5選-320x180.jpg)
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。
![](https://howahowablog.com/wp-content/uploads/2022/04/Google-Chrome-:ブックマー-Microsoft-Edge:お気に入り-登録・削除方法-320x180.jpg)
![](https://howahowablog.com/wp-content/uploads/2022/12/パソコン選び-320x180.jpg)