フィルをマクロで操作し、その戻り値をRangeとする関数(データ予測への対応)

昨日は、フィルをマクロで操作し、その戻り値をRangeとする関数を作成してみた。
infoment.hatenablog.com

しかしこの関数、現時点でまだ幾つか問題を抱えており未完成。そこで、この解決に取り組んでみる。
f:id:Infoment:20191228221401p:plain

まずおさらいとして、前回の関数を再掲する。

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

この中の「dsTrend」という引数は、↓こちらの「データ予測」に相当する。
f:id:Infoment:20191228223421p:plain

このように停止値を指定するのではなく、選択範囲内で値を増やすよう指定することができる。
f:id:Infoment:20191228223557p:plain
f:id:Infoment:20191228223621p:plain

しかし上記関数を用いて同様のことを試みると、意図しない結果になった。

Sub test()
    DataSeriesRange destination_range:=Range("A1").Resize(11), _
                    dsRowCol:=xlColumns, _
                    dsTrend:=True
End Sub

f:id:Infoment:20191228224146p:plain

これは考えてみれば当たり前の話で、最初のこの部分で

        With destination_range
            .Value = dsStart

指定範囲を全て初期値で埋めてしまっていた。これでは変化のしようがない。
ややこしくなる元凶と考え、開始値は必ず指定する仕様に変更した。

ということで、現時点での最新版がこちら。

Function DataSeriesRange(destination_range As Range, _
                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:

        destination_range.DataSeries dsRowCol, dsType, dsDate, dsStep, dsStop, dsTrend
    
    Dim dsStart As Variant
        dsStart = destination_range.Cells(1).Value
    
    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 destination_range:=Range("A1").Resize(15), _
                    dsRowCol:=xlColumns, _
                    dsTrend:=True
End Sub

停止値の初期値は10で、指定範囲の15より小さいが、データ予測の場合は停止値が無視されるようだ。

でも、まだ問題が残っている。

明日に続きます。

参考まで。