セルに値を代入
「1セルに入れる」「複数セルへ一括」「数式や書式もセット」「選択セルへ」「別シート・別ブックへ」まで、初心者がつまずきやすいポイントを避けながら使えるテンプレートと例題でまとめます。
基本:セルに値を入れる最短パターン
Sub SetCellValue_Basic()
'アクティブシートのA1へ文字列
Range("A1").Value = "こんにちは"
'B2へ数値(.Valueは省略可)
Range("B2") = 123
'C3へ日付(リテラルは # # で囲む)
Range("C3").Value = #2025/6/13#
'行列指定(Cells(row, col))
Cells(1, 1).Value = "左上" 'A1と同じ
End Sub
VB- ポイント: Range(“A1”).Value が基本。行・列で指定したい場合は Cells(row, col)。日付はリテラルで正しく代入でき、表示はセルの書式に依存します。
- 省略形: Range(“B2”) = 123 のように .Value は省略可能です。
複数セルへ一括で同じ値を入れる
Sub SetSameValueToRange()
'B4:B6 の3セル全てに同じ文字列
Range("B4:B6").Value = "在庫あり"
'数値も同様
Range("D4:D6").Value = 300
End Sub
VB- ポイント: 範囲に .Value を代入すると「全セル同一値」になります。列・行方向どちらでも同様に働きます。
異なる値を複数セルに一括で入れる(2次元配列)
Sub SetDifferentValuesWithArray()
Dim data(1 To 3, 1 To 1) As Variant '3行×1列(縦方向)
data(1, 1) = "A"
data(2, 1) = "B"
data(3, 1) = "C"
Range("E2:E4").Value = data '2次元配列を代入
'行×列どちらも可能な例(2行×3列)
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- ポイント: 1次元配列は使えません。複数セルに異なる値を入れたい時は「範囲サイズと一致する2次元配列」を .Value に渡します。1次元での Array(…) 代入は意図通り動作しないので注意。
数式や書式を合わせて設定する
Sub SetFormulaAndFormat()
'数式(合計)を代入
Range("F5").Formula = "=SUM(F2:F4)"
'通貨書式を設定
With Range("F2:F5")
.NumberFormatLocal = "#,##0;[赤]-#,##0" '負数は赤
.Font.Bold = True
End With
End Sub
VB- ポイント: 計算は .Formula で文字列として代入。見た目は NumberFormat(Local) や Font などで整えます。
選択中のセルだけに代入(作業グループ対応)
Sub SetValueToSelectedCells()
If TypeName(Selection) = "Range" Then
Selection.Value = "選択中"
End If
End Sub
VB- ポイント: Selection が範囲なら、そのすべてのセルに同じ値が入ります。多選択に強い簡易パターンです。
別シート・別ブックのセルに代入
Sub SetOtherSheetAndWorkbook()
'別シートを明示
Worksheets("顧客").Range("A1").Value = "顧客ID"
'別ブック(すでに開いている前提)
With Workbooks("月次集計.xlsm").Worksheets("売上")
.Cells(2, 1).Value = "商品A"
.Cells(2, 2).Value = 1200
End With
End Sub
VB- ポイント: 対象のワークシート・ブックを明示すると取り違えを防げます。
入力値をセルへ書き込む(安全な最短)
Sub WriteFromInputBox()
Dim text As String
text = InputBox("A1に入れる文字を入力してください")
If Len(text) = 0 Then Exit Sub
Range("A1").Value = text
End Sub
VB- ポイント: 空入力をスキップするだけで「意図しない上書き」を減らせます。
例題で練習
例題1:A列に1〜10を縦に連続で代入
Sub FillNumbersA1ToA10()
Dim i As Long
For i = 1 To 10
Range("A1").Offset(i - 1, 0).Value = i
Next
End Sub
VB例題2:売上表の見出しと初期値を一括セット
Sub SetupSalesTable()
With Range("B2:E2")
.Value = Array("商品", "単価", "数量", "金額") '横方向の見出し
.Font.Bold = True
End With
Range("E3:E12").Formula = "=C3*D3" '金額計算式を下まで(相対参照)
End Sub
VB例題3:複数セルに異なる文字列を一括代入(2×3)
Sub SetGridTexts()
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) = "D": arr(2, 2) = "E": arr(2, 3) = "F"
Range("H2:J3").Value = arr
End Sub
VB実務の落とし穴と対策
- 全セル同一値の仕様: 範囲.Value の一括代入は「同一値」しか入らない。異なる値は2次元配列かループを使う。
- 型の誤解: 日付や数式は文字列として扱われる文法がある。日付リテラルは # #、数式は .Formula で正しく代。
- 対象の取り違え: Worksheets(“名前”).Range(“…”) とブック・シートを明示するとミスが減る。
- Selection依存の不安定さ: 選択状態に左右される処理は誤操作のもと。必要時のみ使い、基本は対象を明示。
- パフォーマンス: 大量代入は ScreenUpdating を False に、可能なら配列で一括代入にするのが速い。
