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.
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.
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.
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.
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.
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.
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).
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:
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.
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.
- 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.
Bild 10: Diagramm mit DataTable
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:
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