デジタルトレンドナビ
システム開発

2024.03.18

【VBA】使えると便利な動的配列の使い方を解説!

【VBA】使えると便利な動的配列の使い方を解説!

VBAの配列には、大きく分けると静的配列と動的配列がありますが、違いがわからないという方がいるのではないでしょうか。とくに、動的配列はVBAを使用するうえでとても便利です。


そこで本記事では、VBAの配列について、静的配列と動的配列の違いや動的配列の初期化方法を解説します。そのほか、LBound関数とUBound関数の違いもお伝えするので、関数を使いこなしたい方はぜひ参考にしてください。

この記事でわかること

  • VBAの配列とは何か
  • 静的配列と動的配列の違い
  • 動的配列を初期化する方法
  • LBound関数やUBound関数とは何か

VBAの配列とは?

VBAの配列とは?

そもそもVBAは「Visual Basic for Applications」の略語であり、ExcelやPowerPointなどのMicrosoft Officeのアプリケーションの機能を拡張するためのプログラミング言語です。

VBAの配列とは、複数の値を1度に格納できる変数を指します。わかりやすくいうと、複数の部屋がひとつの建物になっているアパートや集合住宅のようなものです。通常の変数は、ひとつの箱にひとつの要素しか入れられません。

配列は複数の要素を格納できるので、従来の変数と比べて、メモリ使用量を削減できる可能性があります。要素を識別するための番号である添字を指定すると、データへのアクセスが可能です。

また、配列を活用することで、データの管理が容易になり、処理速度が向上する場合があります。結果的に、データの処理や検索の効率化につながるメリットがあります。

ただし、従来の変数よりも配列のほうが複雑です。指定する添字の使い方を間違えると、エラーが発生してしまうおそれがあります。

静的配列・動的配列の違い

静的配列・動的配列の違い

静的配列と動的配列は、どちらもVBAで利用できる配列です。それぞれ異なる特徴を持っているので、使い分けることがポイントです。

静的配列は、宣言時に要素数を固定する必要があります。宣言したときにメモリを確保するので、あとから要素数の変更ができません。アクセス速度は、動的配列よりも速い傾向にあります。

また、静的配列はシンプルでわかりやすい内容となっています。要素数の変更ができないものの、事前に要素数がわかっているケースにおすすめです。

一方で動的配列は、宣言時に要素数を指定する必要はなく、あとで変更することができます。メモリは使用時に必要な分だけ動的に確保するので、必要に応じて要素数の増減が可能です。アクセス速度は、静的配列よりも遅い傾向にあります。

また、動的配列はあとから要素数の変更が可能なので、事前に要素数がわかっていない場合や、要素数の増減が想定される場合におすすめです。柔軟性が高い点が、動的配列ならではの魅力となっています。

動的配列変数とは?

動的配列変数とは?

動的配列変数とは、要素数や次元数をプログラム実行時に動的に変更できる配列変数です。データ量や構造が事前にわからない場合でも、プログラム実行時に必要なサイズに調整できます。

ここでは、動的配列変数の使用例をご紹介します。具体的な使用例がイメージできない場合は、ぜひ参考にしてください。

動的配列の宣言と要素数の確定

動的1次元配列の宣言と要素数の確定について、要素に値を代入し、配列の要素を出力するまでを記載しています。

Dim arr() As Integer

‘要素数を設定
ReDim arr(10)

‘要素に値を代入
arr(0) = 1
arr(1) = 2
arr(2) = 3

‘配列の要素を出力
For i = 0 To UBound(arr)
Debug.Print arr(i)
Next i

動的2次元配列の宣言と要素数の確定について、要素への値の代入、配列の要素を出力するまでの流れは以下のとおりです。

Dim arr2() As String

‘要素数を設定
ReDim arr2(2, 3)

‘要素に値を代入
arr2(0, 0) = “A”
arr2(0, 1) = “B”
arr2(0, 2) = “C”
arr2(1, 0) = “D”
arr2(1, 1) = “E”
arr2(1, 2) = “F”

‘配列の要素を出力
For i = 0 To UBound(arr2, 1)
For j = 0 To UBound(arr2, 2)
Debug.Print arr2(i, j)
Next j
Next i

動的配列変数を宣言するときは、()のなかを空にすることがポイントです。ReDimで要素数が設定されるのは、処理によってデータの要素数が確定したあととなります。

ReDimは繰り返し宣言することができますが、宣言するたびに内部データが削除されてしまいます。データ型の指定は、宣言時のデータ型と同じでないとエラーが発生するおそれがあるでしょう。

動的配列の初期化方法

動的配列の初期化方法

動的配列を初期化する方法は、RedimやRedim Preserve、Eraseなどさまざまな方法があります。Redimで動的配列を初期化する場合、すべてのデータが初期化されてしまいます。

Redim Preserveの場合は、値を残して伸縮が可能です。Eraseで初期化する際、Redimと同じくすべてのデータを初期化することができます。

