추세선 구하는 공식 - chuseseon guhaneun gongsig

엑셀 TrendX 는 차트 추세선의 값을 실시간으로 계산하거나 수식을 출력하는 함수입니다.

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.

엑셀 TrendX 함수는 지정한 차트 추세선의 Y 값을 실시간으로 계산하거나 추세선 수식을 출력하는 사용자 지정 함수입니다. 추세선 수식을 지원하는 지수, 선형, 로그, 다항식, 거듭제곱에서 모두 사용가능하며, 이동평균은 추세선을 지원하지 않으므로 TrendX 함수를 사용할 수 없습니다.

시트 안에 차트가 여러개 있을 경우, TrendX 함수의 첫번째 인수로 차트이름을 입력합니다. 차트 이름을 차트를 선택한 후, 수식입력줄 왼쪽의 이름 상자에서 확인할 수 있습니다.

Function TrendX(Optional ChartName As String, Optional Val As Double, Optional blnFormula As Boolean = False, Optional idx As Long = 1)
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'수정 및 배포 시 출처를 반드시 명시해야 합니다.
 
'■ TrendX 함수
'■ 특정 차트의 추세선 수식을 출력하거나 X값에 따른 Y결과값을 계산합니다.
'■ 사용방법
'TrendX( 차트명, X값, [수식출력], [범레번호] )
'■ 인수 설명
'_____________ChartName         : [선택인수] 차트이름을 입력합니다. 값을 입력하지 않을 경우 시트 첫번째 차트를 대상으로 동작합니다.
'_____________Val               : [선택인수] Y 결과값을 도출할 X 값입니다. 기본값은 0 입니다.
'_____________blnFormula        : [선택인수]TRUE일 경우 추세선 수식을 반환합니다. FALSE일 경우 계산된 Y값을 반환합니다. 기본값은 FALSE 입니다.
'_____________idx               : [선택인수]차트에 여러 범례가 있을 경우, 추세선이 입력된 대상 범례 번호를 입렵합니다. 기본값은 1 입니다.
'###############################################################
Dim Cht As Chart: Dim WS As Worksheet
Dim strFormula As String: Dim result As Double
Dim strTemp As String
Dim arr As Variant: Dim i As Long
Dim vSplitsP As Variant: Dim vSplitP As Variant
Dim vSplitsM As Variant: Dim vSplitM As Variant
 
Set WS = Application.Caller.Parent
If Len(ChartName) = 0 Or IsMissing(ChartName) Then
    Set Cht = WS.ChartObjects(1).Chart
Else
    Set Cht = WS.ChartObjects(ChartName).Chart
End If
 
If Cht.SeriesCollection(idx).Trendlines.Count = 0 Then TrendX = CVErr(xlErrNull): Exit Function
 
With Cht.SeriesCollection(idx).Trendlines(1)
.DisplayRSquared = False
.DisplayEquation = True
strFormula = .DataLabel.Text
End With
 
If strFormula = "" Then TrendX = CVErr(xlErrNull): Exit Function
 
If blnFormula = True Then TrendX = strFormula: Exit Function
If InStr(1, strFormula, "ln(x)") > 0 Then
    ReDim arr(0 To 0)
    arr(0) = Application.WorksheetFunction.Ln(Val)
    strFormula = Replace(strFormula, "ln(x)", "*" & CStr(arr(0)))
    strFormula = Replace(strFormula, "(", "-")
    strFormula = Replace(strFormula, ")", "")
ElseIf InStr(1, strFormula, "e") > 0 Then
    ReDim arr(0 To 0)
    strFormula = Replace(strFormula, "(", "-")
    strFormula = Replace(strFormula, ")", "")
    i = InStr(1, strFormula, "e")
    arr(0) = Exp(CDbl(Replace(Right(strFormula, Len(strFormula) - i), "x", "")) * Val)
    strFormula = Left(strFormula, i - 1)
    strFormula = strFormula & "*" & arr(0)
Else
    For i = 1 To 6
    strFormula = Replace(strFormula, "x" & i, "x^" & i)
    Next
    strFormula = Replace(strFormula, "E-", "*10^|")
    strFormula = Replace(strFormula, "E+", "*10^")
    strFormula = Replace(strFormula, "x", "*" & Val)
End If
 
strFormula = Replace(strFormula, " ", "")
strFormula = Replace(strFormula, ",", "")
strFormula = Replace(strFormula, "y=", "")
 
vSplitsP = Split(strFormula, "+")
 
For Each vSplitP In vSplitsP
    vSplitsM = Split(vSplitP, "-")
    For i = 0 To UBound(vSplitsM)
        If i = 0 Then
            If vSplitsM(i) <> "" Then
 
            result = result + Application.Evaluate(Replace(vSplitsM(i), "^|", "^-"))
            End If
        Else
              result = result - Application.Evaluate(Replace(vSplitsM(i), "^|", "^-"))
        End If
    Next
Next
 
TrendX = result
 
End Function