行全体/列全体に代入
「A列全部を同じ値に」「1行丸ごとに式を入れる」「部分範囲だけ前方へ広げる」「安全な高速一括代入」まで、初心者が迷いやすいポイントを避けたテンプレートと例題をまとめました。
基本:列全体/行全体に同じ値を代入
Sub AssignToWholeColumn_Row()
'列全体(A列)へ同じ値
Range("A:A").Value = "対象"
'行全体(3行目)へ同じ値
Range("3:3").Value = 0
'Rows/Columns での指定例
Columns("B").Value = Date
Rows(5).Value = "ヘッダー"
End Sub
VB- ポイント:
- 同値の一括代入: 行・列全体に .Value を渡すと「全セル同じ値」になります。
- 書式は別: 見た目はセルの書式に依存。必要に応じて後述の書式設定を併用。
- 慎重に使用: 行・列全体は非常に広い範囲(最大行・列)を含むため、不要な上書きに注意。
一部範囲から行/列全体を参照して代入(EntireRow/EntireColumn)
Sub AssignUsingEntire()
'基準セルから「その行全体」「その列全体」を参照
Range("D4").EntireRow.Value = "行の初期化"
Range("D4").EntireColumn.Value = "列の初期化"
'複数セルからまとめて対象行/列へ
Range("A2,C7,E10").EntireColumn.Interior.Color = RGB(221, 235, 247)
Range("B3:B6").EntireRow.Font.Bold = True
End Sub
VB- ポイント:
- 直感的: 「基準セルを含む行/列」を一発で指定できる。
- 複数選択にも対応: カンマ区切りで複数セルを渡すと、それぞれの行/列に適用されます。
異なる値を行/列へ一括代入(配列で高速)
列へ縦データを一括代入
Sub AssignVerticalArrayToColumn()
'A1:A10 に 1〜10 を代入
Dim arr(1 To 10, 1 To 1) As Variant, i As Long
For i = 1 To 10: arr(i, 1) = i: Next
Range("A1:A10").Value = arr
End Sub
VB行へ横データを一括代入
Sub AssignHorizontalArrayToRow()
'3行目のB〜Kへ月名を代入
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"
Rows(3).Range("B1:K1").Value = months '行指定+相対範囲で安全に
End Sub
VB- ポイント:
- 2次元配列が必須: 異なる値を複数セルへ一括代入するときは範囲と同サイズの2次元配列を渡す。
- 行/列全体に配るのは避ける: 異なる値を「行全体」「列全体」に展開するのは危険。必要範囲に絞るのが安全。
行/列の一部にだけ代入(Resize/Offset を活用)
Sub AssignPartialRowColumn()
'行の一部(5行目のB〜G)
Rows(5).Range("B1").Resize(1, 6).Value = "見出し"
'列の一部(C列の2〜21行目)
Columns("C").Range("C2").Resize(20, 1).Value = 0
'基準セルから相対指定(D4の行でB〜E)
With Range("D4").EntireRow
.Range("B1").Resize(1, 4).Value = Array("名", "単価", "数量", "金額")
End With
End Sub
VB- ポイント:
- 相対指定で安全: 行/列全体を対象にしつつ、実際に代入するのは必要範囲のみに絞る。
- Resize: 行数・列数を明示して過剰な上書きを防ぐ。
数式や書式を行/列へまとめて設定
Sub SetFormulaAndFormat_RowCol()
'行の一部に数式(3行目のE列〜H列)
Rows(3).Range("E1:H1").Formula = "=ROW() + COLUMN()"
'列の一部に書式(D列の2〜21行目)
Columns("D").Range("D2:D21").NumberFormatLocal = "#,##0"
Columns("D").Range("D2:D21").Font.Bold = True
End Sub
VB- ポイント:
- 値と書式は分離: 代入→書式の順にすると分かりやすく、トラブルも減る。
選択行/列への一括代入(作業グループ対応)
Sub AssignToSelectedRowsColumns()
If TypeName(Selection) = "Range" Then
'選択された範囲の行全体へ
Selection.EntireRow.Interior.Color = RGB(255, 242, 204)
'選択された範囲の列全体へ
Selection.EntireColumn.Font.Bold = True
End If
End Sub
VB- ポイント:
- 選択依存は慎重に: 便利だが誤選択のリスクあり。常用は対象をコードで明示するのがおすすめ。
高速化のコツ(大量セル)
Sub FastRowColumnAssign()
Dim buf() As Variant, r As Long, c As Long, rows As Long, cols As Long
rows = 5000: cols = 5
ReDim buf(1 To rows, 1 To cols)
For r = 1 To rows
For c = 1 To cols
buf(r, c) = r * 100 + c
Next c
Next
Application.ScreenUpdating = False
'列や行を丸ごと使わず、必要範囲に絞って一括代入
Range("A2").Resize(rows, cols).Value = buf
Application.ScreenUpdating = True
End Sub
VB- ポイント:
- 配列→一括代入: セル単位のループ書き込みより圧倒的に速い。
- ScreenUpdatingをFalse: ちらつき防止と体感速度の向上。
例題で練習
例題1:ヘッダー行(2行目)のB〜Fに見出しをまとめて代入
Sub Example_HeaderRow()
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) = "備考"
Rows(2).Range("B1:F1").Value = hdr
Rows(2).Range("B1:F1").Font.Bold = True
End Sub
VB例題2:数量列(C列)の2〜101行目をゼロクリア
Sub Example_ClearQuantity()
Columns("C").Range("C2:C101").Value = 0
End Sub
VB例題3:選択された範囲の「行全体」にタイムスタンプ、「列全体」に太字
Sub Example_StampAndBold()
If TypeName(Selection) = "Range" Then
Selection.EntireRow.Columns("Z").Value = "更新: " & Format(Now, "yyyy/mm/dd HH:NN")
Selection.EntireColumn.Font.Bold = True
End If
End Sub
VB実務の落とし穴と対策
- 過剰上書きの危険:
- 対策: 行/列全体は広すぎるため、Range(…).Resize で必要範囲へ限定して代入。
- 異なる値の一括代入がうまくいかない:
- 対策: 必ず2次元配列を使い、範囲サイズと一致させる。
- 選択依存の不安定さ:
- 対策: Selection を使う処理は誤操作の元。対象をコードで明示する。
- パフォーマンス低下:
- 対策: 大量書き込みは「配列→一括代入+ScreenUpdating=False」で高速化。
- 行/列参照の勘違い:
- 対策: 行なら “3:3” や Rows(3)、列なら “A:A” や Columns(“A”) を使い分ける。EntireRow/EntireColumnは「基準セルの行/列」を取る。
