Diagramme formatieren per VBA

Access bietet mit Microsoft Graph die Möglichkeit, Daten in Diagrammen darzustellen. Dieses Diagramm können Sie über den Assistenten mit Daten füllen. üblicherweise müssen Sie dann aber noch an einigen Schrauben drehen, damit das Diagramm Ihren Anforderungen entspricht – zum Beispiel, um den Inhalt und die Formatierung von Beschriftungen anzupassen. Das Graph-Objekt können Sie allerdings auch per VBA steuern – wie das gelingt, zeigt der vorliegende Beitrag.

Ein Diagramm fügen Sie üblicherweise über den entsprechenden Eintrag in der Werkzeugleiste (im Ribbon von Access 2010 etwa unter Ent-wurf|Steuer-ele-men-te|Dia-gramm zu finden). Nach dem Platzieren des Steuerelements im Formular erscheint wie in Bild 1 der Diagramm-Assistent, der Ihnen beim Einrichten des Diagramms hilft.

Hinzufügen eines Diagramms per Assistent

Bild 1: Hinzufügen eines Diagramms per Assistent

Dieser Assistent lässt sich leider nicht umgehen, um beispielsweise einfach ein leeres Diagramm zum Formular hinzuzufügen, das Sie dann schrittweise anpassen – wir müssen also den Assistenten durchlaufen und die notwendigsten Einstellungen vornehmen. In diesem Fall wählen Sie einfach die Tabelle tblArtikel als Datenherkunft aus und fügen die beiden Felder Artikelname und Einzelpreis zum Diagramm hinzu. Wählen Sie als Diagrammtyp Säulendiagramm aus und stellen Sie die Felder für das Layout wie in Bild 2 ein. Behalten Sie den Titel bei und lassen Sie auch die Anzeige einer Legende vorerst aktiviert. Klicken Sie dann auf Fertigstellen.

Einstellen der Daten für das Diagramm

Bild 2: Einstellen der Daten für das Diagramm

Das fertige Diagramm sieht nun, nach Einstellen der entsprechenden Breite, etwa wie in Bild 3 aus. Nun schauen wir uns an, wie wir das Diagramm per VBA tunen können.

Erste Version des Diagramms

Bild 3: Erste Version des Diagramms

Verweis setzen

Dummerweise zeigt der VBA-Editor gar keine Objekte zum Chart-Objekt an.

Das liegt daran, dass dieses Objekt einerseits nicht zum eingebauten Umfang von Access gehört und andererseits nicht automatisch ein Verweis auf die entsprechende Bibliothek hinzugefügt wird.

Dies holen Sie nun nach, indem Sie im VBA-Editor den Menübefehl Extras|Verweise ausführen und im Dialog aus Bild 4 den Eintrag Microsoft Chart x.0 Object Library aktivieren.

Hinzufügen eines Verweises auf die Bibliothek zum Graph-Diagramm

Bild 4: Hinzufügen eines Verweises auf die Bibliothek zum Graph-Diagramm

Steuerelementname anpassen

Um gleich komfortabel auf das Chart-Objekt zugreifen zu können, ändern Sie den Namen des soeben zum Formular hinzugefügten Steuerelements auf ctlChart.

Diagrammtitel ändern

Als Erstes wollen wir per VBA den Titel des Diagramms ändern. Dazu fügen Sie dem Formular ein Textfeld zum Eingeben des neuen Titels namens txtTitel sowie eine Schaltfläche namens cmdTitelAendern hinzu, welche den Titel im Chart-Objekt ändern soll – etwa so, wie in Bild 5.

Chart-Objekt mit geändertem Titel

Bild 5: Chart-Objekt mit geändertem Titel

Die Prozedur, die durch die Schaltfläche ausgelöst wird, finden Sie in Listing 1. Wenn Sie versuchen, eine Eigenschaft zum ändern des Titels des Diagramms für das Objekt Me!ctlChart zu finden, werden Sie Probleme bekommen – dort sind keine für das Steuerelement spezifischen Eigenschaften zu finden. Stattdessen greifen Sie auf das Objekt selbst über die Eigenschaft Object zu – genau so, wie Sie es auch etwa beim TreeView-Steuerelement erledigen.

