複数セルに一括代入
「同じ値をまとめて入れる」「異なる値を一括で入れる」「縦横の配列をそのまま貼る」「高速に大量代入」まで、初心者でも迷わず使えるテンプレートを実用例付きでまとめます。
基本:同じ値を複数セルへ一括代入
Sub SetSameValueToRange()
'B4:B10 の7セル全てに同じ文字列
Range("B4:B10").Value = "在庫あり"
'C2:E2 の3セル全てに同じ数値
Range("C2:E2").Value = 0
End Sub
VB- ポイント:
- 同一値の一括代入: 範囲に .Value を直接代入すると、範囲内の全セルが同じ値になります。
- 表示書式: 値は入るだけで見た目はセルの書式に依存します(必要なら後述の書式設定を併用)。
異なる値を一括で入れる(2次元配列で高速)
Sub SetDifferentValuesWithArray()
'縦方向(3行×1列):E2:E4に A, B, C を一括代入
Dim colData(1 To 3, 1 To 1) As Variant
colData(1, 1) = "A"
colData(2, 1) = "B"
colData(3, 1) = "C"
Range("E2:E4").Value = colData
'表(2行×3列):G2:I3に文字と数値を一括代入
Dim grid(1 To 2, 1 To 3) As Variant
grid(1, 1) = "X": grid(1, 2) = "Y": grid(1, 3) = "Z"
grid(2, 1) = 10: grid(2, 2) = 20: grid(2, 3) = 30
Range("G2:I3").Value = grid
End Sub
VB- ポイント:
- 2次元配列が必須: 異なる値を複数セルに一括で入れるには、範囲と同じサイズの「2次元配列」を .Value に渡します。
- 1次元配列は不可: Array(…) をそのまま代入しても期待通りに広がらないため、必ず行×列の2次元にします。
実務定番:縦・横のリストをまとめて貼る
Sub PasteVerticalList()
'A1:A10 に 1〜10 を一括代入
Dim i As Long, arr(1 To 10, 1 To 1) As Variant
For i = 1 To 10
arr(i, 1) = i
Next
Range("A1:A10").Value = arr
End Sub
Sub PasteHorizontalList()
'B1:K1 に Jan〜Oct を一括代入
Dim months(1 To 1, 1 To 10) As Variant
months(1, 1) = "Jan": months(1, 2) = "Feb": months(1, 3) = "Mar"
months(1, 4) = "Apr": months(1, 5) = "May": months(1, 6) = "Jun"
months(1, 7) = "Jul": months(1, 8) = "Aug": months(1, 9) = "Sep"
months(1, 10) = "Oct"
Range("B1:K1").Value = months
End Sub
VB- ポイント:
- 縦は (行,1)、横は (1,列): 配列の形を範囲に合わせるのがコツ。
- 大きなデータも高速: ループで配列に詰めてから一括代入すると格段に速くなります。
見出し+初期値を一括代入(見た目調整も同時)
Sub SetupTableFast()
'横方向見出し(4列分)
Dim hdr(1 To 1, 1 To 4) As Variant
hdr(1, 1) = "商品": hdr(1, 2) = "単価": hdr(1, 3) = "数量": hdr(1, 4) = "金額"
Range("B2:E2").Value = hdr
'初期値(10行×3列)をゼロクリア
Dim data(1 To 10, 1 To 3) As Variant, r As Long, c As Long
For r = 1 To 10: For c = 1 To 3: data(r, c) = 0: Next c: Next r
Range("C3:E12").Value = data
'書式(見た目)
With Range("B2:E2")
.Font.Bold = True
.Interior.Color = RGB(221, 235, 247)
.Borders.LineStyle = xlContinuous
End With
Range("E3:E12").NumberFormatLocal = "#,##0"
Range("B:E").Columns.AutoFit
End Sub
VB- ポイント:
- 値と書式は別: 値の一括代入 → 書式設定の順にすると分かりやすく、安定します。
選択範囲へ同じ値を一括代入(作業グループ対応)
Sub SetValueToSelection()
If TypeName(Selection) = "Range" Then
Selection.Value = "選択中"
End If
End Sub
VB- ポイント:
- 多選択でもOK: 選択されているセル集合に同じ値が一度に入ります。
- 対象の明示が基本: 誤操作防止のため、常用は対象範囲をコードで明示するやり方がおすすめ。
別シート・別ブックの範囲へ一括代入
Sub SetOtherSheetOrWorkbook()
'別シートへ(異なる値)
Dim arr(1 To 2, 1 To 3) As Variant
arr(1, 1) = "A": arr(1, 2) = "B": arr(1, 3) = "C"
arr(2, 1) = 1: arr(2, 2) = 2: arr(2, 3) = 3
Worksheets("顧客").Range("A1:C2").Value = arr
'別ブックへ(同じ値)
With Workbooks("月次集計.xlsm").Worksheets("売上")
.Range("D5:D20").Value = "対象"
End With
End Sub
VB- ポイント:
- 取り違え防止: Workbooks/Worksheets を明示して操作先を明確に。
- 存在前提: 他ブックは開いていること、シート名が正しいことを前提に。
高速化のコツ(大量データ)
Sub BulkAssignFast()
Dim r As Long, c As Long, rows As Long, cols As Long
rows = 10000: cols = 5
'配列に詰める
Dim buf() As Variant
ReDim buf(1 To rows, 1 To cols)
For r = 1 To rows
For c = 1 To cols
buf(r, c) = r * 10 + c '例:適当な値
Next c
Next r
'一括代入(画面更新オフ)
Application.ScreenUpdating = False
Range("A1").Resize(rows, cols).Value = buf
Application.ScreenUpdating = True
End Sub
VB- ポイント:
- 配列→一括代入: セルに都度書くより桁違いに速い。
- ScreenUpdatingをFalse: ちらつき防止と体感速度向上に有効。
例題で練習
例題1:A1:A20 に 1〜20 を一括代入(配列版)
Sub FillA1ToA20_Array()
Dim i As Long, arr(1 To 20, 1 To 1) As Variant
For i = 1 To 20
arr(i, 1) = i
Next
Range("A1:A20").Value = arr
End Sub
VB例題2:週報の見出しを横一列に一括代入
Sub WeeklyHeader()
Dim hdr(1 To 1, 1 To 5) As Variant
hdr(1, 1) = "週": hdr(1, 2) = "担当": hdr(1, 3) = "件数": hdr(1, 4) = "達成率": hdr(1, 5) = "備考"
Range("B2:F2").Value = hdr
End Sub
VB例題3:売上テーブルの数量・単価から金額を一括計算して代入
Sub CalcAmountBulk()
Dim last As Long, r As Long, out() As Variant
last = Cells(Rows.Count, "B").End(xlUp).Row 'B列を基準に最終行取得(見出しはB2)
ReDim out(1 To last - 2, 1 To 1) '行数ぶん(金額列分)
For r = 3 To last
out(r - 2, 1) = Cells(r, "C").Value * Cells(r, "D").Value '数量×単価
Next
Range("E3").Resize(UBound(out, 1), 1).Value = out
End Sub
VB実務の落とし穴と対策
- 同値しか入らない問題: 範囲.Value に単一値を渡すと全セル同じ値になる。異なる値は必ず2次元配列を使う。
- 配列サイズの不一致: 配列の行×列と、貼り付ける範囲のサイズは一致させる。ズレるとエラー。
- 選択依存の不安定さ: Selection 依存の処理は誤操作のもと。対象範囲はコードで明示するのが基本。
- 大量処理の遅さ: ループでセルに書かない。配列に詰める→一括代入+ScreenUpdating=False を徹底。
- 別シート/別ブックの取り違え: Workbooks/Worksheets を明示し、存在チェックや名前の確認を癖にする。
