Wertebereiche in Diagrammen per VBA einstellen

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Wertebereiche in Diagrammen per VBA einstellen

Die neuen Diagramme unter Access 2019 und aktuellen Versionen von Office 365 bieten eine moderne Darstellung von Daten. Dem Benutzer bleiben die Möglichkeiten der Anpassung der angezeigten Daten jedoch verwehrt, wenn er nicht gerade in den Entwurf des Formulars oder Berichts mit dem Diagramm eingreift. Also bieten wir ihm die Möglichkeit, verschiedene Aspekte der Darstellung über von uns bereitgestellte Steuer­elemente nach seinen Wünschen anzupassen. Im vorliegenden Beitrag schauen wir uns dabei die Wertebereiche von Diagrammen für die primäre und sekundäre y-Achse an.

Benutzern das Anpassen der Diagramme ermöglichen

Der Benutzer sollte in der Regel keine Gelegenheit erhalten, in den Entwurf von Formularen einzugreifen. Damit hat er aber leider auch keine Möglichkeit, die Ansicht der Diagramme anzupassen.

Hier kommt VBA ins Spiel. Sie können mit geeigneten Steuerelementen die Werte, die für die verschiedenen Eigenschaften des Diagramm-Steuerelements eingestellt wurden, anzeigen und zur Bearbeitung anbieten. Die grundlegenden Einstellungen wie etwa die gewählte Diagrammart oder die Datensatzherkunft sollte man nicht bearbeiten lassen, da dies unter Umständen zu viele Gelegenheiten mit sich bringt, ein unerwünschtes Ergebnis zu produzieren. Also beschränken wir uns zu Beispielzwecken mit einigen wenigen Einstellungen.

Beispieldiagramm

Für dieses Beispiel verwenden wir ein Diagramm, dass die Daten der Tabelle tblUmsaetzeUndRabattNachMonat anzeigt. Dazu stellen Sie die Eigenschaft Diagrammtyp auf Linien und Datensatzherkunft auf den Namen der Tabelle ein.

Im Bereich Diagrammeinstellungen|Daten legen wir für die Anzeige auf der y-Achse die beiden Felder Umsatz (Summe) und Rabatt (Summe) fest (siehe Bild 1), indem wir die entsprechenden Kontrollkästchen aktivieren.

Auswahl der Felder für die Werte der y-Achse

Bild 1: Auswahl der Felder für die Werte der y-Achse

Die angezeigten Texte für den Diagrammtitel und die Legendenbeschriftung stellen wir über die Eigenschaften Diagrammtitel (im Eigenschaftenblatt) sowie Anzeigename (im Bereich Diagrammeinstellungen|Format) ein.

Außerdem möchten wir noch die sekundäre y-Achse einblenden. Das erledigen wir, indem wir die Eigenschaft Datenreihe zeichnen auf im Bereich Diagrammeinstellungen|Format für die Datenreihe SumOfRabatt auf den Wert Sekundär einstellen.

Schließlich wünschen wir uns noch Beschriftungen der beiden y-Achsen. Dazu tragen wir für die Eigenschaft Titel der primären Größenachse den Wert Umsatz und für Titel der sekundären Größenachse den Wert Rabatt ein.

Das Ergebnis sieht nun wie in Bild 2 aus.

Diagramm ohne Benutzereinstellungen

Bild 2: Diagramm ohne Benutzereinstellungen

Minimale und maximale Werte für y-Achse automatisch einstellen

Nun wollen wir dem Benutzer die Möglichkeit geben, die Bereiche für die primäre und die sekundäre y-Achse einzustellen. Normalerweise sind hier die beiden Eigenschaften PrimaryValuesAxisRange und SecondaryValuesAxisRange auf den Wert acAxisRangeAuto für Automatisch eingestellt.

Wenn wir dem Benutzer die Möglichkeit geben wollen, diese Werte manuell einzustellen, müssen wir diese beiden Eigenschaften zunächst auf den Wert acAxisRangeFixed einstellen. Die weiteren beiden Eigenschaften je y-Achse heißen PrimaryValuesAxisMinimum und PrimaryValuesAxisMaximum sowie SecondaryValuesAxisMinimum und SecondaryValuesAxisMaximum. Mit diesen stellen wir den Startwert und den Endwert für den anzuzeigenden Wertebereich ein.

Die Idee ist, dem Benutzer ausgehend von der automatischen Anzeige der Bereiche die Möglichkeit zu bieten, die Ober- und die Untergrenze für den Wertebereich manuell einzutragen. Oder er kann durch das Betätigen eines Steuerelements den aktuellen Wertebereich ermitteln und einstellen lassen.

Wir entscheiden uns, für den Wert der Eigenschaft PrimaryValuesAxisRange eine Optionsgruppe zum Formular hinzuzufügen, der wir den Namen ogrPrimaerWertebereich geben. Für diese Optionsgruppe stellen wir den Standardwert auf 0 ein (was der Konstanten acAxisRangeAuto entspricht).

Der Optionsgruppe fügen wir dann zwei Optionsfelder hinzu, denen wir die Werte 0 und 1 zuweisen und die wir mit Automatisch und Manuell beschriften. Die zweite Optionsgruppe für den Wertebereich der sekundären y-Achse erstellen wir auf die gleiche Weise, vergeben aber den Namen ogrSekundaerWertebereich.

