Hallo Ihr Wissenden,
VBA 'verblüfft' mich aktuell:
In meinem (XL365, Win 10, 64bit) derzeitigen Arbeitsblatt habe ich ein eingebettetes x-y-Diagramm. Dieses bezieht seine Werte aus einer Tabelle, die per Power Query durch Auslesen externer ASCII-Dateien erzeugt wird.
Per VBA möchte ich nun die Diagramm-Achsen skalieren, sodass sie zu den Daten passen. Dazu bilde ich Double-Variable aus der Tabelle, sowohl für die Abszisse als auch die Ordinate.
Dazu habe ich Objektvariable gebildet, die sowohl das im Blatt eingebettete Chart-Objekt referenzieren, als auch das darin enthaltene Chart.
Über die .Axes(xlValue) bzw. .Axes(xlCategory) und deren jeweilige .MinimumScale - Attribute setze ich nun die Skalierung der Achsen.
Im Step-Durchlauf (mit F8) tut auch alles, wie soll.
Wenn ich aber das Makro per Schaltfläche auf dem Arbeitsblatt ausführe, dann werden zwar die neuen Werte für die Datenreihe übernommen, aber die geänderten Achsenskalierungen sind nicht da - es bleibt bei den alten Min- und Max-Einstellungen beider Achsen.
Mir fällt nichts mehr ein, wie ich das Teil dazu bringe, im Durchlauf per Schaltfläche das zu machen, was es im Einzelschritt-Durchlauf einwandfrei ausführt.
Mit refresh, vorherigem Umschalten auf .MinimumScaleIsAuto = True und sonstigen Spielereien habe ich bereits experimentiert - alles nutzt nix. ...und die Funde mit Google waren bisher auch nicht hilfreich - wahrscheinlich habe ich nur wieder nicht die richtige Frage gestellt...?
Jetzt frage ich mal in die Runde, wie ich dem Herr werden kann. Nachfolgend mein Code, der hier relevant ist:
Set wlRange = Tabelle2.ListObjects("Intensity").ListColumns("Lambda").DataBodyRange
Set IntRange = Tabelle2.ListObjects("Intensity").ListColumns("Int%").DataBodyRange
Set DiaObj = Tabelle2.ChartObjects("Dia_Int")
Set DiaInt = DiaObj.Chart
With DiaInt
xMin = Application.WorksheetFunction.Min(wlRange)
xMax = Application.WorksheetFunction.Max(wlRange)
yMin = Application.WorksheetFunction.RoundDown(Application.WorksheetFunction.Max(0, 0.95 * Application.WorksheetFunction.Min(IntRange)), 0)
yMax = Application.WorksheetFunction.RoundUp(1.05 * Application.WorksheetFunction.Max(IntRange), 0)
With .Axes(xlValue)
.MinimumScaleIsAuto = True
.MaximumScaleIsAuto = True
End With
.Refresh
With .Axes(xlValue)
.MinimumScale = yMin
.MaximumScale = yMax
End With
With .Axes(xlCategory)
.MinimumScaleIsAuto = True
.MaximumScaleIsAuto = True
End With
.Refresh
With .Axes(xlCategory)
.MinimumScale = xMin
.MaximumScale = xMax
End With
.Refresh
End With
Application.Calculate
Application.ActiveWorkbook.RefreshAll
MsgBox "Die Messwerte der gewählten Datei sind aktuell", _
vbOKOnly, "Messwerte aktualisiert"
Dabei sind:
Tabelle2: der Codename des Blattes, das sowohl die Daten als auch das Diagramm, um das es geht, enthält
wlRange: Datenspalte der Quelltabelle, in denen die Abszissenwerte stehen
intRange: Datenspalte der Quelltabelle, in denen die Ordinatenwerte stehen
DiaObj: das eingebettete Chart-Objekt im Tabellenblatt
DiaInt: das in DiaObj enthaltene Chart, dessen Achsen ich skalieren möchte
Kleine Zusatzfrage: ich hätte das Diagramm gerne aktualisiert, bevor die Message-Box am Ende des Codes erscheint. Aber - das gelingt mit den beschriebenen Routinen ebenso wenig.. - ein Tipp?
Ich habe eine Testdatei gebildet, die auf die hier genannten Punkte reduziert sein müsste - hoffe, Sie hilft bei der Veranschaulichung. Habe dabei auch die PQ-Routine entfernt und kann somit keine ASCII-.Datei mehr einlesen damit. Aber ich denke, beim Experimentieren kann man ja die Werte direkt in der Tabelle manipulieren, um den Effekt zu sehen - hoffentlich... ?
Test.xlsm (Größe: 77,41 KB / Downloads: 7)
Danke für Eure Hilfen und Ratschläge,
RaiSta
VBA 'verblüfft' mich aktuell:
In meinem (XL365, Win 10, 64bit) derzeitigen Arbeitsblatt habe ich ein eingebettetes x-y-Diagramm. Dieses bezieht seine Werte aus einer Tabelle, die per Power Query durch Auslesen externer ASCII-Dateien erzeugt wird.
Per VBA möchte ich nun die Diagramm-Achsen skalieren, sodass sie zu den Daten passen. Dazu bilde ich Double-Variable aus der Tabelle, sowohl für die Abszisse als auch die Ordinate.
Dazu habe ich Objektvariable gebildet, die sowohl das im Blatt eingebettete Chart-Objekt referenzieren, als auch das darin enthaltene Chart.
Über die .Axes(xlValue) bzw. .Axes(xlCategory) und deren jeweilige .MinimumScale - Attribute setze ich nun die Skalierung der Achsen.
Im Step-Durchlauf (mit F8) tut auch alles, wie soll.
Wenn ich aber das Makro per Schaltfläche auf dem Arbeitsblatt ausführe, dann werden zwar die neuen Werte für die Datenreihe übernommen, aber die geänderten Achsenskalierungen sind nicht da - es bleibt bei den alten Min- und Max-Einstellungen beider Achsen.
Mir fällt nichts mehr ein, wie ich das Teil dazu bringe, im Durchlauf per Schaltfläche das zu machen, was es im Einzelschritt-Durchlauf einwandfrei ausführt.
Mit refresh, vorherigem Umschalten auf .MinimumScaleIsAuto = True und sonstigen Spielereien habe ich bereits experimentiert - alles nutzt nix. ...und die Funde mit Google waren bisher auch nicht hilfreich - wahrscheinlich habe ich nur wieder nicht die richtige Frage gestellt...?
Jetzt frage ich mal in die Runde, wie ich dem Herr werden kann. Nachfolgend mein Code, der hier relevant ist:
Set wlRange = Tabelle2.ListObjects("Intensity").ListColumns("Lambda").DataBodyRange
Set IntRange = Tabelle2.ListObjects("Intensity").ListColumns("Int%").DataBodyRange
Set DiaObj = Tabelle2.ChartObjects("Dia_Int")
Set DiaInt = DiaObj.Chart
With DiaInt
xMin = Application.WorksheetFunction.Min(wlRange)
xMax = Application.WorksheetFunction.Max(wlRange)
yMin = Application.WorksheetFunction.RoundDown(Application.WorksheetFunction.Max(0, 0.95 * Application.WorksheetFunction.Min(IntRange)), 0)
yMax = Application.WorksheetFunction.RoundUp(1.05 * Application.WorksheetFunction.Max(IntRange), 0)
With .Axes(xlValue)
.MinimumScaleIsAuto = True
.MaximumScaleIsAuto = True
End With
.Refresh
With .Axes(xlValue)
.MinimumScale = yMin
.MaximumScale = yMax
End With
With .Axes(xlCategory)
.MinimumScaleIsAuto = True
.MaximumScaleIsAuto = True
End With
.Refresh
With .Axes(xlCategory)
.MinimumScale = xMin
.MaximumScale = xMax
End With
.Refresh
End With
Application.Calculate
Application.ActiveWorkbook.RefreshAll
MsgBox "Die Messwerte der gewählten Datei sind aktuell", _
vbOKOnly, "Messwerte aktualisiert"
Dabei sind:
Tabelle2: der Codename des Blattes, das sowohl die Daten als auch das Diagramm, um das es geht, enthält
wlRange: Datenspalte der Quelltabelle, in denen die Abszissenwerte stehen
intRange: Datenspalte der Quelltabelle, in denen die Ordinatenwerte stehen
DiaObj: das eingebettete Chart-Objekt im Tabellenblatt
DiaInt: das in DiaObj enthaltene Chart, dessen Achsen ich skalieren möchte
Kleine Zusatzfrage: ich hätte das Diagramm gerne aktualisiert, bevor die Message-Box am Ende des Codes erscheint. Aber - das gelingt mit den beschriebenen Routinen ebenso wenig.. - ein Tipp?
Ich habe eine Testdatei gebildet, die auf die hier genannten Punkte reduziert sein müsste - hoffe, Sie hilft bei der Veranschaulichung. Habe dabei auch die PQ-Routine entfernt und kann somit keine ASCII-.Datei mehr einlesen damit. Aber ich denke, beim Experimentieren kann man ja die Werte direkt in der Tabelle manipulieren, um den Effekt zu sehen - hoffentlich... ?

Danke für Eure Hilfen und Ratschläge,
RaiSta