Private Sub cmdTitelAendern_Click()
     Dim objChart As Chart
     Set objChart = Me!ctlChart.Object
     objChart.ChartTitle.Caption = Nz(Me!txtTitel)
End Sub

Listing 1: Prozedur zum ändern des Titels des Diagramms

Nun bietet Me!ctlChart.Object keine IntelliSense-Unterstützung an, sodass wir zunächst noch eine Objektvariable deklarieren, die das in ctlChart enthaltene Objekt referenziert. Dieses deklarieren wir mit dem Namen objChart und dem Typ Chart. Nun können Sie über die Eigenschaft Caption des Objekts ChartTitle auf die für die Beschriftung zuständige Eigenschaft zugreifen.

Tragen Sie nun einen neuen Titel in das Textfeld ein und klicken auf die Schaltfläche, ändert sich auch der Titel im Chart-Objekt.

Diagrammtyp einstellen

Die nächste änderung, die wir vornehmen möchten, betrifft den Diagrammtyp. Diesen legen Sie mit der Eigenschaft ChartType des Chart-Objekts fest.

Die einzelnen Werte können Sie unter VBA über die Enumeration XlChartType ermitteln, wie etwa in Bild 6 im Direktbereich des VBA-Editors.

Diagrammtyp-Enumeration per VBA

Bild 6: Diagrammtyp-Enumeration per VBA

Wenn wir aber nun nicht direkt im Code arbeiten, sondern die Diagramm-Art etwa per Kombinationsfeld auswählen möchten, benötigen wir die entsprechenden Zahlenwerte und Bezeichnungen/Konstanten als Datensatzherkunft für das entsprechende Steuerelement. Also legen wir schnell eine Tabelle an und tragen dort die benötigten Datensätze ein – jeweils mit dem Zahlenwert im Feld CharttypeID und der Konstanten in den Feldern Charttype und Bezeichnung einer Tabelle namens tblCharttypes (s. Bild 7).

Tabellen mit den Diagrammtypen

Bild 7: Tabellen mit den Diagrammtypen

Diese Tabelle dient dann auch als Datensatzherkunft eines neuen Kombinationsfeldes im Formular frmDiagramme namens cboDiagrammtyp (s. Bild 8) – genau genommen die folgende Abfrage auf Basis dieser Tabelle:

Auswahl von Diagrammtypen

Bild 8: Auswahl von Diagrammtypen

SELECT CharttypeID, -Bezeichnung FROM tblCharttypes;

Mit dem Kombinationsfeld können Sie nun einen der Diagrammtypen auswählen. Damit dieser auch auf das Chart-Objekt angewendet wird, fügen Sie der Ereigniseigenschaft Nach Aktualisierung die Ereignisprozedur aus Listing 2 hinzu.

Private Sub cboDiagrammtyp_AfterUpdate()
     Dim objChart As Chart
     Set objChart = Me!ctlChart.Object
     objChart.ChartType = Me!cboDiagrammtyp
End Sub

Listing 2: Prozedur zum ändern des Diagrammtyps

Diese stellt die Eigenschaft ChartType auf den im Kombinationsfeld ausgewählten Wert ein. Auf diese Weise können Sie sich schnell die verschiedenen Typen ansehen.

Position der Beschriftung

Neben der ersten Schaltfläche fügen wir noch zwei weitere Schaltflächen hinzu, mit denen wir die Beschriftung des Diagramms schrittweise nach links oder rechts bewegen.

Für diese beiden Schaltflächen hinterlegen wir die folgenden Prozeduren:

Private Sub cmdTitelNachLinks_Click()
     ...
     objChart.ChartTitle.Left = objChart.ChartTitle.Left - 10
End Sub
Private Sub cmdTitelNachRechts_Click()
     ...
     objChart.ChartTitle.Left = objChart.ChartTitle.Left + 10
End Sub

Die erste verschiebt das Objekt mit der Beschriftung um zehn Schritte gegenüber der vorherigen Position nach links, die zweite verschiebt es nach rechts.

Legende bearbeiten

In manchen Diagrammen ist eine Legende sinnvoll, in anderen nicht.

