Excel VBA 逆引き集 | 複数セルに一括代入

Excel VBA
スポンサーリンク

複数セルに一括代入

「同じ値をまとめて入れる」「異なる値を一括で入れる」「縦横の配列をそのまま貼る」「高速に大量代入」まで、初心者でも迷わず使えるテンプレートを実用例付きでまとめます。


基本:同じ値を複数セルへ一括代入

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 を明示し、存在チェックや名前の確認を癖にする。
タイトルとURLをコピーしました