🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の AutoFill — Destination の罠を避けて連続データや数式を埋める

|

Excel VBA の AutoFill — Destination の罠を避けて連続データや数式を埋める

TL;DRsource.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 は、フィルハンドルをドラッグする操作のコード版です。人はそれがコピーのように振る舞うと期待するので、11, 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:A212 をシードとして置き、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 を行全体の横へコピー

FillDownFillRightType も個別の Destination も取りません — 呼び出す対象の範囲そのものが埋め込みで、上のセルがシードです。数式を含まない純粋な数値の連続データなら、Variant 配列 を 1 回の代入で範囲に書き込むほうがさらに速く、ワークシートの操作を完全に避けられます。私のルール:Excel のパターンエンジンが必要なとき — 本物の連続データ、平日、ユーザー設定リスト — にだけ AutoFill に手を伸ばし、素のコピーには FillDown / FillRight か配列を使う。大きな埋め込みでは、先に再計算と画面更新をオフにしましょう。VBA CalculationVBA 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