엑셀 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 |