Excel VBA 逆引き集 | 行全体/列全体に代入

Excel VBA
スポンサーリンク

行全体/列全体に代入

「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は「基準セルの行/列」を取る。
タイトルとURLをコピーしました