配列 → 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 = 配列で一瞬。 - 二次元配列必須:
[行,列]形式でないと書き戻せない。一次元は変換する。 - ヘッダーとデータ: ヘッダーは別途書き込み、データは配列でまとめると見やすい。
