Home » エクセルマクロ・Excel VBAの使い方 » 配列 » VBAで配列変数のメモリアドレスを確認する-VarPtr関数

VBAで配列変数のメモリアドレスを確認する-VarPtr関数

対象:Excel2007, Excel2010, Excel2013, Windows版Excel2016

VBAで配列変数のメモリアドレスを確認する-VarPtr関数

Excel VBA(Visual Basic for Applications)では、配列変数を使わなくてもかなりのことができます。

ですからプログラミングの経験がまったくない方の場合、配列の学習は後回しにするほうがいいと私は考えています。プログラミング経験のない方がVBAの書籍を購入する場合に、変数のすぐあとに配列の説明が書かれているような書籍は、一冊目の本としてはおすすめしません。

[スポンサードリンク]

もちろん、VBAでのプログラミング学習が進み、大量データをより速く処理したいといったニーズが出てきた段階などでは、配列変数について理解する必要が出てきます。

その際、
「変数とはデータを一時的に入れておく名前を付けた箱のようなもの」
といった例えの説明を拡張した、配列についての解説を見かけることも多いのですが、学習が進んだどこかの段階で、例え話ではなくメモリのアドレスを意識するほうがより理解を深められるはずです。

Byte型の配列変数でメモリアドレスを確認するサンプルマクロ

配列変数に限らず変数は、データの型によって確保するメモリのサイズが異なります。

メモリアドレスをはじめて意識するときには、1バイト(8ビット)の、Byte型の配列変数の様子を眺めるのがおすすめです。

Sub 配列変数のメモリアドレスを確認する()

 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 "===="

End Sub

上記のマクロを実行すると、VBAの隠し関数である・VarPtr関数で、

VBAで配列変数のメモリアドレスを確認する-VarPtr関数

配列変数の要素ごとのメモリアドレスが、イミディエイトウィンドウに出力されます。

VBAで配列変数のメモリアドレスを確認する-VarPtr関数

上記マクロでは、Byte型の配列にしているので、メモリアドレスは、連続した数値になっています(実際に出力される数値は、環境・タイミングによって異なりますが、連続する数値であることは変わりません)。

メモリから見ると、配列とはこのような連続したメモリ領域です。
この連続したメモリ領域のそれぞれに、配列要素の値が格納されるわけです。

Byte・Integer・Long型の配列変数でメモリアドレスを確認するサンプルマクロ

Byte型の配列変数で、連続したメモリ領域が確保されることを確認したら、型によって確保されるメモリのサイズが変化することを確認しましょう。

Sub 配列変数のメモリアドレスを確認する_さまざまなデータ型()

 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 "===="

End Sub

上記のマクロを実行すると、Byte型の配列変数はもちろん先のマクロと同じく「1」ずつ増えるメモリアドレスが出力され、

VBAで配列変数のメモリアドレスを確認する-VarPtr関数

Integerは2バイト(16ビット)ですから、Integer・整数型の配列変数は「2」ずつ増えるメモリアドレスが出力され、

VBAで配列変数のメモリアドレスを確認する-VarPtr関数

Longは4バイト(32ビット)ですから、Long・長整数型の配列変数は「4」ずつ増えるメモリアドレスが出力されます。

VBAで配列変数のメモリアドレスを確認する-VarPtr関数

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次元配列のメモリアドレスも確認しておきましょう。

Sub 配列変数のメモリアドレスを確認する_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 "===="

End Sub

2次元配列を、ヒトは表のようにイメージすることが多いはずですが、メモリ側から眺めると、表でもなんでもなく、連続したメモリ領域に過ぎないことが見えてきます。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » 配列 » VBAで配列変数のメモリアドレスを確認する-VarPtr関数

「配列」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.