오빠두엑셀 `2026 무료 챌린지` 오픈! 완주하고 수료증 받아가세요! 5년 연속 IT분야 베스트셀러! 「 진짜쓰는 실무엑셀 」로 2026년 공부 끝내기 엑셀이 막히셨나요? Q&A 게시판에서 바로 해결하세요.
메뉴

엑셀 차트 추세선 함수 출력 :: 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
댓글 13
5 (7개 평가)
유리화뉘
유리화뉘 2021.04.29 08:28
안녕하세요. 덕분에 많이 배우고 있습니다.
아래 구문의 뜻이 무엇인지 궁굼해서 여쭤봅니다..
Application.Evaluate(Replace(vSplitsM(i), "^|", "^-"))
"^|", "^-" 의 의미가 어떤건가요??
그럼 잘 부탁 드립니다.
감사합니다.~~
오빠두엑셀
오빠두엑셀 작성자 2021.05.07 02:01
안녕하세요.
^|과 ^-는 지수표시를 구분하기 위한 일종의 구분자로 큰 의미는 없습니다.
^|, ^- 대신, ^** , ^- 등으로 바꿔서 사용하셔도 무방합니다.
제시해드린 답변이 도움이 되셨길 바랍니다. 감사합니다.
천재지변
천재지변 2021.05.31 16:38
ㅋㅋ 그냥 ^^ 웃는 표시인줄...;;;;;
이창원
이창원 2021.05.02 17:45
good !!!!
이상헌
이상헌 2021.11.23 10:38
안녕하세요. 항상 많이 배우고 있습니다. 감사합니다.

TrendX와 관련된 문의 사항 Q&A에 올렸는데 답변주신다면
정말 감사하겠습니다.

https://www.oppadu.com/question/?uid=23837&mod=document&pageid=1

올린 댓글이 안보여 두개나 달았습니다. 죄송합니다.
오빠두엑셀
오빠두엑셀 작성자 2021.11.24 18:44
이상헌님 안녕하세요?^^
댓글 남겨 드렸으니 확인해보시길 바랍니다.
감사합니다.
ju0****
ju0**** 2023.03.16 23:49
안녕하세요! 처음 뵙겠습니다. 제가 이 포스팅과 홈페이지를 처음 방문해서 잘 몰라서 그러는데요, 혹시 위의 명령문은 어디에 쓰는 건가요..?? 파이썬 같은 곳에 입력하는 건가요..??
오빠두엑셀
오빠두엑셀 작성자 2023.03.18 02:37
안녕하세요.
엑셀 VBA 매크로 편집기에 작성하면 됩니다.
taz****
taz**** 2023.04.18 15:01
안녕하세요. 실상업무중에 유용하게 사용하고있습니다.

해당 매크로를 사용하는 중 데이터 유효성 검사의 목록을 이용하여 차트를 사용하고 있는데요 그때 추세선에 대한 값을 불러오기위하여 위의 매크로를 사용합니다.

그런데 목록선택후에 값이 바로 반영되는게 아니라서 새로 고침을 진행해야지 추세값이 표기되는데요 해결 방법이 있을까요??

위의 댓글중 (이상헌 2021년 11월 23일 10:38 오전) 님의 코드에 적용을 해봤을때도 유효성 검사를 이용하면 바로 반영이 안되더라구요... ㅠㅠ
럽큘
럽큘 2023.08.25 15:25
선생님 좋은 강의 감사드립니다.

수식
y = 0.009ln(x) + 0.1322R² = 0.9963

= trendX("차트 1", 1) --> 답 0.1322
= trendX("차트 1", 0.5) --> 오류
아마 ln(0.5) = -0.693147181 로 음수가 나와서 오류가 나는 것 같습니다.
엑셀에 수식입력을 하면 답이 나오거든요.
= 0.009* LN(0.5) + 0.1322 = 0.125961675
VBA어디를 수정해야 오류가 수정될까요?
좋은 강의 감사드립니다.
오빠두엑셀
오빠두엑셀 작성자 2023.08.28 16:54
안녕하세요.
 "ln(x)", "*" & CStr(arr(0))
이 부분을
 "ln(x)", "*" & CDbl(arr(0))
로 수정해보세요.
감사합니다.
럽큘
럽큘 2023.08.29 08:55
선생님 감사합니다. 해결되었습니다.
강민준🤗
강민준🤗 2024.08.11 13:07
좋은 자료 감사합니다.🙇‍♂️