HOME > 即効テクニック > Excel VBA > セル操作関連のテクニック > 連続データを作成する(AutoFillメソッド)

連続データを作成する(AutoFillメソッド)|Excel VBA

セル操作関連のテクニック

連続データを作成する(AutoFillメソッド)

(Excel 97/2000/2002/2003/2007/2010/2013)

任意のセルに「1月」と入力してフィルハンドルをドラッグすると「2月」「3月」…という連続データを作成できます。Excelを始めたばかりのユーザーでもご存知の「オートフィル」機能ですね。これをマクロで実現するには、AutoFillメソッドを使います。

AutoFillメソッドの構文は次のとおりです。

Rangeオブジェクト.AutoFill(Destination, Type)

引数Destinationには、書き込み先のセル範囲を指定します。このとき、必ず基準となるセル範囲を含めます。
引数Typeはオートフィルの種類です。XlAutoFillType 列挙体のメンバを指定します。
よく使うものは次のとおりです。

     定数                          内容 
xlFillDefault (既定)        標準のオートフィル 	
xlFillCopy                  コピー 				
xlFillSeries                連続データ 
xlFillFormats               書式のみコピー 
xlFillValues                書式なしコピー
xlFillDays                  日単位
xlFillMonths                月単位
xlFillYears                 年単位
xlFillWeekdays              土日を除く平日

■1月〜12月の連続データを作成する

次のコードは、セル範囲A1:A12に「1月」〜「12月」の連続データを作成します。

Sub Sample1()
  With Range("A1")
    .Value = "1月"
    .AutoFill Destination:=Range("A1:A12")
  End With
End Sub

マクロで連続データを作成するには、RangeオブジェクトのAutoFillメソッドを使いますが、ワークシート上の手作業と違い、マクロでは「どこに」連続データを作成するか…というより、「いくつの」連続データを作成するかといった考え方が一般的でしょう。

上記のコードでは、セル範囲A1:A12に連続データを作成しますが、これを12個の連続データと考えれば、次のように書いた方が直感的でしょう。

Sub Sample2()
    With Range("A1")
        .Value = "1月"
        .AutoFill Destination:=.Resize(12)  '---(1)
    End With
End Sub

Resize(12)は、正確にはResize(12, 1)です。これは、1行×1列であるセルA1を、12行×1列のセル範囲A1:A12に変形してね、という命令です。
横方向に連続データを作る場合は(1)のコードを次のようにしてください。

        .AutoFill Destination:=.Resize(1, 12)

■ユーザーが指定した連続データを作成する

次のコードは、ユーザーが指定した文字列から指定した数の連続データを、変数bufに作成します。ワークシートを作業用シートとして使用し、最後にクリアしています。

Sub Sample3()
    Dim StartStr As String, cnt As Long, i As Long, buf As String
    
    StartStr = InputBox("連続データの元になる文字列を入力してください")
    If StartStr = "" Then Exit Sub
    
    cnt = Val(InputBox("作成する連続データの個数を入力してください"))
    If cnt < 1 Then Exit Sub
    
    With Range("A1")
        .Value = StartStr
        .AutoFill Destination:=.Resize(cnt)
        For i = 1 To cnt
            buf = buf & Cells(i, 1).Value & vbCrLf
        Next i
        .Resize(cnt).ClearContents
    End With
    
    MsgBox buf
End Sub