Daher schauen wir uns zunächst an, wie Sie die Legende ein- und ausblenden können. Dazu legen wir ein passendes Kontrollkästchen namens chkLegendeAnzeigen an.

Dieses füllen wir, genau wie das Textfeld txtTitel, von nun an direkt beim öffnen des Formulars, genau genommen in der Ereignisprozedur Form_Load, mit der aktuellen Einstellung des Chart-Objekts. Die Prozedur finden Sie in Listing 3.

Private Sub Form_Load()
     Dim objChart As Chart
     Set objChart = Me!ctlChart.Object
     Me!txtTitel = objChart.ChartTitle.Caption
     Me!chkLegendeAnzeigen = objChart.HasLegend
End Sub

Listing 3: Einlesen einiger Chart-Eigenschaften

Das Kontrollkästchen chkLegende statten wir mit einer Prozedur aus, die durch das Ereignis Nach Aktualisierung ausgelöst wird:

Private Sub chkLegendeAnzeigen_Click()
     Dim objChart As Chart
     Set objChart = Me!ctlChart.Object
     objChart.HasLegend = Me!chkLegendeAnzeigen
End Sub

Mit dieser Prozedur können Sie durch einen einfachen Klick auf das Kontrollkästchen die Legende ein- und ausschalten – siehe Bild 9.

Ein- und Ausblenden der Legende des Chart-Objekts per Kombinationsfeld

Bild 9: Ein- und Ausblenden der Legende des Chart-Objekts per Kombinationsfeld

Weitere Eigenschaften der Legende

Das Legend-Objekt bietet noch weitere Eigenschaften:

  • Border: Liefert Eigenschaften zum Einstellen des Rahmens
  • Fill: Objekt, mit dem Sie weitere Eigenschaften bezüglich des Aussehens festlegen können
  • Font: Liefert alle notwendigen Eigenschaften zum Einstellen der Schriftart
  • Height, Width: Höhe und Breite der Legende
  • Interior: Legt die Eigenschaften des Hintergrunds fest.
  • Left, Top: Position der Legende
  • Name: Name des Objekts
  • Parent: Verweis auf das übergeordnete Objekt
  • Position: Bestimmt die Position der Legende – Konstanten siehe unten
  • Shadow: Aktiviert oder deaktiviert einen Schatten.

Die Konstanten für die Position des Legend-Objekt lauten:

  • xlLegendPositionBottom: -4107
  • xlLegendPositionCorner: 2
  • xlLegendPositionLeft: -4131
  • xlLegendPositionRight: -4152
  • xlLegendPositionTop: -4160
  • xlLegendPositionCustom: -4161

Vereinfachung für den Zugriff auf das Chart-Objekt

Für die folgenden Zugriffe auf das Chart-Objekt wollen wir einen Verweis auf das Objekt in der Variablen m_Chart speichern, die wir im Kopf des Klassenmoduls des Formulars anlegen:

Dim m_Chart As Chart

Die folgende Funktion GetChart liefert immer einen aktuellen Verweis auf das Chart-Objekt – egal, ob dieses bereits mit m_Chart referenziert ist oder nicht:

Private Function GetChart() As Chart
     If m_Chart Is Nothing Then
         Set m_Chart = Me!ctlChart.Object
     End If
     Set GetChart = m_Chart
End Function

Auf diese Weise sparen wir uns bei den nächsten Beispielen die beiden folgenden Zeilen und greifen direkt mit GetChart auf das Chart-Objekt zu:

Dim objChart As Chart
Set objChart = Me!ctlChart.Object

Weitere Vereinfachung für Experimente

Wenn Sie mit dem Chart-Objekt experimentieren wollen, indem Sie seine Objekte, Eigenschaften und Methoden über den Direktbereich aufrufen, müssen Sie dieses normalerweise immer über den folgenden Ausdruck referenzieren:

Forms!frmDiagramme!ctlChart.Object

Der Nachteil ist: Sie erhalten dann keine IntelliSense-Unterstützung. Aber es spricht ja nichts dagegen, eine kleine öffentliche Funktion in einem Standardmodul unterzubringen, die wie folgt aussieht:

Public Function Chart() As Chart
     Set Chart = Forms!frmDiagramme!ctlChart.Object
End Function

