Excel VBAの配列完全解説:初心者から実務レベルまでわかりやすく解説
📚 はじめに
VBAでプログラミングを行う際、「配列」は避けて通れない重要な概念です。特に、大量のデータを効率的に処理する実務の現場では、配列の理解と適切な使用が必須となります。
この記事では、配列について「なぜ使うのか」という基本的な概念から、実務での具体的な活用方法まで、できるだけわかりやすく、そして実践的に解説していきます。
🌟 1. 配列の基本概念
配列とは?
配列は「複数のデータをまとめて管理できる変数」です。身近な例えを使って説明しましょう。
📦 通常の変数とは
通常の変数は、1つの箱のようなものです。
Dim 名前 As String
名前 = "山田" ' 1つの箱に1つの値しか入りません
🏢 配列とは
配列は、マンションのような構造です。
Dim 名前(2) As String ' 3つの部屋がある(0,1,2)
名前(0) = "山田" ' 0号室に山田さん
名前(1) = "田中" ' 1号室に田中さん
名前(2) = "高橋" ' 2号室に高橋さん
重要なポイント:インデックス番号
配列で最も重要な概念の1つが「インデックス番号」です。
基本的に0から始まります(0号室、1号室、2号室...)
要素数が3の場合、インデックスは0~2になります
Option Base 1 を使用すると1から始めることも可能です
' Option Base 1 を使用した例
Option Base 1 ' モジュールの先頭に記述
Dim 名前(3) As String ' 3つの部屋(1,2,3)
名前(1) = "山田" ' 1号室から始まります
🔄 2. 静的配列と動的配列
配列には大きく分けて「静的配列」と「動的配列」の2種類があります。
静的配列(Static Array)
予めサイズが決まっている配列です。
特徴
サイズが固定
メモリ効率が良い
サイズがわかっている場合に使用
' 静的配列の宣言と使用
Dim 社員名(4) As String ' 5名分の配列(0-4)
' データ格納
社員名(0) = "山田"
社員名(1) = "田中"
社員名(2) = "高橋"
社員名(3) = "佐藤"
社員名(4) = "鈴木"
' ✘ これはエラーになります
社員名(5) = "伊藤" ' 範囲外のインデックス
動的配列(Dynamic Array)
実行時にサイズを変更できる配列です。
特徴
サイズを後から変更可能
より柔軟な処理が可能
メモリを効率的に使用可能
' 動的配列の基本的な使用例
Dim 社員名() As String ' サイズを指定しない
' 最初は3名分
ReDim 社員名(2)
社員名(0) = "山田"
社員名(1) = "田中"
社員名(2) = "高橋"
' 後から5名に増やす
ReDim Preserve 社員名(4) ' Preserveで既存データを保持
社員名(3) = "佐藤"
社員名(4) = "鈴木"
重要:ReDim Preserveについて
ReDim Preserveは既存のデータを保持したままサイズを変更しますが、以下の注意点があります。
最後の次元のみサイズ変更可能
メモリ使用量に注意が必要
頻繁な使用は避ける
🛠 3. 便利な配列関数
Array関数
複数の値を直接配列として作成できる関数です。
' Array関数の使用例
Dim 果物
果物 = Array("りんご", "みかん", "バナナ", "メロン")
' 使用例
Debug.Print 果物(0) ' りんご
Debug.Print 果物(3) ' メロン
Split関数
文字列を特定の区切り文字で分割して配列にします。
' Split関数の基本的な使用例
Dim データ配列
データ配列 = Split("A,B,C,D,E", ",")
' より実践的な例:CSVデータの処理
Dim CSV行
CSV行 = "山田,営業部,45,東京"
Dim 要素
要素 = Split(CSV行, ",")
Debug.Print 要素(0) ' 山田
Debug.Print 要素(1) ' 営業部
LBound/UBound関数
配列の下限と上限のインデックスを取得します。
Dim 果物
果物 = Array("りんご", "みかん", "バナナ")
' インデックスの取得
Debug.Print LBound(果物) ' 配列の最小インデックス(通常は0)
Debug.Print UBound(果物) ' 配列の最大インデックス(この場合は2)
' 要素数の計算
Dim 要素数 As Long
要素数 = UBound(果物) - LBound(果物) + 1
Debug.Print 要素数 ' 3
📊 4. 1次元配列と2次元配列
1次元配列
最もシンプルな配列の形式です。
' 1次元配列の例
Dim 社員名(3) As String
社員名(0) = "山田"
社員名(1) = "田中"
社員名(2) = "高橋"
社員名(3) = "佐藤"
' ループでの処理例
Dim i As Long
For i = LBound(社員名) To UBound(社員名)
Debug.Print 社員名(i)
Next i
2次元配列
表形式のデータを扱うのに適しています。
' 2次元配列の例(3行×2列)
Dim 社員データ(2, 1) As String
' データ格納
社員データ(0, 0) = "山田" ' 1行目:名前
社員データ(0, 1) = "営業部" ' 1行目:部署
社員データ(1, 0) = "田中" ' 2行目:名前
社員データ(1, 1) = "総務部" ' 2行目:部署
社員データ(2, 0) = "高橋" ' 3行目:名前
社員データ(2, 1) = "経理部" ' 3行目:部署
' 2重ループでの処理
Dim i As Long, j As Long
For i = LBound(社員データ) To UBound(社員データ)
For j = LBound(社員データ, 2) To UBound(社員データ, 2)
Debug.Print 社員データ(i, j)
Next j
Next i
🔑 5. 連想配列(Dictionary)
基本概念
キーと値のペアでデータを管理する特殊な配列です。
特徴
キーを使って直接アクセス可能
重複チェックが容易
データの検索が高速
' Dictionaryの使用例
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' データの追加
dict.Add "A001", "山田"
dict.Add "A002", "田中"
dict.Add "A003", "高橋"
' データの取得
Debug.Print dict("A001") ' 山田
' 存在確認
If dict.Exists("A001") Then
Debug.Print "データが存在します"
End If
実践的な使用例:重複チェック
' 重複チェックの例
Sub 重複チェック()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' 重複チェック用のデータ
Dim データ
データ = Array("A", "B", "A", "C", "B", "D")
' 重複チェック
Dim i As Long
For i = LBound(データ) To UBound(データ)
If Not dict.Exists(データ(i)) Then
dict.Add データ(i), 1
Else
dict(データ(i)) = dict(データ(i)) + 1
End If
Next i
' 結果表示
Dim key As Variant
For Each key In dict.Keys
Debug.Print key & ": " & dict(key) & "回"
Next key
End Sub
💼 6. 実務での活用例
データ処理の自動化
' CSVファイルの処理例
Sub CSV処理()
Dim FilePath As String
FilePath = "C:\data.csv"
' ファイルを開いて処理
Dim FileNum As Integer
FileNum = FreeFile
Open FilePath For Input As #FileNum
Dim データ配列() As String
Dim 行 As String
' 1行ずつ読み込み
Do While Not EOF(FileNum)
Line Input #FileNum, 行
データ配列 = Split(行, ",")
' ここでデータ処理
' ...
Loop
Close #FileNum
End Sub
大量データの効率的な処理
' 大量データ処理の例
Sub 大量データ処理()
' シートのデータを配列に読み込む
Dim データ範囲 As Range
Set データ範囲 = Range("A1").CurrentRegion
' シートのデータを一度に配列に格納
Dim データ配列 As Variant
データ配列 = データ範囲.Value
' 配列で処理(高速)
Dim i As Long, j As Long
For i = LBound(データ配列) To UBound(データ配列)
For j = LBound(データ配列, 2) To UBound(データ配列, 2)
' データ処理
' ...
Next j
Next i
End Sub
📝 まとめ
配列選択のガイドライン
データ量が固定で少ない
→ 静的配列
データ量が可変または大量
→ 動的配列
キーと値のペアが必要
→ Dictionary(連想配列)
表形式のデータ
→ 2次元配列
実務での注意点
パフォーマンス
大量のReDimは避ける
可能な限り一括処理を活用
メモリ管理
不要な配列は明示的に解放
大きな配列は適切にサイズ設定
エラー処理
配列の範囲チェック
Null/Empty値の考慮
🎯 練習問題
以下の練習問題を通じて、理解を深めることができます。
基本問題:
1次元配列を作成し、5つの数値を格納して合計を計算
中級問題:
2次元配列を使用して、社員の名前と給与を管理し、部署ごとの平均給与を計算
応用問題:
Dictionaryを使用して、商品コードと在庫数を管理し、在庫数が10個以下の商品を抽出
これらの練習を通じて、実践的なスキルを身につけることができます。
📚 さらなる学習のために
配列の理解を深めるためには、以下のアプローチがお勧めです。
基本から応用へ段階的に学習
実際のコードを書いて試行錯誤
デバッグツールを活用した動作確認
実務での使用例を研究
この記事で解説した内容を基に、実際にコードを書いて試してみることで、より深い理解が得られるはずです。
著者注
この記事は、VBA初心者から中級者を対象に、配列の基本から実践的な使用方法までを解説しています。より詳細な情報や特定のユースケースについて知りたい場合は、お気軽にコメントでお知らせください。