un benötigen wir noch vier Textfelder, welche die minimalen und maximalen Werte für die primäre und die sekundäre y-Achse aufnehmen. Diese platzieren wir unter der Optionsgruppe und so, dass die Felder für die primäre Achse links und die für die sekundäre Achse rechts erscheinen. Das Formular sieht nun wie in Bild 3 aus.

Entwurf des Formulars mit Steuerelementen für die Eigenschaften

Bild 3: Entwurf des Formulars mit Steuerelementen für die Eigenschaften

Steuer­elemente programmieren

Nun wollen wir die Steuer­elemente mit Funktion füllen. Als Erstes sorgen wir dafür, dass die Optionsgruppe den richtigen Wert enthält. Diesen lesen wir aus der entsprechenden Eigenschaft aus und weisen ihn in der Ereignisprozedur Beim Laden des Formulars zu:

Hier rufen wir gleichzeitig eine Prozedur namens TextfelderAktivieren auf:

Private Sub Form_Load()
     Me!ogrPrimaerWertebereich =  Me!ctlMinMax.PrimaryValuesAxisRange
     Me!ogrSekundaerWertebereich =  Me!ctlMinMax.SecondaryValuesAxisRange
     TextfelderAktivieren
End Sub

Diese Prozedur prüft, ob die Wertebereiche automatisch ermittelt werden sollen oder nicht.

Falls nicht, sollen die Textfelder zur manuellen Eingabe der kleinsten und größten Werte aktiviert werden. Das erledigen die vier Anweisungen der Prozedur wie folgt:

Private Sub TextfelderAktivieren()
     Me!txtPrimaerMax.Enabled =  Me!ogrPrimaerWertebereich = 1
     Me!txtPrimaerMin.Enabled =  Me!ogrPrimaerWertebereich = 1
     Me!txtSekundaerMax.Enabled =  Me!ogrSekundaerWertebereich = 1
     Me!txtSekundaerMin.Enabled =  Me!ogrSekundaerWertebereich = 1
End Sub

Wenn der Benutzer den Wert einer der beiden Optionsgruppen ändert, also möchte, dass die Wertebereiche entweder automatisch festgelegt werden oder manuell, weisen wir der entsprechenden Eigenschaft des Diagramms, also PrimaryValuesAxisRange oder SecondaryValuesAxisRange, den entsprechenden Wert der jeweiligen Optionsgruppe zu.

Außerdem rufen wir dann erneut die Prozedur TextfelderAktivieren auf, um diese zu aktivieren oder deaktivieren:

Private Sub ogrPrimaerWertebereich_AfterUpdate()
     Me!ctlMinMax.PrimaryValuesAxisRange =  Me!ogrPrimaerWertebereich
     TextfelderAktivieren
End Sub
Private Sub ogrSekundaerWertebereich_AfterUpdate()
     Me!ctlMinMax.SecondaryValuesAxisRange =  Me!ogrSekundaerWertebereich
     TextfelderAktivieren
End Sub

Damit haben wir allerdings noch nicht viel erreicht, denn wir blenden so nur die Zahlenwerte an der primären und sekundären y-Achse ein und aus.

Kleinsten und größten Wert vorbelegen

Damit der Benutzer Standardwerte für die Wertebereiche hat, müssen wir diese entsprechend berechnen. Das können wir nur näherungsweise so tun, wie es das Diagramm-Steuerelement im automatischen Modus tut, da wir ja den dort verwendeten Algorithmus nicht kennen. Also wollen wir den größten und den kleinsten Wert ermitteln und einen bestimmten Prozentsatz aufschlagen, damit der größte Wert nicht gerade ganz oben auf der jeweiligen y-Achse angezeigt wird.

Wir aber können wir diese Werte berechnen? Normalerweise ist das einfach, da wir ja wissen, welche Datensatzherkunft wir eingestellt haben und welche Felder für die Darstellung der Werte verwendet werden. Aber wir wollen die Lösung so gestalten, dass wir auch einmal die Datensatzherkunft wechseln und unsere Lösung immer noch verwenden können. Also schauen wir uns an, welche Möglichkeiten die Eigenschaften bieten, um die größten und kleinsten Werte der jeweiligen y-Achse zu berechnen.

Dabei stoßen wir schnell auf die Eigenschaften der Datenreihen, wo wir Bezeichnungen wie SumOfUmsatz oder SumOfRabatt finden. Diese werden interessanterweise auch in dem Ausdruck für die Eigenschaft Transformierte Datensatzherkunft verwendet, die in unserem Fall wie folgt aussieht:

SELECT [Monat], Sum([Umsatz]) AS [SumOfUmsatz], Sum([Rabatt]) AS [SumOfRabatt] FROM
[tblUmsaetzeUndRabattNachMonat] GROUP BY [Monat] ORDER BY [Monat]

Und wir wissen, dass die auf den beiden y-Achsen aufgetragenen Werte SumOfUmsatz und SumOfRabatt heißen. Daraus können wir dann durch geschicktes Formulieren einer Abfrage zum Beispiel wie folgt den maximalen Wert für SumOfUmsatz ermitteln – hier für die Ausgabe im Direktfenster:

Debug.Print CurrentDb.OpenRecordset("SELECT Max(SumOfUmsatz) FROM (SELECT [Monat], " _
    & "Sum([Umsatz]) AS [SumOfUmsatz], Sum([Rabatt]) AS [SumOfRabatt] " _
    & "FROM [tblUmsaetzeUndRabattNachMonat] GROUP BY [Monat] ORDER BY [Monat])").Fields(0)

Das Ergebnis lautet korrekterweise 1250.

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.