엑셀 차트 추세선 함수 출력 :: TrendX 명령문 사용법

차트 추세선의 예측값을 계산하거나 수식을 출력하는 TrendX 함수의 사용법 및 동작원리를 살펴봅니다.

작성자 :
오빠두엑셀
최종 수정일 : 2021. 04. 26. 23:05
URL 복사
메모 남기기 : (13)

엑셀 차트 추세선 함수 출력 :: TrendX 명령문 사용법

엑셀 TrendX 명령문 목차 바로가기
요약

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

명령문 구문
= TrendX ( [차트이름], [X값], [수식출력], [범례번호] )
사용된 인수 및 변수 알아보기
인수 설명
차트이름
[String, 선택인수]
추세선을 불러올 차트의 이름입니다. 기본값은 함수가 입력된 시트의 첫번째 차트입니다.
X값
[Double, 선택인수]
X값을 입력합니다. 숫자만 입력할 수 있습니다. 기본값은 0 입니다.
수식출력
[Boolean, 선택인수]
TRUE일 경우 Y값을 계산하지 않고 수식을 출력합니다. 기본값은 FALSE 입니다.
범례번호
[Long, 선택인수]
차트에 범례가 여러개 있을 경우, 추세선이 추가된 범례의 순번을 입력합니다. 기본값은 1 입니다.

예제파일 다운로드

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


상세 설명

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

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

엑셀 차트 이름 확인
차트를 선택하면 이름상자에서 차트이름을 확인할 수 있습니다.
실전 사용 예제
  1. 시트 내 첫번째 차트의 추세선 수식을 출력하기
    =TrendX(,,True)
    '시트 내 첫번째 차트의 추세선 수식을 출력합니다.
  2. "차트 1"의 추세선에서, x가 100일 경우 y값 예측하기
    =TrendX("차트 1",100)
    'x가 100일 경우 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
명령문 동작원리 단계별 알아보기
  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
  2. 차트이름이 누락되었을 경우, 시트의 첫번째 차트를 대상으로 지정합니다.
    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
  3. 지정한 범례에 추세선이 없을 경우, Value 오류를 반환 후 함수를 종료합니다.
    If Cht.SeriesCollection(idx).Trendlines.Count = 0 Then TrendX = CVErr(xlErrNull): Exit Function
  4. 해당 범례의 결정계수 표시를 끄고, 추세선 수식이 보이지 않을 경우 추세선 수식을 표시합니다.
    With Cht.SeriesCollection(idx).Trendlines(1)
    .DisplayRSquared = False
    .DisplayEquation = True
    strFormula = .DataLabel.Text
    End With
  5. 추세선 수식이 비어있을 경우 오류 출력 후 함수를 종료합니다.
    If strFormula = "" Then TrendX = CVErr(xlErrNull): Exit Function
  6. 수식표시가 True일 경우 수식을 출력합니다.
    If blnFormula = True Then TrendX = strFormula: Exit Function
  7. 추세선 수식을 계산합니다.
    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
  8. 계산된 결과 출력 후 함수를 종료합니다.
    TrendX = result
5 7 투표
게시글평점
13 댓글
Inline Feedbacks
모든 댓글 보기
13
0
여러분의 생각을 댓글로 남겨주세요.x