見出し画像

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(果物)  ' 配列の最小インデックス(通常は0Debug.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

📝 まとめ

配列選択のガイドライン

  1. データ量が固定で少ない

    • → 静的配列

  2. データ量が可変または大量

    • → 動的配列

  3. キーと値のペアが必要

    • → Dictionary(連想配列)

  4. 表形式のデータ

    • → 2次元配列

実務での注意点

  1. パフォーマンス

    • 大量のReDimは避ける

    • 可能な限り一括処理を活用

  2. メモリ管理

    • 不要な配列は明示的に解放

    • 大きな配列は適切にサイズ設定

  3. エラー処理

    • 配列の範囲チェック

    • Null/Empty値の考慮

🎯 練習問題

以下の練習問題を通じて、理解を深めることができます。

  1. 基本問題:

    • 1次元配列を作成し、5つの数値を格納して合計を計算

  2. 中級問題:

    • 2次元配列を使用して、社員の名前と給与を管理し、部署ごとの平均給与を計算

  3. 応用問題:

    • Dictionaryを使用して、商品コードと在庫数を管理し、在庫数が10個以下の商品を抽出

これらの練習を通じて、実践的なスキルを身につけることができます。

📚 さらなる学習のために

配列の理解を深めるためには、以下のアプローチがお勧めです。

  1. 基本から応用へ段階的に学習

  2. 実際のコードを書いて試行錯誤

  3. デバッグツールを活用した動作確認

  4. 実務での使用例を研究

この記事で解説した内容を基に、実際にコードを書いて試してみることで、より深い理解が得られるはずです。

著者注

この記事は、VBA初心者から中級者を対象に、配列の基本から実践的な使用方法までを解説しています。より詳細な情報や特定のユースケースについて知りたい場合は、お気軽にコメントでお知らせください。

いいなと思ったら応援しよう!