Excel VBA | 動的配列

VBA
スポンサーリンク

では、Excel VBAでの 動的配列 を初心者向けに、例題を交えてかみ砕いて説明します。

1. 動的配列とは?

  • 通常の配列(静的配列)は、宣言時にサイズを決めます:
Dim numbers(4) As Integer  ' 0~4の5個
VB
  • 動的配列 は、最初はサイズを決めずに宣言して、後から必要に応じてサイズを決める配列です。
Dim numbers() As Integer  ' 最初はサイズ未定
VB

💡 ポイント:
「あとからサイズを自由に変更できる配列」が動的配列です。


2. 動的配列の使い方

ステップ1: 配列の宣言

Dim numbers() As Integer  ' 動的配列の宣言
VB
  • 括弧に数字を書かないのが特徴
  • この時点ではまだメモリは確保されていません

ステップ2: 配列のサイズを決める(ReDim)

ReDim numbers(4)  ' 0~4の5個分のメモリを確保
VB
  • ReDim で配列の大きさを決める
  • 後でまたサイズを変えたい場合にも ReDim を使う

ステップ3: 配列に値を代入

numbers(0) = 10
numbers(1) = 20
numbers(2) = 30
numbers(3) = 40
numbers(4) = 50

ステップ4: 既存データを消さずにサイズ変更(ReDim Preserve)

ReDim Preserve numbers(6)  ' 元のデータを残して、7個に拡張
numbers(5) = 60
numbers(6) = 70

💡 ポイント:

  • Preserve を付けない場合 → 元のデータは消える
  • Preserve を付ける場合 → データは残るが、最後の次元しか変更できない

3. 例題:動的配列で学生の点数を管理

問題:
ユーザーから人数を入力して、その人数分の数学の点数を配列に入れ、合計点と平均点を計算して表示する。


解答例

Sub DynamicArrayExample()
    Dim n As Integer
    Dim scores() As Integer
    Dim i As Integer
    Dim total As Integer
    Dim avg As Double
    
    ' -----------------------
    ' 人数を入力
    ' -----------------------
    n = InputBox("学生の人数を入力してください")
    
    ' -----------------------
    ' 配列サイズを決定
    ' -----------------------
    ReDim scores(n - 1)  ' 0~n-1まで
    
    ' -----------------------
    ' 点数を入力
    ' -----------------------
    For i = 0 To n - 1
        scores(i) = InputBox("学生" & (i + 1) & "の数学の点数を入力してください")
    Next i
    
    ' -----------------------
    ' 合計と平均を計算
    ' -----------------------
    total = 0
    For i = 0 To n - 1
        total = total + scores(i)
    Next i
    
    avg = total / n
    
    ' -----------------------
    ' 結果を表示
    ' -----------------------
    MsgBox "合計点は " & total & "点です"
    MsgBox "平均点は " & avg & "点です"
End Sub
VB

4. ポイントまとめ

  1. 動的配列は「あとからサイズを決められる配列」
  2. ReDim でサイズを決める
  3. ReDim Preserve で既存データを残してサイズ変更可能
  4. ユーザーの入力やデータ量が変わるときに便利

💡 応用例:

  • 3次元配列と組み合わせて「学期 × 生徒 × 教科」の点数を管理する
  • データベースやCSVの行数が不明な場合に使える
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました