和風スパゲティのレシピ

日本語でコーディングするExcelVBA

オートフィルで連続データを作成する - AutoFill

Excelのオートフィル機能をVBAから実行し、
セルのコピーや連続データの作成を行う方法を解説します。

RangeオブジェクトのAutoFillメソッドを使用します。

基本形

始点セル.AutoFill Destination:=出力セル範囲, Type:=オートフィル設定

' 省略形
始点セル.AutoFill 出力セル範囲, オートフィル設定

実行例

' A1セルの内容をA1:A5までコピー
Range("A1").AutoFill Range("A1:A5"), xlFillCopy

' A1セルの値のみをA1:A5までコピー
Range("A1").AutoFill Range("A1:A5"), xlFillValues

' A1からA100セルまでに連番を出力
Range("A1").Value = 1
Range("A1").AutoFill Range("A1:A100"), xlFillSeries

' A1セルからA12セルまでに2025年の各月1日を出力
Range("A1").Value = DateSirial(2025, 1, 1)
Range("A1").AutoFill Range("A1:A12"), xlFillMonths

解説

RangeオブジェクトのAutoFillメソッドを使用することで、
Excelにおける「オートフィル」と同じ操作をVBAで実行できます。

第2引数「Type」はExcelのフィルハンドルダイアログと対応しており、
以下の値を設定可能です。

フィルハンドルダイアログ

定数名 内容
xlFillDefault 0 Excelによる自動判定
xlFillCopy 1 セルのコピー
xlFillSeries 2 連続データ
xlFillFormats 3 書式のみコピー
xlFillValues 4 書式なし(値のみ)コピー
xlFillDays 5 連続データ(日単位)
xlFillWeekdays 6 連続データ(平日のみ)
xlFillMonths 7 連続データ(月単位)
xlFillYears 8 連続データ(年単位)
xlLinearTrend 9 連続データ(加算推定)
xlGrowthTrend 10 連続データ(乗法推定)
xlFlashFill 11 フラッシュフィル


上記のうち、日付系列の連続データ実行例は以下の通りです。

xlFillDays xlFillWeekdays xlFillMonths xlFillYears
4/15 4/15 4/15 2025/4/15
4/16 4/16 5/15 2026/4/15
4/17 4/17 6/15 2027/4/15
4/18 4/18 7/15 2028/4/15
4/19 4/21 8/15 2029/4/15
4/20 4/22 9/15 2030/4/15
4/21 4/23 10/15 2031/4/15
4/22 4/24 11/15 2032/4/15
4/23 4/25 12/15 2033/4/15
4/24 4/28 1/15 2034/4/15
4/25 4/29 2/15 2035/4/15
4/26 4/30 3/15 2036/4/15


第2引数省略時は「0:Excel自動判定」が指定されたとみなされます。

Excelで手作業実行する時と同様、

Range("A1:A2").AutoFill Range("A1:A10")

このように始点を複数のセルにしておくことで、
A1とA2の関係でコピーor連続データを自動判定させることもできます。


が、せっかくVBAで組むのに実行内容をExcelに推定させる必要もないので、
基本は第2引数もしっかり指定して実行することをおすすめします。

AutoFillメソッドの処理速度

AutoFillメソッドの有用な点として、処理速度が高速です。

AutoFillメソッドで実行する処理はどれも単純なFor文で代替可能ですが、
For文で1セルずつ出力するのに比べて数百~数千倍の速度が出ます。


特に大量の連番出力などで速度に困った場合は、
AutoFillメソッドの利用を検討してください。


※ より正確に、AutoFillメソッドが高速である理由は、
セル(Rangeオブジェクト)へのアクセス回数が1回で済むためです。
For文で連番配列を生成してからセルに出力するコードとほぼ同速と捉えてください。

※ Excelのバージョンが対応しているのであれば、
WorksheetFunction.Sequenceともほぼ同速です。

Resizeプロパティとの併用

フィルさせるセルの個数が決まっている場合は、
以下のようにResizeプロパティを活用するとコードがスッキリします。

' 1~100の連番を出力
始点セル.Value = 1
始点セル.AutoFill 始点セル.Resize(100), xlFillSeries

' A1セルからA12セルまでに2025年の各月1日を出力
始点セル.Value = DateSirial(2025, 1, 1)
始点セル.AutoFill 始点セル.Resize(12), xlFillMonths

100個の連番や12ヶ月など、出力するセルの個数の方が決まっている場合は、
Resizeプロパティを有効活用してください。

AutoFillメソッドがエラーとなるパターン

このメソッドは意外とエラーになるパターンが少なく、
たとえばExcelでユーザー操作では実行できないような、

Range("A1").AutoFill Range("A1:B5")

この実行をしても、以下のような不思議な結果になります。

不思議なオートフィル


また、日付でない数値に対して日付系の連続データを指定した場合は、
ただのコピーとして動きます。

Range("A1").Value = 1
Range("A1").AutoFill Range("A1:A12"), xlFillMonths
' ↑「1」に対して「月ごと」を指定するとただのコピーとして扱われる(全セルに1が入る)

 
意図しない処理を書いてしまってもエラーが出てくれないということなので、
注意して使用してください。


はっきりとエラーになる主なパターンとしては、

① 出力範囲が矩形ではない(Areasが1つではない)場合

Range("A1").AutoFill Range("A1,A3,A5"), xlFillCopy

 
② 始点セルと出力範囲が別シートである場合

Worksheets(1).Range("A1").AutoFill Worksheets(2).Range("A1:A5"), xlFillCopy

この2つが該当し、いずれも

RangeクラスのAutoFillメソッドが失敗しました。

エラーとなります。

AutoFillメソッドでエラーが発生した際は、
セル範囲の取得が正しいかをまずは確認してください。