Hallo liebe Gemeinde!
Ich kämpfe schon seit längeren mit einem selstamen Problem in Excel, komme aber selbst nicht auf die Lösung.
Folgende Situation:
Ich habe ein Worksheet Names "DAMPER_CURVES". Dort befinden sich zwei Charts, welche beide die gleichen Quelldaten haben.
Die Quelldaten befinden sich ebenfalls auf dem Worksheet wo auch die Charts sind. Ein Chart stellt den Verlauf mit logarithmischer y-Achse dar und der andere Chart macht das mit ganz normalen Achsen. Beide Charts haben eine Trendlinie, welche logischerweise durch die selbe Gleichung beschrieben wird.
Screenshot vom Worksheet: https://ibb.co/48qk0y2
Ich habe nun eine Funktion geschrieben, mit der ich die Koeffizienten der Trendlinie ermitteln und als Rückgabewert zurückgeben kann.
Sie wird aber von einem anderen Worksheet aus aufgerufen! Name der Funktion : "GetDamperCurveTrendCoefficients" - siehe unten
Das Problem ist nun, dass die Quelldaten der Charts sich zuerst auf den richtigen Datensatz "curveName" ändern müssen.
Das mache ich mit der Funktion "SetChartData" - siehe weiter unten
Wenn ich jetzt die Trendline abfragen würde, dann würde ich die Trends vom "alten Chart" bekommen also mit dem vorherigen Datensatz. Der Chart aktualisiert sich also nicht nach dem ändern der Quelldaten.
Zufällig habe ich herausgefunden, dass der Chart sich aktualisiert, wenn ich ihn als Bild exportiere. Das Dauert mir aber bei der großen Anzahl an Funktionsaufrufen zu lange und außerdem kommt manchmal die Fehlermeldung, dass der Chart nicht exportiert werden konnte.
Der Chart aktualiert auch, wenn ich das Worksheet wo der chart liegt öffne. realisiere ich dass übrigens mit worksheet.activate dann aktualisiert der Chart nicht!
Die Koeffizienten im Sheet abzuspeichern ist für mich keine Lösung, da sich die Daten immer wieder ändern können. Ich muss also jedes Mal neu abfragen.
Bin über jeden Input dankbar, welcher das Problem beheben könnte!
'MODUL XY
Public Const DAMPERCURVES As String = "DAMPER_CURVES"
Public Const damperCurveNormalScaling As String = "normalScaling"
Public Const damperCurveLogarithmicScaling As String = "logarithmicScaling"
Public Function GetDamperCurveTrendCoefficients(ByVal curveName As String, ByVal chartName As String, ByRef coeffA As Double, ByRef coeffB As Double)
'returns A and B coefficients by reference of a chart trendline with the form [y = A * exp(B*x)]
Dim currentChart As Chart
<strong>Dim fName As String 'filename</strong>
Dim formulaString As String
Dim splitA() As String
Dim SplitB() As String
<strong>'save filename
fName = ThisWorkbook.Path & "\temp.gif"</strong>
'update the chart source data to the curve with the curveName
Call SetChartData(Worksheets(DAMPERCURVES), curveName, damperCurveNormalScaling, damperCurveLogarithmicScaling) 'Funktion ist weiter unten angehängt
Set currentChart = Worksheets(DAMPERCURVES).ChartObjects(chartName).Chart
currentChart.Export Filename:=fName, Filtername:="GIF" <strong>'chart aktualisiert nur, wenn ich ihn exportiere!!!! WARUM!!!!???</strong>
'get the Trendline formula as string
formulaString = currentChart.SeriesCollection(1).Trendlines(1).DataLabel.text
'String treatments to get coeffA and coeffB
splitA = Split(Replace(formulaString, "y = ", ""), "e")
SplitB = Split(splitA(1), "x")
'RETURN Coefficients
coeffA = splitA(0) 'return CoeffA
coeffB = SplitB(0) 'return CoeffB
End Function
Funktion welche den Charts die neuen Quelldaten zuweist
Public Function SetChartData(ByVal Worksheet As Excel.Worksheet, _
ByVal curveName As String, _
ByVal normalScalingChartName As String, _
ByVal logScalingChartName As String)
'searches for the curveName and updates both charts (normal and logarithmic scaling)
Dim i As Integer
Dim chartDataRange As Range
If curveName = "" Then
Exit Function
End If
'search for curveName and change Source for Chart-Data
For i = DAMPER_CURVES_DATA_1stROW To LastUsedRow(Worksheet)
With Worksheet
If .Cells(i, 1).value = curveName Then
Set chartDataRange = .Range(.Cells(i, DAMPER_CURVES_DATA_1stCOL), _
.Cells(i + 1, DAMPER_CURVES_DATA_1stCOL + 29)) 'data range (30 possible data pairs)
.ChartObjects(normalScalingChartName).Chart.SetSourceData Source:=chartDataRange
.ChartObjects(logScalingChartName).Chart.SetSourceData Source:=chartDataRange
Exit Function
End If
End With
Next
End Function
|