Excel VBA(Visual Basic for Applications)では、配列変数を使わなくてもかなりのことができます。
ですからプログラミングの経験がまったくない方の場合、配列の学習は後回しにするほうがいいと私は考えています。プログラミング経験のない方がVBAの書籍を購入する場合に、変数のすぐあとに配列の説明が書かれているような書籍は、一冊目の本としてはおすすめしません。
もちろん、VBAでのプログラミング学習が進み、大量データをより速く処理したいといったニーズが出てきた段階などでは、配列変数について理解する必要が出てきます。
その際、
「変数とはデータを一時的に入れておく名前を付けた箱のようなもの」
といった例えの説明を拡張した、配列についての解説を見かけることも多いのですが、学習が進んだどこかの段階で、例え話ではなくメモリのアドレスを意識するほうがより理解を深められるはずです。
Byte型の配列変数でメモリアドレスを確認するサンプルマクロ
配列変数に限らず変数は、データの型によって確保するメモリのサイズが異なります。
メモリアドレスをはじめて意識するときには、1バイト(8ビット)の、Byte型の配列変数の様子を眺めるのがおすすめです。
Dim arr(1 To 3) As Byte
Dim n As Long
For n = LBound(arr) To UBound(arr)
Debug.Print _
"arr(" & n & ")", _
VarPtr(arr(n))
Next n
Debug.Print "===="
上記のマクロを実行すると、VBAの隠し関数である・VarPtr関数で、
配列変数の要素ごとのメモリアドレスが、イミディエイトウィンドウに出力されます。
上記マクロでは、Byte型の配列にしているので、メモリアドレスは、連続した数値になっています(実際に出力される数値は、環境・タイミングによって異なりますが、連続する数値であることは変わりません)。
メモリから見ると、配列とはこのような連続したメモリ領域です。
この連続したメモリ領域のそれぞれに、配列要素の値が格納されるわけです。
Byte・Integer・Long型の配列変数でメモリアドレスを確認するサンプルマクロ
Byte型の配列変数で、連続したメモリ領域が確保されることを確認したら、型によって確保されるメモリのサイズが変化することを確認しましょう。
Dim arr_byte(1 To 3) As Byte
Dim arr_int(1 To 3) As Integer
Dim arr_lng(1 To 3) As Long
Dim n As Long
For n = LBound(arr_byte) To UBound(arr_byte)
Debug.Print _
"arr_byte(" & n & ")", _
VarPtr(arr_byte(n))
Next n
Debug.Print "--"
For n = LBound(arr_int) To UBound(arr_int)
Debug.Print _
"arr_int(" & n & ")", _
VarPtr(arr_int(n))
Next n
Debug.Print "--"
For n = LBound(arr_lng) To UBound(arr_lng)
Debug.Print _
"arr_lng(" & n & ")", _
VarPtr(arr_lng(n))
Next n
Debug.Print "--"
Debug.Print "===="
上記のマクロを実行すると、Byte型の配列変数はもちろん先のマクロと同じく「1」ずつ増えるメモリアドレスが出力され、
Integerは2バイト(16ビット)ですから、Integer・整数型の配列変数は「2」ずつ増えるメモリアドレスが出力され、
Longは4バイト(32ビット)ですから、Long・長整数型の配列変数は「4」ずつ増えるメモリアドレスが出力されます。
VarPtr関数は、変数の先頭のメモリアドレスを返しますから、2バイトのメモリを使うIntegerの場合は「2」ずつ増え、4バイトのメモリを使うLongの場合は「4」ずつ増えています。
Integerの変数は確保された2バイトの領域に、「-32,768」から「32,767」の範囲の整数が代入され、Longの変数は確保された4バイトの領域に、「-2,147,483,648」から「2,147,483,647」の整数が代入されるわけです。
ちなみに、Integerの-32,768~32,767を意識したことがないという方は、2の16乗を1/2してみることをおすすめします。Longの-2,147,483,648~2,147,483,647を意識したことがないという方は、2の32乗を1/2してみることをおすすめします。
2次元配列のメモリアドレスを確認するサンプルマクロ
2次元配列のメモリアドレスも確認しておきましょう。
Dim arr(1 To 3, 1 To 2) As Byte
Dim x As Long, y As Long
For y = LBound(arr, 2) To UBound(arr, 2)
For x = LBound(arr, 1) To UBound(arr, 1)
Debug.Print _
"arr(" & x & ", " & y & ")", _
VarPtr(arr(x, y))
Next x
Debug.Print "--"
Next y
Debug.Print "===="
2次元配列を、ヒトは表のようにイメージすることが多いはずですが、メモリ側から眺めると、表でもなんでもなく、連続したメモリ領域に過ぎないことが見えてきます。
- Newer:VBAの型宣言文字一覧
- Older:VBAからIFERROR関数を入力する
Home » エクセルマクロ・Excel VBAの使い方 » 配列 » VBAで配列変数のメモリアドレスを確認する-VarPtr関数