銀河鉄道

【VBA】配列の要素数を決める|ReDim vs ReDim Preserve & Pythonとの違い

サムネイル
[VBA]Redim とRedim Preserve
ReDim ?
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の ReDimReDim 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

| Performance|性能 |
| Memory Copy|メモリコピー |
| Unpredictable Size|予測できないサイズ |
| Efficiency|効率 |
| Constraint|制約 |
| Dynamic Array|動的配列 |
| Fixed Size|固定サイズ |
| Append|追加 |
| Extend|拡張 |
| Mutable|可変 |

If you know the final size,
always use ReDim.

サイズがわかってるなら
ReDimにしよう

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