フィルをマクロで操作し、その戻り値をRangeとする関数

先日は、フィルをマクロで操作してみた。
infoment.hatenablog.com

でも、これだけだと面白くない。そこで、作成した連続データ範囲を戻り値とする関数にしてみた。
f:id:Infoment:20191227231426p:plain

このために必要な情報は、

初期値+増分値のn倍が、停止値となっていない場合

の振る舞いについてだ。どういうことかというと、例えば

  • 1から10まで4ずつ増やせ

と命じたとき、最後の値が幾つになるかで、戻り値の範囲が決まるということ。
f:id:Infoment:20191227231917p:plain

A.は、停止値手前の最大値。次の値で停止値を超えるため、ここで終了する。
B.は、停止値そのもの。超えようとして停止値に気づき、これを表示して終了。
C.は、停止値ピッタリで止まることが出来ず、停止値を飛び越えて終了。

実験してみると、正解はAだった。そこで先日のサブプロシージャを、次のように作り替えてみた。

Function DataSeriesRange(destination_range As Range, _
                Optional dsStart As Long = 1, _
                Optional dsStep As Long = 1, _
                Optional dsStop As Long = 10, _
                Optional dsRowCol As XlRowCol = xlRows, _
                Optional dsType As XlTrendlineType = xlLinear, _
                Optional dsDate As XlDataSeriesDate = xlDay, _
                Optional dsTrend As Boolean = False) As Range

        On Error GoTo er:

        With destination_range
            .Value = dsStart
            .DataSeries dsRowCol, dsType, dsDate, dsStep, dsStop, dsTrend
        End With
    
    Dim ResizeIndex As Long
        ResizeIndex = WorksheetFunction.RoundDown((dsStop - dsStart) / dsStep, 0) + 1
    
        Select Case dsRowCol
            Case xlRows
                Set DataSeriesRange = destination_range.Resize(, ResizeIndex)
            Case xlColumns
                Set DataSeriesRange = destination_range.Resize(ResizeIndex)
        End Select
        Exit Function
er:
    Set DataSeriesRange = Nothing
End Function

それでは、こちらでテストしてみよう。

Sub test()
    DataSeriesRange(Range("A1"), 1, 3, 30, xlColumns).Select
End Sub

結果、このようになった。
f:id:Infoment:20191227232411p:plain

ちゃんと指定通り、1から30まで3ずつ増やし、その範囲を選択している。
まずまずと言ったところか。

ところでこの関数、実は現時点で既に、二つの不具合を抱えている。

これについては明日以降、改良に挑戦してみます。

参考まで。