Sub sample3()

Dim ary() As String

ReDim ary(2) As String
ary(0) = “A”
ary(1) = “B”
ary(2) = “C”
Debug.Print Join(ary)

ReDim ary(3) As String
ary(3) = “D”
Debug.Print Join(ary)

ReDim Preserve ary(4) As String
ary(0) = “A”
ary(1) = “B”
ary(2) = “C”
ary(4) = “E”
Debug.Print Join(ary)

Erase ary
Debug.Print Join(ary)
‘ Debug.Print LBound(ary), UBound(ary);

End Sub

LBound関数とは?

LBound関数とは?

LBound関数とは、VBAで配列の最小添字を取得するために使用される関数です。LBound関数の書式は、以下のとおりです。

LBound(arrayname,dimension)

「arrayname」には配列変数の名前を指定し「dimension」にはインデックス番号の最小値を入力します。dimensionを省略した場合は、自動的に「1」が使用されます。

新しいシートを追加し、セルのなかに名前を入れる場合、以下のようなコードを入力すると良いでしょう。

Sub LBound関数の使い方()
Dim i As Integer
Dim 名前 As Variant
名前 = Array(“◯◯”, “××”, “◎◎”, “△△”, “☆☆”)
For i = LBound(名前) To UBound(名前)
Cells(i + 2, 2) = 名前(i)
Next
End Sub

「Dim i As Integer」から「Dim 名前 As Variant」にかけて、Integer型の「i」変数を宣言したら、バリアント型の「名前」変数を宣言します。「名前 = Array(“◯◯”, “××”, “◎◎”, “△△”, “☆☆”)」では、セルのなかに入れる名前をカンマ区切りで格納していきます。

「For i = LBound(名前) To UBound(名前)」から「Next」にかけては、変数「i」をLBound関数を使用しますが「名前」変数のインデックスの最小値からUBound関数を使用するのが一般的です。

UBound関数と組み合わせることで「氏名」変数のインデックスの最大値まで繰り返し処理を行うことが可能です。

「Cells(i + 2, 2) = 名前(i)」は「i+2」が◯列の2行目であることを示しています。必要に応じて、数字の部分を変更すると良いでしょう。

UBound関数とは?

UBound関数とは?

UBound関数とは、VBAで配列の最大添字を取得するために使用される関数です。配列のインデックス数の繰り返し処理を行いたい場合に使用されます。UBound関数の書式は、以下のとおりです。

UBound(arrayname,dimension)

UBound関数の使用例は、以下のようなものです。配列で宣言したように、実行するとインデックスの値は「7」と表示されます。

Sub Sample1()
Dim arr(7) As Integer
MsgBox “インデックスの値は ” & UBound(arr) & ” です”
End Sub

UBound関数の引数が2つある場合の使用例は、以下のとおりです。3次元配列で宣言したとおり、インデックスの値は「7、5、10」と表示されます。

Sub Sample2()
Dim arr(7, 5, 10) As Integer
MsgBox “インデックス1の値は ” & UBound(arr, 1) & ” です”
MsgBox “インデックス2の値は ” & UBound(arr, 2) & ” です”
MsgBox “インデックス3の値は ” & UBound(arr, 3) & ” です”
End Sub

ただし、途中でインデックス数が変更される際、値を実際に使用する直前で取得しなければいけません。以下のように宣言すると、インデックスの値が3から4に変更されます。

Sub Sample4()
Dim arr() As Variant
arr = Array(1, 2, 3)
MsgBox “インデックスの値は ” & UBound(arr) + 1 & ” です” ‘※1 初期化した3を取得
arr = Array(1, 2, 3, 4)
 MsgBox “インデックスの値は ” & UBound(arr) + 1 & ” です” ‘※2 初期化した4を取得
End Sub

次はJSONについて学びましょう。JSONは軽量で扱いやすいデータ形式で、ウェブ開発やAPI通信などでよく使われます。初心者向けに基本を解説しますので、ぜひご覧ください。

まとめ

まとめ

VBAの配列は、主に静的配列と動的配列の2つに分けられます。静的配列は要素数が事前に決まっている場合に適しており、動的配列はあとから要素数を変更できるので変動が想定される場合におすすめです。

動的配列変数とは、現時点でデータ量や構造がわかっていなくても、実行するときに必要なサイズに調整できる配列変数です。初期化する際、RedimやRedim Preserve、Eraseなどさまざまな方法があります。

また、LBound関数は配列の最小添字を取得するための関数であり、一方UBound関数は配列の最大添字を取得するための関数です。意味合いが異なり、LBound関数とUBound関数を組み合わせて活用することがポイントです。

投稿者

  • デジタルトレンドナビ編集部

    システム開発、Webサイト制作、ECサイトの構築・運用、デジタルトランスフォーメーション(DX)など、デジタルビジネスに関わる多岐の領域において、最新のトレンド情報や実践的なノウハウを発信してまいります。