【VBA】配列の要素数を決める|ReDim vs ReDim Preserve & Pythonとの違い
作成日:2022-12-04
更新日:2025-10-02

ReDim ?
ReDim Preserve ?
ReDim Preserve ?

どう違う?
比較|ReDim vs ReDim Preserve
- ReDim|再宣言:速い・シンプル。ただし中身が消える。
- ReDim Preserve|保持:中身を残せるが、処理が遅くなりやすい・制約が多い。
- 目安:大量データ処理=ReDim、途中で配列を少しずつ伸ばす必要がある=ReDim Preserve。

Re(再)
Dim(宣言)
1. ReDim のメリット・デメリット
メリット
- 速い|高速に再宣言できる
- シンプル|制約がない(どの次元でもOK)
- 大量データに向く
デメリット
- 中身が消えるので、再利用できない
- 「保持したいならコピーを自分で作る」必要あり
大きな表を一気に処理する場合は、ReDim
2. ReDim Preserve のメリット・デメリット
メリット
- データを残したまま拡張できる
- 小規模な配列や、段階的にデータを追加するときに便利
デメリット
- 遅い|内部的に「新しい配列を作ってコピー」してるから重い
- 制約|最後の次元しかサイズ変更できない
- 頻繁に使うとパフォーマンス低下
小規模・追加処理に便利だが、大量データでは非推奨
Annotated Example|例
' Case 1: 一気に作れるなら ReDim
Dim arr() As Long
ReDim arr(1 To 1000000) ' 最初からサイズを確保
' → 処理が速い、効率的
' Case 2: データが増えるたび追加なら ReDim Preserve
Dim arr2() As Long, i As Long
For i = 1 To 5
ReDim Preserve arr2(1 To i) ' 少しずつ増やす
arr2(i) = i * 10
Next
' → 簡単に書けるけど、毎回コピーするので遅い
備考|一次元配列の場合

拡張と同時に、中身を格納する場合
Public Function Redim1ArrayAddOneText( _
ByRef ary As Variant, _
ByVal text As String) As Variant
Dim first As Long
first = LBound(ary)
'最初の要素以外の場合に、ReDim Preserveする
If (UBound(ary) = 0 And ary(0) <> "") Or UBound(ary) <> 0 Then
ReDim Preserve ary(UBound(ary) + 1)
End If
ary(UBound(ary)) = text
Redim1aryAddOneText = ary
End Function
比較|VBA vs Python
- Pythonに ReDim|再宣言 という機能は存在しない。
- Pythonのリスト(list|リスト)は可変長なので、サイズを決め直す必要がない。
- VBAの
ReDim
とReDim Preserve
は、Pythonでは単純に.append()
やスライスで代替できる。
1. VBA の ReDim と Python の違い
- VBA 配列|Array:サイズ固定(変えたいときは ReDim で作り直し)
- Python リスト|List:サイズ可変(最初から自由に増減可能)
PythonではReDimは不要
2. ReDim 相当の操作 in Python
(1) 新しいサイズを作り直す(VBA の ReDim)
' VBA
Dim arr() As Long
ReDim arr(1 To 5) ' サイズを作り直す
# Python
arr = [0] * 5 # 要素5個を持つリストを作る
(2) Preserve(データを残してサイズ変更)
' VBA
ReDim Preserve arr(1 To 10)
# Python
arr = [1, 2, 3]
arr.append(4) # → [1, 2, 3, 4] (要素を追加)
# もしくは
arr.extend([5, 6]) # → [1, 2, 3, 4, 5, 6]
3. メリット比較
- VBA の配列は高速だがサイズ固定 → ReDimが必要
- Python のリストは柔軟で便利 → ReDim不要、appendで十分
In Python, you don’t need ReDim—just use list methods like append or extend.
Pythonでは append / extend を使う
Referenced Insights & Citations
- Microsoft Docs: ReDim Statement
- MS Docs: ReDim Statement
- Chip Pearson: “ReDim Preserve is relatively slow because it copies the existing array into a new one.”(出典:”Programming With Arrays In VBA”)
- Python Docs: Built-in Types — list
| Performance|性能 |
| Memory Copy|メモリコピー |
| Unpredictable Size|予測できないサイズ |
| Efficiency|効率 |
| Constraint|制約 |
| Dynamic Array|動的配列 |
| Fixed Size|固定サイズ |
| Append|追加 |
| Extend|拡張 |
| Mutable|可変 |
If you know the final size,
always use ReDim.
サイズがわかってるなら
ReDimにしよう
always use ReDim.
サイズがわかってるなら
ReDimにしよう
2022-12-04
編集後記:
この記事の内容がベストではないかもしれません。
記事一覧
-
[VBA]SaveAs名前を付けて保存 【VBA】名前を付けて保存|SaveAs -
[VBA]Reset filtersand outlines 【VBA】オートフィルタ解除&非表示を表示する|.FilterMode/.Outline -
テーブルの値を取得する 【VBA】Excelテーブルのデータを配列で取得する -
ユーザーフォームをシステムっぽく 【VBA】ユーザーフォームのみ起動して、シートを表示しない方法 -
VBAでテーブル設定 【VBA】Excelにテーブルを設定する -
[VBA]ShowMessage Box 【VBA】メッセージボックスをモジュールに集める|OKOnly,OKCancel,YesNo