엑셀 차트 추세선 함수 출력 :: 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
- 시트 내 첫번째 차트의 추세선 수식을 출력하기