記事ID: 070
タイトル: 【VBA】オートフィルで連続データを自動入力する方法(コピペOK)
カテゴリ: セル操作
一次キーワード: VBA オートフィル 連続データ 自動
想定読者: 連番・日付・曜日などの連続データを手入力している初心者〜初級者
検索意図: VBAのAutoFillメソッドで連続データを自動入力する方法を知りたい
読者の悩み(1文): 1, 2, 3…と数えながら100行分の連番を手入力したり、日付を1日ずつ手で入れるのが正直めんどくさい
読了後にできること(1文): VBAのAutoFillメソッドで連番・日付・曜日・数式の連続データをコピペで自動入力できるようになる
前提条件:
- Excel版: Excel 2016以降 / Microsoft 365
- OS: Windows 10/11
- 保存形式: .xlsm(マクロ有効ブック)
- 貼り付け場所: 標準モジュール
- 実行方法: マクロ実行(F5)またはボタン割り当て
更新日: 2026-03-11
Contents
この記事でわかること
VBAのAutoFillメソッドで連番・日付・曜日・数式の連続データを自動入力する方法を、コピペで動くコード付きで解説します。
- 対象:連番や日付を手入力している人
- 所要時間:コピペ → 実行まで3分
完成イメージ
実行前:
| A列 |
|---|
| (空白) |
| (空白) |
| (空白) |
| … |
| (空白) |
(A1〜A100まですべて空白の状態)
実行後:
| A列 |
|---|
| 1 |
| 2 |
| 3 |
| … |
| 100 |
マクロを実行すると、A1〜A100に1〜100の連番が一瞬で入力されます。
さらに実務版では、指定した開始日から1ヶ月分の日付と曜日が自動生成されます。
A列 B列
┌──────────┬──────────┐
│ 2026/04/01 │ 水曜日 │
│ 2026/04/02 │ 木曜日 │
│ 2026/04/03 │ 金曜日 │
│ ... │ ... │
│ 2026/04/30 │ 木曜日 │
└──────────┴──────────┘
自分も100行以上の連番を手入力していたことがあります。「1, 2, 3…」と数えながら入力するのが正直めんどくさかったし、日付を1日ずつ手で入れるのも地味にしんどい作業でした。
VBAのAutoFillを使ったら、数百行の連番も日付の連続データも一瞬で入力できるようになりました。月次テンプレートの日付列も自動生成できるので、テンプレートの準備が一瞬で終わります。
同じように連続データを手入力している人が、この記事でAutoFillを使えるようになればうれしいです。
基本:AutoFillで連番を入力する
まずは最もシンプルな例。A1〜A100に1〜100の連番を自動入力します。
Sub 連番を入力する()
Range("A1").Value = 1
Range("A2").Value = 2
Range("A1:A2").AutoFill Destination:=Range("A1:A100")
End Sub
ポイント:
- A1に
1、A2に2を入れることで「1ずつ増加」のパターンをAutoFillに認識させます Destination:=Range("A1:A100")で、A1〜A100の範囲に連続データが入力されます- Destinationは元範囲(A1:A2)を含む必要があります。
A3:A100と指定するとエラーになります - 範囲を変えるだけで、どんなサイズにも対応できます(例:
Range("A1:A500")のように変更してください)
連番を振る別の方法として、Forループで1行ずつ入力する方法もあります。使い分けについては自動連番を振る方法を参照してください。
日付の連続データを入力する
今日の日付から31日分の日付を連続で入力します。
Sub 日付の連続データ()
Range("A1").Value = Date ' 今日の日付
Range("A1").AutoFill Destination:=Range("A1:A31"), Type:=xlFillSeries
End Sub
ポイント:
Dateは今日の日付を返すVBA関数ですType:=xlFillSeriesを指定すると、1日ずつ増加する連続データになります- 日付の場合、元データは1セルだけでOKです(数値と違い、Excelが「日付は1日ずつ増加」と判定できるため)
表示形式を設定する
日付がシリアル値(数字)で表示される場合は、表示形式を設定してください。
Sub 日付の連続データ_書式付き()
Range("A1").Value = Date
Range("A1").AutoFill Destination:=Range("A1:A31"), Type:=xlFillSeries
' 表示形式を設定
Range("A1:A31").NumberFormat = "yyyy/mm/dd"
End Sub
日付操作の詳細は日付・曜日の判定で月末処理を自動化も参考になります。
曜日・月名の連続データを入力する
「月曜日」から7日分の曜日を自動入力します。
Sub 曜日の連続データ()
Range("A1").Value = "月曜日"
Range("A1").AutoFill Destination:=Range("A1:A7")
End Sub
結果:
| A列 |
|---|
| 月曜日 |
| 火曜日 |
| 水曜日 |
| 木曜日 |
| 金曜日 |
| 土曜日 |
| 日曜日 |
短縮形でもOK
Sub 曜日の短縮形()
Range("A1").Value = "月"
Range("A1").AutoFill Destination:=Range("A1:A7")
End Sub
「月」→「火」→「水」…と短縮形の曜日が入力されます。
月名の連続データ
Sub 月名の連続データ()
Range("A1").Value = "1月"
Range("A1").AutoFill Destination:=Range("A1:A12")
End Sub
「1月」→「2月」→…→「12月」と入力されます。
Excelが認識できる連続データのパターン(曜日・月名・干支など)であれば、AutoFillは
xlFillDefault(自動判定)でパターンを継続します。
数式をオートフィルでコピーする
数式を含むセルをオートフィルすると、相対参照が自動で調整されます。
Sub 数式をオートフィル()
' B列に単価、C列に数量が入っている前提
Range("D1").Formula = "=B1*C1"
Range("D1").AutoFill Destination:=Range("D1:D10"), Type:=xlFillCopy
End Sub
結果:
- D1:
=B1*C1 - D2:
=B2*C2 - D3:
=B3*C3 - … (相対参照が自動で調整される)
ポイント:
Type:=xlFillCopyは元データをコピーします(数式の相対参照は自動調整されます)Typeを省略しても同じ結果になることが多いですが、数式コピーの意図を明確にするためにxlFillCopyを指定するのがおすすめです
AutoFillの種類(xlFillDefault, xlFillSeries, xlFillCopy等)
AutoFillの Type 引数に指定できる定数の一覧です。
| 定数 | 意味 | 使いどころ |
|---|---|---|
xlFillDefault |
自動判定(デフォルト) | 元データに応じて最適なフィル方法を自動選択。迷ったらこれ |
xlFillSeries |
連続データ | 数値を1ずつ増加、日付を1日ずつ増加させたいとき |
xlFillCopy |
コピー | 元データをそのままコピー。数式の相対参照は調整される |
xlFillDays |
日単位 | 日付を1日ずつ増加(xlFillSeriesと同様) |
xlFillMonths |
月単位 | 日付を1ヶ月ずつ増加(1/1→2/1→3/1…) |
xlFillYears |
年単位 | 日付を1年ずつ増加(2026/1/1→2027/1/1→…) |
xlFillWeekdays |
平日のみ | 土日を飛ばして日付を増加。営業日ベースのスケジュール作成に便利 |
よく使う組み合わせ
' 連番(1, 2, 3...)
Range("A1:A2").AutoFill Destination:=Range("A1:A100") ' Type省略でOK
' 日付(1日ずつ増加)
Range("A1").AutoFill Destination:=Range("A1:A31"), Type:=xlFillSeries
' 月単位(1ヶ月ずつ増加)
Range("A1").AutoFill Destination:=Range("A1:A12"), Type:=xlFillMonths
' 数式コピー
Range("D1").AutoFill Destination:=Range("D1:D10"), Type:=xlFillCopy
' 平日のみ(土日スキップ)
Range("A1").AutoFill Destination:=Range("A1:A22"), Type:=xlFillWeekdays
Typeを省略するとxlFillDefault(自動判定)になります。ほとんどの場合はこれでうまくいきますが、意図と違う結果になったらTypeを明示してみてください。
実務版:月次テンプレートに日付列を自動生成する
※ 実行前にブックを上書き保存しておくと安心です。
※ ClearContentsでシートの既存データをクリアします。クリアした内容は元に戻せないので、大切なデータがある場合は事前に保存してください。
自分は月次報告テンプレートの日付列を自動生成するマクロを作ってから、テンプレートの準備が一瞬で終わるようになりました。毎月の日付と曜日を手入力していたのが嘘のようです。
Sub 月次テンプレート日付生成()
Dim ws As Worksheet
Dim startDate As Date
Dim endDate As Date
Dim days As Long
Dim i As Long
Set ws = ActiveSheet
' --- 開始日を設定(翌月の1日) ---
startDate = DateSerial(Year(Date), Month(Date) + 1, 1)
endDate = DateSerial(Year(startDate), Month(startDate) + 1, 0) ' 月末日
days = Day(endDate) ' その月の日数
' --- 既存データをクリア ---
' ※ クリアした内容は元に戻せません
ws.Range("A1:C" & days + 1).ClearContents
' --- 見出し行 ---
ws.Range("A1").Value = "日付"
ws.Range("B1").Value = "曜日"
ws.Range("C1").Value = "備考"
' --- 日付列をAutoFillで生成 ---
ws.Range("A2").Value = startDate
If days > 1 Then
ws.Range("A2").AutoFill Destination:=ws.Range("A2:A" & days + 1), Type:=xlFillSeries
End If
' --- 曜日列を数式で生成 ---
ws.Range("B2").Formula = "=TEXT(A2,""aaaa"")"
If days > 1 Then
ws.Range("B2").AutoFill Destination:=ws.Range("B2:B" & days + 1), Type:=xlFillCopy
End If
' --- 表示形式を設定 ---
ws.Range("A2:A" & days + 1).NumberFormat = "yyyy/mm/dd"
' --- 書式を整える ---
ws.Range("A1:C1").Font.Bold = True
ws.Columns("A:C").AutoFit
MsgBox Format(startDate, "yyyy年m月") & "のテンプレートを作成しました(" & days & "日分)"
End Sub
このコードのポイント:
DateSerial(Year(Date), Month(Date) + 1, 1)で翌月の1日を取得DateSerial(Year, Month + 1, 0)で月末日を取得(翌月の0日=当月末日)- 日付列は
AutoFill+xlFillSeriesで1日ずつ増加 - 曜日列は
TEXT(A2,"aaaa")の数式をAutoFill+xlFillCopyで展開 - データの最終行を動的に計算するので、月の日数(28〜31日)に自動対応
データ範囲の終端を正確に取得する方法は最終行・最終列を取得する方法を参照してください。オートフィル後に書式を整えたい場合はセルの書式を一括変更する方法も参考になります。
このマクロを全シートに一括適用したい場合は、
For Each ws In ThisWorkbook.Worksheetsで各シートをループしてください。
落とし穴
自分もAutoFillを初めて使ったとき、元範囲(Source)と先範囲(Destination)の関係を間違えて、元データが上書きされてしまったことがあります。Destination:=Range("A3:A100") のように元範囲を含まない範囲を指定したらエラーになるし、方向を間違えると元データが消える。「Destinationは元範囲を含む」というルールに気づくまで、何度もやり直しました。
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 「AutoFillメソッドが失敗しました」エラーが出る | Destinationが元範囲を含んでいない(例: 元範囲 A1:A2、Destination A3:A100) |
Destinationは元範囲を含む範囲にする(例: A1:A100) |
| 2 | 連番ではなく同じ値(1, 1, 1…)がコピーされる | 元データが数値1セルだけ(A1=1のみ)で xlFillDefault だとコピー扱いになる。※日付や曜日は1セルでも連続データを認識します |
連番なら2セル以上にパターンを入れる(A1=1, A2=2)。または Type:=xlFillSeries を明示する |
| 3 | 元データが上書き・消えてしまった | SourceとDestinationの行列方向が不一致。縦方向のSourceに横方向のDestinationを指定した等 | SourceとDestinationの方向(縦/横)を必ず揃える |
| 4 | 日付がシリアル値(46113のような数字)で表示される | オートフィル先のセルに日付の表示形式が設定されていない | オートフィル後に .NumberFormat = "yyyy/mm/dd" で表示形式を設定する |
| 5 | 横方向にオートフィルしたいのにエラーになる | 元範囲が縦方向(A1:A2)なのにDestinationが横方向(A1:E1) | 横方向なら元範囲も横方向にする(例: Range("A1:B1").AutoFill Destination:=Range("A1:L1")) |
FAQ
Q1. AutoFillとForループで連番を入れるのはどちらがよい?
単純な連番なら For i = 1 To 100: Cells(i, 1).Value = i: Next i のほうがシンプルです。AutoFillは日付・曜日・数式コピーなど、Excelの「オートフィル」パターンを活用したいときに便利です。使い分けの詳細は自動連番を振る方法を参照してください。
Q2. AutoFillで2ずつ増加(1, 3, 5, 7…)させるには?
元データに差分のパターンを入れます。
Sub 奇数の連番()
Range("A1").Value = 1
Range("A2").Value = 3
Range("A1:A2").AutoFill Destination:=Range("A1:A50")
End Sub
A1=1、A2=3で「+2」のパターンをAutoFillが検出し、1, 3, 5, 7, 9…と入力されます。
Q3. 横方向にオートフィルするには?
元範囲とDestinationを横方向で指定します。
Sub 横方向にオートフィル()
Range("A1").Value = "1月"
Range("A1").AutoFill Destination:=Range("A1:L1")
End Sub
A1〜L1に「1月」〜「12月」が入力されます。
Q4. オートフィル後に書式も自動で設定するには?
AutoFillはデフォルトで書式もコピーします。値だけコピーしたい場合は Type:=xlFillValues、書式だけコピーしたい場合は Type:=xlFillFormats を指定してください。書式変更の詳細はセルの書式を一括変更する方法を参照。
Q5. 全シートにオートフィルを一括で適用するには?
For Each で全シートをループします。
Sub 全シートに連番を入力()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Range("A1").Value = 1
ws.Range("A2").Value = 2
ws.Range("A1:A2").AutoFill Destination:=ws.Range("A1:A100")
Next ws
End Sub
詳しくは複数シートを一括処理する方法を参照してください。
まとめ
この記事では、VBAのAutoFillメソッドで連続データを自動入力する方法を解説しました。
- 連番: A1=1, A2=2 →
Range("A1:A2").AutoFill Destination:=Range("A1:A100") - 日付:
Type:=xlFillSeriesで1日ずつ増加 - 曜日: 「月曜日」を入れてAutoFill → 自動で曜日が続く
- 数式コピー:
Type:=xlFillCopyで相対参照が自動調整 - 月単位:
Type:=xlFillMonthsで1ヶ月ずつ増加 - 実務版: 翌月の日付+曜日を自動生成する月次テンプレートマクロ
関連記事:
- 自動連番を振る方法 — Forループとの使い分け、行の追加・削除に対応した連番
- セルの書式を一括変更する方法 — オートフィル後のフォント・背景色・配置の自動設定
次にやりたくなること
- 行の追加・削除に対応した自動連番を振りたい → 自動連番を振る方法
- 日付から曜日を判定して月末処理を自動化したい → 日付・曜日の判定で月末処理を自動化


コメント