엑셀 차트 추세선 함수 출력 :: TrendX 명령문 사용법
엑셀 TrendX 명령문 목차 바로가기
요약
엑셀 TrendX 는 차트 추세선의 값을 실시간으로 계산하거나 수식을 출력하는 함수입니다.
명령문 구문
= TrendX ( [차트이름], [X값], [수식출력], [범례번호] )
사용된 인수 및 변수 알아보기
| 인수 | 설명 |
| 차트이름 [String, 선택인수] |
추세선을 불러올 차트의 이름입니다. 기본값은 함수가 입력된 시트의 첫번째 차트입니다. |
| X값 [Double, 선택인수] |
X값을 입력합니다. 숫자만 입력할 수 있습니다. 기본값은 0 입니다. |
| 수식출력 [Boolean, 선택인수] |
TRUE일 경우 Y값을 계산하지 않고 수식을 출력합니다. 기본값은 FALSE 입니다. |
| 범례번호 [Long, 선택인수] |
차트에 범례가 여러개 있을 경우, 추세선이 추가된 범례의 순번을 입력합니다. 기본값은 1 입니다. |
예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [엑셀VBA함수] TrendX 명령문예제파일
상세 설명
엑셀 TrendX 함수는 지정한 차트 추세선의 Y 값을 실시간으로 계산하거나 추세선 수식을 출력하는 사용자 지정 함수입니다. 추세선 수식을 지원하는 지수, 선형, 로그, 다항식, 거듭제곱에서 모두 사용가능하며, 이동평균은 추세선을 지원하지 않으므로 TrendX 함수를 사용할 수 없습니다.
시트 안에 차트가 여러개 있을 경우, TrendX 함수의 첫번째 인수로 차트이름을 입력합니다. 차트 이름을 차트를 선택한 후, 수식입력줄 왼쪽의 이름 상자에서 확인할 수 있습니다.

차트를 선택하면 이름상자에서 차트이름을 확인할 수 있습니다. 실전 사용 예제
- 시트 내 첫번째 차트의 추세선 수식을 출력하기
=TrendX(,,True)
'시트 내 첫번째 차트의 추세선 수식을 출력합니다. - "차트 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
명령문 동작원리 단계별 알아보기
- 명령문에 사용될 변수를 선언하고 각 변수를 설정합니다.
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
- 지정한 범례에 추세선이 없을 경우, Value 오류를 반환 후 함수를 종료합니다.
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
- 수식표시가 True일 경우 수식을 출력합니다.
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
- 시트 내 첫번째 차트의 추세선 수식을 출력하기

아래 구문의 뜻이 무엇인지 궁굼해서 여쭤봅니다..
Application.Evaluate(Replace(vSplitsM(i), "^|", "^-"))
"^|", "^-" 의 의미가 어떤건가요??
그럼 잘 부탁 드립니다.
감사합니다.~~
^|과 ^-는 지수표시를 구분하기 위한 일종의 구분자로 큰 의미는 없습니다.
^|, ^- 대신, ^** , ^- 등으로 바꿔서 사용하셔도 무방합니다.
제시해드린 답변이 도움이 되셨길 바랍니다. 감사합니다.
TrendX와 관련된 문의 사항 Q&A에 올렸는데 답변주신다면
정말 감사하겠습니다.
https://www.oppadu.com/question/?uid=23837&mod=document&pageid=1
올린 댓글이 안보여 두개나 달았습니다. 죄송합니다.
댓글 남겨 드렸으니 확인해보시길 바랍니다.
감사합니다.
엑셀 VBA 매크로 편집기에 작성하면 됩니다.
해당 매크로를 사용하는 중 데이터 유효성 검사의 목록을 이용하여 차트를 사용하고 있는데요 그때 추세선에 대한 값을 불러오기위하여 위의 매크로를 사용합니다.
그런데 목록선택후에 값이 바로 반영되는게 아니라서 새로 고침을 진행해야지 추세값이 표기되는데요 해결 방법이 있을까요??
위의 댓글중 (이상헌 2021년 11월 23일 10:38 오전) 님의 코드에 적용을 해봤을때도 유효성 검사를 이용하면 바로 반영이 안되더라구요... ㅠㅠ
수식
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어디를 수정해야 오류가 수정될까요?
좋은 강의 감사드립니다.
이 부분을
로 수정해보세요.
감사합니다.