Die Funktion liefert zwar genau den gleichen Verweis wie über den direkten Zugriff, aber da Sie den Typ des Rückgabewertes mit Chart festlegen können, weiß der VBA-Editor auch, welche Elemente er per IntelliSense für dieses Objekt anbieten soll.

Gleiche Funktionen können Sie natürlich auch für weitere Elemente programmieren – zum Beispiel für den Zugriff auf die Legende des Chart-Objekts wie in folgendem Beispiel:

Public Function Legend() As Legend
     Set Legend = Forms!frmDiagramme!ctlChart.Object.Legend
End Function

Elemente ein- und ausblenden

Mit den folgenden Eigenschaften des Chart-Objekts können Sie einzelne Elemente ein- und ausblenden:

  • HasLegend: Blendet die Legende ein und aus.
  • HasTitle: Blendet den Titel ein und aus.
  • HasDataTable: Blendet die zugrunde liegenden Werte wie in Bild 10 ein.
  • Diagramm mit DataTable

    Bild 10: Diagramm mit DataTable

  • HasAxis: Prüft das Vorhandensein von Achsen oder blendet diese ein oder aus. Erwartet zwei Parameter: Achsentyp (xlCategory 1, xlSeriesAxis 3 oder xlValue 2) und Achsengruppe (xlPrimary 1 oder XlSecondary 2). Wenn Sie beispielsweise .HasAxis(xlCategory, xlPrimary) = False und .HasAxis(xlValue, xlPrimary) = False für das jeweilige Chart-Objekt einstellen, sieht das Diagramm wie in Bild 11 aus.
  • Diagramm ohne Achsen, Titel und Legende

    Bild 11: Diagramm ohne Achsen, Titel und Legende

Wenn Sie diese Elemente ein- oder ausblenden, passt sich in der Regel die Größe des eigentlichen Diagramms so an, dass die übrigen Elemente dargestellt werden können.

Eigenschaften der Achsen anpassen

Schauen wir uns nun an, wie Sie die Achsen eines Diagramms per VBA anpassen können. Die Beispiele führen wir, dass dies unkomplizierter gelingt, direkt über das Direktfenster aus. Dazu definieren wir noch ein paar Hilfsfunktionen, über die wir direkt auf die entsprechenden Achsen zugreifen können. Für die X-Achse sieht die entsprechende Funktion beispielsweise wie folgt aus:

Public Function XAchse() As Axis
     On Error Resume Next
     Set XAchse = Chart.Axes(xlCategory, xlPrimary)
     If XAchse Is Nothing Then
         MsgBox "X-Achse nicht definiert."
     End If
     On Error GoTo 0
End Function

Für die Y-Achse verwenden wir analog:

Public Function YAchse() As Axis
     On Error Resume Next
     Set YAchse = Chart.Axes(xlValue, xlPrimary)
     If YAchse Is Nothing Then
         MsgBox "Y-Achse nicht definiert."
     End If
     On Error GoTo 0
End Function

Achsen-Titel

Damit können Sie im Direktfenster ganz einfach auf die Eigenschaften der Achsen zugreifen – beispielsweise, um zu ermitteln, ob diese einen Titel aufweisen, und diesen gegebenenfalls anzupassen. Ob ein Titel vorhanden ist, prüfen Sie wie folgt – hier mit negativem Ergebnis:

Debug.Print XAchse.HasTitle
Falsch

Also aktivieren wir die Anzeige eines Titels für die X-Achse:

XAchse.HasTitle = True

Nun erscheint die Standardbeschriftung Achsentitel. Diesen ersetzen wir wie folgt durch einen passenden Titel:

XAchse.AxisTitle.Caption = "Artikel"

Auf die gleiche Weise passen wir die Y-Achse an:

YAchse.HasTitle = True
YAchse.AxisTitle.Caption = "Einzelpreis"

Achsentitel ausrichten

Das Diagramm sieht nun wie in Bild 12 aus. Dummerweise nimmt der Titel der Y-Achse viel Platz ein – das Diagramm ist unnötig klein. Zum Glück können wir die Orientierung der Beschriftungen ändern – und zwar mit der Eigenschaft Orientation des AxisTitle-Objekts:

Diagramm mit Achsen-Titel

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar