Excel VBA 逆引き集 | 配列 → Rangeの書き戻し

Excel VBA
スポンサーリンク

配列 → Rangeの書き戻し

大量データを扱うときは Rangeを配列に読み込んで処理 → 配列を一括でRangeに書き戻す の流れが最速です。ここでは「配列 → Rangeの書き戻し」に特化したテンプレを初心者向けにかみ砕いて説明します。


基本の仕組み

  • Range.Value = 配列 で一括書き込みできる。
  • 配列は 二次元配列(行×列)である必要がある。
  • Resize(行数, 列数) で配列サイズに合わせて範囲を指定する。

テンプレ1:単純な配列を書き戻す

Sub ArrayToRange_Simple()
    Dim ws As Worksheet: Set ws = Worksheets("Sheet1")

    ' 3行×2列の配列を作成
    Dim arr(1 To 3, 1 To 2) As Variant
    arr(1, 1) = "A1": arr(1, 2) = "B1"
    arr(2, 1) = "A2": arr(2, 2) = "B2"
    arr(3, 1) = "A3": arr(3, 2) = "B3"

    ' A1セルから配列サイズ分を一括書き込み
    ws.Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
VB
  • ポイント: Resizeで配列の行数・列数に合わせる。セルを1つずつ書くより圧倒的に速い。

テンプレ2:Rangeを配列に読み込み→加工→書き戻し

Sub ArrayToRange_Process()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' A2:C最終行を配列に読み込み
    Dim v As Variant
    v = ws.Range("A2:C" & lastRow).Value

    ' 数量列(C列)を2倍に加工
    Dim i As Long
    For i = 1 To UBound(v, 1)
        v(i, 3) = v(i, 3) * 2
    Next i

    ' 加工済み配列を別シートに書き戻し
    Dim wsOut As Worksheet: Set wsOut = Worksheets.Add
    wsOut.Range("A2").Resize(UBound(v, 1), UBound(v, 2)).Value = v
End Sub
VB
  • ポイント: 読み込み→加工→書き戻しの流れ。大量データでも一瞬。

テンプレ3:一次元配列を二次元に変換して書き戻す

一次元配列はそのままでは書き戻せないので、二次元に変換します。

Sub ArrayToRange_1D()
    Dim ws As Worksheet: Set ws = Worksheets("Sheet1")

    ' 一次元配列
    Dim arr1D As Variant
    arr1D = Array("りんご", "みかん", "バナナ")

    ' 二次元に変換(縦方向)
    Dim arr2D() As Variant
    ReDim arr2D(1 To UBound(arr1D) + 1, 1 To 1)

    Dim i As Long
    For i = LBound(arr1D) To UBound(arr1D)
        arr2D(i + 1, 1) = arr1D(i)
    Next i

    ' A1から縦に書き戻し
    ws.Range("A1").Resize(UBound(arr2D, 1), 1).Value = arr2D
End Sub
VB
  • ポイント: 一次元配列は「縦方向の二次元配列」に変換して書き戻す。

テンプレ4:ヘッダー付きで配列を書き戻す

Sub ArrayToRange_WithHeader()
    Dim ws As Worksheet: Set ws = Worksheets("Sheet1")

    ' データ配列(3行×2列)
    Dim arr(1 To 3, 1 To 2) As Variant
    arr(1, 1) = "A": arr(1, 2) = 10
    arr(2, 1) = "B": arr(2, 2) = 20
    arr(3, 1) = "C": arr(3, 2) = 30

    ' ヘッダー行
    ws.Range("A1:B1").Value = Array("商品", "数量")

    ' データ書き戻し
    ws.Range("A2").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
VB
  • ポイント: ヘッダーは別途書き込み、データは配列で一括。

例題で練習

'例1:3×2の配列をA1から書き戻す
Sub Example_Simple()
    ArrayToRange_Simple
End Sub

'例2:A〜C列を配列に読み込み→数量×2→別シートへ書き戻す
Sub Example_Process()
    ArrayToRange_Process
End Sub

'例3:一次元配列を縦方向に書き戻す
Sub Example_1D()
    ArrayToRange_1D
End Sub

'例4:ヘッダー付きで配列を表形式に書き戻す
Sub Example_Header()
    ArrayToRange_WithHeader
End Sub
VB

初心者向けポイント

  • セル直書きは遅い: Cells(i,j).Value = ... を繰り返すと数万行で止まる。
  • 配列一括書き戻し: Range.Resize(...).Value = 配列 で一瞬。
  • 二次元配列必須: [行,列]形式でないと書き戻せない。一次元は変換する。
  • ヘッダーとデータ: ヘッダーは別途書き込み、データは配列でまとめると見やすい。
タイトルとURLをコピーしました