01-VBA

ExcelVBAの変数 (Part.3) バリアント型編 | 現役エンジニア&プログラミングスクール講師

目標

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

実行結果

以下のように表示されます。



出力を表でまとめてみます。
変数名    値    varType
(型を表す番号)
データの長さ
varSample00(Empty) 0
varSample1123452(Integer)5
varSample2123.4565(Double)7
varSample3文字列8(String) 3
varSample4True(真偽値)11(Boolean)4
varSample5Date(日付)7(Date) 10

上記のプログラムでは「varSample0」 から 「varSample5」 は全て「Variant型」として利用されています。値を代入(初期化)すると、MsgBoxの通り、Variant型変数で呼び出せる値の型が確認できます。

Variant型変数では、初期化した後からでも、別の型の代入(整数↔文字列などの型の変更)が行えます。varType関数で返されている型は変数の型ではなく、Variant型変数で呼び出せる値の型となっています。

これまで、変数の宣言時に「データ型」の指定を行いました。これは変数に「データ型」が存在することを意味します(静的型付け)。そして、変数に結び付く「値」は、必ず「データ型」を持っています。(例:「1」は整数型)

このように値(リテラル)が持つ「データ型」と変数が持つ「データ型」が共通でないと変数に代入できないというのが基本の考え方です。今回のvarType関数では、このリテラルの型が返されていました。

バリアント型がよく用いられる利用パターンに配列があります。それ以外には、型は決まっていないけど、とりあえず間に合わせの変数が欲しいときなどでも利用します。

バリアント型の変数にオブジェクト型や配列を入れてみる

オブジェクト型や配列が扱うのは参照です。メモリの住所が変数へ代入されます。

サンプルプロシージャ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

実行結果

以下のように表示されます

変数名VarPtr
メモリアドレス
varType
(型を表す番号)
データの長さ
配列の長さ
varSample615917540634000(Empty)0
varSample715917540633528204(Variant + Array)4

今回は参照を代入するというオブジェクト型変数の働きからVarPtr関数で出力したメモリアドレスの値をテーブルに記載してみました。

メモリアドレスはIntegerやStringなどで宣言した変数でも確認ができます。

データの長さについては「0」となっています。これはオブジェクトとして参照しようとするセルC3に数値や文字の値が入っていなかったためです。オブジェクト型変数は参照をSetで代入すします。セルに値がある場合は、値への直接的なアクセスができるようになります。

配列も基本的には参照を利用する変数です。配列の場合はデータの長さをLen関数で表示しようとするとエラーになります。配列についてはUBound関数を利用して要素数を数えています。

参照のイメージ

参照のイメージは値の共有ができるシステムです。オブジェクト型や配列は参照(値を共有できるシステム)で管理されます。その他の基本的な型は値を個別に管理するシステムと言えます。

  • 参照…値の共有ができるシステム
  • 値を個別に管理…それぞれが値を別々に管理するシステム

イラストでは下のようなイメージです。(左:参照、右:個別に管理)

プログラムでの確認

オブジェクト変数を利用した参照のプログラム

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”に対して上書きを行うことになります。

参照をしない通常の変数を利用したプログラム

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

参照でないプログラムの実行結果

全ての変数に対して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

実行結果

同じvarSample1変数を何度も上書きしています。バリアント型は値の上書きが柔軟にできる変数です。今回は以上となります。

初心者も実践で通用!「VBA・VBS」おすすめ書籍5選 | 現役エンジニア&プログラミングスクール講師「VBA・VBS」初心者の方が実践業務の中でそれらを活用しt活躍できるために必要な知識を習得できる書籍を紹介しています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】| 現役エンジニア&プログラミングスクール講師「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST
01-VBA

制御構文|Excel VBA (Part.2)【If Then】基本編 | 現役エンジニア&プログラミングスクール講師

2022年11月10日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

Excel VBA の エラー処理(Part.2)| 現役エンジニア&プログラミングスクール講師

2022年12月27日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

Excel VBA の「オブジェクト活用」(Part.1)【ワークシートと行列の活用編】| 現役エンジニア&プログラミングスクール講師

2022年12月14日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

クラスの利用方法|Excel VBA (Part.1) | 現役エンジニア&プログラミングスクール講師

2023年2月17日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

演算子|Excel VBA (Part.5)【論理演算子】| 現役エンジニア&プログラミングスクール講師

2022年10月29日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

制御構文|Excel VBA (Part.1) 概要編 | 現役エンジニア&プログラミングスクール講師

2022年11月8日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site