【VBA言語】配列について徹底解説【初心者向け】
配列とは?
配列とは、同じデータ型の複数の値をひとまとめにして扱うための変数です。プログラム中で一連のデータを管理する際に非常に便利で、ループ処理や一括処理を行う場合によく使われます。VBAでは、配列を用いることで、複数の値の格納、処理、取得が容易になります。
配列の宣言方法
VBAでは、配列を宣言する方法として主に「固定長配列」と「動的配列」の2種類があります。宣言には Dim
キーワードを使用します。基本的な宣言方法は以下の通りです。
' 整数型の固定長配列(0から始まる場合)
Dim numbers(4) As Integer ' 0~4 の5要素
' 整数型の固定長配列(1から始める場合)
Dim scores(1 To 5) As Integer
' 動的配列の宣言
Dim dynamicArray() As String
配列の宣言時に添字の範囲を指定することで、その配列に格納できる要素数が決まります。また、動的配列の場合は後からサイズを変更することができ、必要に応じてメモリを有効活用することが可能です。
固定長配列の使い方
固定長配列は、宣言時に決めたサイズが固定となる配列です。サイズが変更できないため、データの個数が事前に分かっている場合に便利です。以下は固定長配列を使ったサンプルコードです。
' 1から5までの整数を格納する固定長配列の例
Dim fixedArray(1 To 5) As Integer
' 配列に値を代入
fixedArray(1) = 10
fixedArray(2) = 20
fixedArray(3) = 30
fixedArray(4) = 40
fixedArray(5) = 50
' 配列の値を出力
Dim i As Integer
For i = 1 To 5
Debug.Print "fixedArray(" & i & ") = " & fixedArray(i)
Next i
この例では、配列 fixedArray
に5つの整数を格納し、Forループで各要素を出力しています。添字は1から始まるように指定されています。
動的配列の使い方
動的配列は、宣言時にサイズを指定せず、必要に応じてサイズを変更することができる配列です。サイズの変更には ReDim
ステートメントを使用します。動的配列は、データの数が実行時に決まる場合に非常に有効です。
' 動的配列の宣言
Dim dynamicArray() As String
' 配列のサイズを10に設定
ReDim dynamicArray(1 To 10)
' 配列に値を代入
Dim j As Integer
For j = 1 To 10
dynamicArray(j) = "値" & j
Next j
' 配列の値を出力
For j = 1 To 10
Debug.Print "dynamicArray(" & j & ") = " & dynamicArray(j)
Next j
' 配列サイズを変更(既存のデータを保持しながらサイズ変更する場合)
ReDim Preserve dynamicArray(1 To 15)
' 新たに追加された部分に値を代入
For j = 11 To 15
dynamicArray(j) = "新しい値" & j
Next j
ReDim Preserve
を使用すると、既存のデータを保持したまま配列のサイズを変更できますが、最後の次元に対してのみ使用可能です。動的配列はデータ数が変動する状況に適しています。
多次元配列の使い方
多次元配列は、2次元以上の配列で、表や行列などの複雑なデータ構造を扱う際に利用されます。最も一般的な例は2次元配列で、Excelのセルデータなどの管理に向いています。
' 2次元配列の例:3行3列の行列
Dim matrix(1 To 3, 1 To 3) As Integer
' 配列に値を代入
Dim row As Integer, col As Integer
For row = 1 To 3
For col = 1 To 3
matrix(row, col) = row * col
Next col
Next row
' 配列の値を出力
For row = 1 To 3
For col = 1 To 3
Debug.Print "matrix(" & row & ", " & col & ") = " & matrix(row, col)
Next col
Next row
この例では、各セルに行番号と列番号の積を格納しています。多次元配列は、必要に応じてさらに次元を追加することも可能ですが、コードの複雑さが増すため、実際の用途に合わせた設計が求められます。
配列関数の活用
VBAには配列を操作するための便利な関数がいくつか用意されています。代表的なものには、以下のような関数があります。
LBound(array)
:配列の最初の添字を取得UBound(array)
:配列の最後の添字を取得Join(array, [delimiter])
:配列の要素を指定した区切り文字で連結して1つの文字列にするFilter(array, match)
:配列から条件に一致する要素を抽出する
以下は、LBound
と UBound
を使って配列の範囲を取得する例です。
' 配列の範囲を動的に取得してループ処理
Dim fruits(0 To 3) As String
fruits(0) = "Apple"
fruits(1) = "Banana"
fruits(2) = "Cherry"
fruits(3) = "Date"
Dim lowerBound As Integer, upperBound As Integer
lowerBound = LBound(fruits)
upperBound = UBound(fruits)
Dim k As Integer
For k = lowerBound To upperBound
Debug.Print "fruits(" & k & ") = " & fruits(k)
Next k
実践例とサンプルコード
以下に、VBAで配列を実際に使用するいくつかのサンプルコードを紹介します。これらの例は、日常的なプログラミングタスクで配列がどのように役立つかを示しています。
例1: 数値の合計を求める
' 固定長配列を使って数値の合計を求める例
Dim numbers(1 To 5) As Integer
numbers(1) = 5
numbers(2) = 10
numbers(3) = 15
numbers(4) = 20
numbers(5) = 25
Dim sum As Integer
sum = 0
Dim i As Integer
For i = 1 To 5
sum = sum + numbers(i)
Next i
Debug.Print "合計 = " & sum ' 出力結果: 合計 = 75
例2: Excelシートからデータを配列に読み込む
' Excelのセル範囲を配列に格納する例
Dim dataRange As Range
Set dataRange = ThisWorkbook.Worksheets("Sheet1").Range("A1:C5")
' Rangeの値は2次元配列として取得できる
Dim dataArray As Variant
dataArray = dataRange.Value
Dim r As Long, c As Long
For r = LBound(dataArray, 1) To UBound(dataArray, 1)
For c = LBound(dataArray, 2) To UBound(dataArray, 2)
Debug.Print "セル(" & r & ", " & c & ") = " & dataArray(r, c)
Next c
Next r
例3: 文字列配列を連結する
' Join関数を使用して文字列配列の要素を連結する例
Dim words() As String
words = Split("VBAは配列を簡単に扱える", " ") ' スペースで分割して配列に格納
Dim sentence As String
sentence = Join(words, " ") ' 配列の要素をスペースで連結
Debug.Print sentence ' 出力結果: VBAは配列を簡単に扱える
応用例と注意点
配列を扱う際に知っておくと役立つ応用例や注意点を以下にまとめます。
-
0ベースと1ベースの違い: VBAでは、配列の初期添字は既定では0ですが、宣言時に
Option Base 1
を指定すると1から始まる配列になります。プログラム全体で統一した添字の起点を決めることが重要です。 -
ReDim Preserveの制約: 動的配列のサイズを変更する際、
ReDim Preserve
は最後の次元にしか使用できません。多次元配列の場合、注意が必要です。 -
配列の境界チェック:
LBound
やUBound
を使って、配列の範囲を常に確認することで、インデックスエラーを防止できます。 - 大きなデータセットの場合: 配列は非常に高速に動作しますが、データ量が膨大になる場合は、メモリの使用量にも注意が必要です。必要に応じて動的配列やコレクション、Dictionaryオブジェクトの利用を検討してください。
その他のTips
配列を効果的に活用するための追加のヒントをいくつか紹介します。
- 配列の初期化: 配列を宣言した直後に初期値を設定しておくと、後の処理が簡単になります。たとえば、Forループの中で毎回値を代入するのではなく、初期化ルーチンを用意することが有用です。
-
動的配列の再利用: 不要になった動的配列は再宣言することで、メモリを解放することができます。たとえば、用途が終わった配列に対して
Erase
ステートメントを使用します。 - 関数での配列の受け渡し: VBAでは、配列を引数として関数やサブルーチンに渡すことができます。これにより、データの集約や処理の共通化が容易になります。
' 配列を引数として渡す関数の例
Sub ProcessArray(ByRef arr() As Integer)
Dim idx As Integer
For idx = LBound(arr) To UBound(arr)
arr(idx) = arr(idx) * 2
Next idx
End Sub
Sub TestProcessArray()
Dim testArray(1 To 3) As Integer
testArray(1) = 1
testArray(2) = 2
testArray(3) = 3
ProcessArray testArray
Dim idx As Integer
For idx = 1 To 3
Debug.Print "testArray(" & idx & ") = " & testArray(idx)
Next idx
End Sub
この例では、ProcessArray
サブルーチンを使って、渡された配列の各要素を2倍にしています。配列を引数として渡すことで、複数の処理間で同じデータを共有し、効率的なコード設計が可能になります。
以上のように、VBAにおける配列の使い方は非常に多岐にわたります。基本を押さえ、各状況に応じた配列の利用方法を身につけることで、プログラムの効率性と可読性が向上します。初心者の方は、まずは固定長配列と動的配列の基本操作から練習し、徐々に多次元配列や配列関数の活用に挑戦してみてください。