TL;DR —
source.AutoFill Destination, Typeは パターンを延長 します。コピーではありません。 2 つのルールが助けてくれます。Destinationはソースを含まなければなりません —Range("A1").AutoFill Destination:=Range("A1:A10")(A1 は A1:A10 の中にあります)。シードを除外すると 実行時 error 1004 になります。そしてTypeが、連続データ(xlFillSeries→ 1, 2, 3)になるか コピー(xlFillCopy→ 1, 1, 1)になるかを決めます。既定のxlFillDefaultは 推測 します。列の下方向へ 1 つのセルをコピーしたいだけなら、Range("B2:B1000").FillDownのほうが AutoFill と格闘するより簡単です。
' 連続データ:最初の値をシードとして置き、延長する
Range("A1").Value = 1
Range("A1").AutoFill Destination:=Range("A1:A10"), Type:=xlFillSeries ' 1..10
' 数式を列の下へ:相対参照が行ごとに調整される
Range("B2").Formula = "=A2*1.2"
Range("B2").AutoFill Destination:=Range("B2:B1000")
' 上のセルを下へコピーするだけ — Destination の体操は不要
Range("B2:B1000").FillDown
AutoFill は、フィルハンドルをドラッグする操作のコード版です。人はそれがコピーのように振る舞うと期待するので、1 が 1, 2, 3, 4 に変わると驚き、断片が明白な理由もなく 1004 を投げると途方に暮れます。どちらも、核となる考えを握れば筋が通ります。AutoFill は、そのシードを含まなければならない Destination をまたいで、シードからパターンを続けます。 コピーは繰り返し、AutoFill は 生成 します。Destination と Type を正しくすれば、連続データを敷いたり数式を列の下へ押し込んだりする、最もすっきりした方法になります。
この記事で学べること
- 考え方の軸 — AutoFill はパターンを延長するのであって、コピーしない
- Destination のルール — ソースは Destination の内側になければならない、さもなければ 1004
Type— 連続データ対コピー、そして既定の推測が当てにならない理由- 数式を下へ埋めて、参照を行ごとに調整させる
FillDown/FillRight(または配列)が AutoFill に勝るとき
考え方の軸:AutoFill はパターンを延長する
コピーは値を受け取り、それを繰り返します。AutoFill は シード — 最初の 1 つか 2 つのセル — を受け取り、検出したパターンが何であれ 続け ます。数値は連なりに、1, 2 は等差の連続データに、Jan は各月に、日付は連続する日になります。だからこそ Copy とは別のものとして存在するのです。
Range("A1").Value = 5
Range("A1").AutoFill Destination:=Range("A1:A5"), Type:=xlFillCopy ' 5, 5, 5, 5, 5
Range("C1").Value = 5
Range("C1").AutoFill Destination:=Range("C1:C5"), Type:=xlFillSeries ' 5, 6, 7, 8, 9
同じシード、同じ Destination — Type が違えば、結果はまったく違います。AutoFill を、シードを読んでパターンを生み出すジェネレーターとして見れば、以下の 2 つのルールはもう恣意的ではなくなります。シードは埋める対象の一部でなければならず、どのパターンを意味するかを伝えなければなりません。
Destination のルール:ソースは Destination の内側に
これは、すべての初心者の足を止める AutoFill のバグです。Destination の範囲は、ソースの範囲を含まなければなりません。 ソースがシードであり、シードは埋め込みの最初の部分です。
' 誤り — Destination がシードを除外している -> 実行時 error 1004
Range("A1").AutoFill Destination:=Range("A2:A10")
' 正しい — Destination がシードである A1 を含む
Range("A1").AutoFill Destination:=Range("A1:A10")
「A1 を A2:A10 に 入れる」ではなく、「A1 から A10 まで埋める」と考えましょう。シードの行はパターンが始まる場所なので、Destination の先頭に位置します。複数セルのシードも同じように働きます — A1:A2 に 1 と 2 をシードとして置き、AutoFill Destination:=Range("A1:A100") とすると、Excel は 2 つのシードセルから増分を読み取ります。「AutoFill が 1004 を投げる」という質問のほぼすべては、ソースを含め忘れた Destination です。
Type:連続データ対コピー、そして当てにならない既定
Type を省くと xlFillDefault になり、Excel はシードから 推測 します — 単独の数値はコピー、1, 2 は連続データ、Mon は平日になります。UI では便利ですが、コードでは危険です。意図が書き留められておらず、推測が裏返ることがあるからです。型を名指ししましょう。
| ほしいもの | Type |
|---|---|
| 1, 2, 3, … | xlFillSeries |
| 1, 1, 1, … | xlFillCopy |
| Mon, Tue, Wed(週末を飛ばす) | xlFillWeekdays |
| 連続する日 / 月 / 年 | xlFillDays / xlFillMonths / xlFillYears |
| 書式のみ | xlFillFormats |
| 書式なしの値 | xlFillValues |
Range("A1").Value = Date
Range("A1").AutoFill Destination:=Range("A1:A31"), Type:=xlFillMonths ' 1 か月ずつ
ルールは単純です。パターンが重要なら、それを明示する。 xlFillDefault に頼ると、1, 2, 3 がほしかったところに 1, 1, 1 のコピーが返ってきたり、繰り返しがほしかったところに増分する連続データが返ってきたりします。
数式を列の下へ埋める
日常で最も役立つ AutoFill は、数式を列の下へ押し込むことです。数式を埋めると、その 相対参照は行ごとに調整 され、フィルハンドルをドラッグするのとまったく同じになります。
Range("B2").Formula = "=A2*C2"
Range("B2").AutoFill Destination:=Range("B2:B1000") ' B3 は =A3*C3 になり、B4 は =A4*C4、...
数式については xlFillDefault がこれを正しく処理するので、ここで Type を指定する必要はめったにありません。これは「この数式を列全体に適用する」の定石であり、FillDown が存在するのに AutoFill が居場所を得ている理由でもあります — AutoFill はシードを置き、かつ 本物の連続データを延長できますが、素のコピーにはできません。フィルハンドルのモデルを使わずに数式を 1 回書いて調整させたいなら、.FormulaR1C1 が同じ仕事をします。VBA Formula を参照してください。
FillDown、FillRight、または配列が AutoFill に勝るとき
AutoFill はパターンエンジンです。パターンを生成 しない とき — ただ上のセルを下や横に繰り返したいだけ — なら、より単純な道具のほうが分かりやすく、「Destination がソースを含む」という儀式を省けます。
Range("B2:B1000").FillDown ' B2 を範囲全体の下へコピー
Range("B2:Z2").FillRight ' B2 を行全体の横へコピー
FillDown と FillRight は Type も個別の Destination も取りません — 呼び出す対象の範囲そのものが埋め込みで、上のセルがシードです。数式を含まない純粋な数値の連続データなら、Variant 配列 を 1 回の代入で範囲に書き込むほうがさらに速く、ワークシートの操作を完全に避けられます。私のルール:Excel のパターンエンジンが必要なとき — 本物の連続データ、平日、ユーザー設定リスト — にだけ AutoFill に手を伸ばし、素のコピーには FillDown / FillRight か配列を使う。大きな埋め込みでは、先に再計算と画面更新をオフにしましょう。VBA Calculation と VBA ScreenUpdating を参照してください。
ExcelMaster の活用
時間を無駄にする AutoFill のミスは予測可能です。シードを除外して 1004 を投げる Destination、連続データがほしかったのにコピーになった欠けた Type、そして本当は 1 行の FillDown で済む仕事のための AutoFill との格闘です。どれも、知ってしまえば難しくありません — ただ、記憶だけで書くと間違えやすいのです。
ExcelMaster は、仕事の形に合った道具を選びます。「これらの行に 1 から 500 まで番号を振って」と頼めば、シードを含む Destination で連続データをシードして延長し、「この数式を最終行まで下へコピーして」と頼めば、脆いハードコードの高さではなく使用範囲に対して FillDown を使います。意図がページに残るよう Type を明示し、値だけが必要なときは素の配列書き込みに切り替えます。あなたはパターンを説明するだけ。1004 なしでそれを敷くのは、それがやります。
よくある質問
VBA で AutoFill を使うには?
シードの範囲に AutoFill を呼び、シードを含む Destination を渡します。Range("A1").AutoFill Destination:=Range("A1:A10"), Type:=xlFillSeries です。シードは最初の 1 つか 2 つの値、Destination は埋める範囲全体(シードを含む)、Type は連続データを延長するかコピーするかを指定します。先にシードのセルを設定してから AutoFill を呼びましょう。
AutoFill で実行時 error 1004 になるのはなぜ?
ほぼつねに、Destination がソースを含まないからです。Range("A1").AutoFill Destination:=Range("A2:A10") はシードの A1 を除外して 1004 を投げます。代わりに Range("A1:A10") を使い、シードが Destination の先頭に来るようにしましょう。「A1 を A2:A10 に入れる」ではなく「A1 から A10 まで埋める」と読みましょう。
VBA の AutoFill と FillDown の違いは?
FillDown は範囲の上のセルを範囲全体の下へコピーします — Type も個別の Destination もなく、Range("B2:B1000").FillDown だけです。AutoFill はシードから パターン を延長し、シードを含む Destination が必要です。素のコピーには FillDown(または FillRight)を、1, 2, 3 や各月のような本物の連続データが必要なときは AutoFill を使いましょう。
VBA で数式を列の下へ AutoFill するには?
数式をシードのセルに書き、それを下へ AutoFill します。Range("B2").Formula = "=A2*C2" に続けて Range("B2").AutoFill Destination:=Range("B2:B1000") です。相対参照が行ごとに調整されるので、B3 は =A3*C3 になります。数式については Type を省けます。Range("B2:B1000").FillDown は同じことをより簡単に行います。
AutoFill で日付や月の連続データを埋めるには?
最初の日付をシードにして日付の Type を渡します。Range("A1").Value = Date としてから、連続する日には Range("A1").AutoFill Destination:=Range("A1:A31"), Type:=xlFillDays、それらの増分には xlFillMonths / xlFillWeekdays / xlFillYears です。型を名指しすれば、xlFillDefault がシードからパターンを推測するのに頼らずに済みます。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-01。
関連ガイド: VBA Cell Value · VBA Formula · VBA Copy Paste · VBA Range · VBA ScreenUpdating
