Berichte sind in vielerlei Hinsicht Formularen ähnlich, doch durch die fehlende Interaktion ist ihr Funktionsumfang auch geringer. Man sagt, die Steuerung per VBA biete daher bei Berichten auch nicht so viele Möglichkeiten. Das trifft nur begrenzt zu. Der vorliegende Artikel zeigt, welche Möglichkeiten die Steuerung von Berichten mit VBA offeriert.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1904_BerichtePerVBA.accdb.
In der Beitragsreihe “Ereignisreiche Berichte” (ab Ausgabe 12/2005) haben Sie bereits erfahren, welche Ereignisse Berichte bereitstellen und für welche Zwecke sie sich einsetzen lassen. Neben diesen Ereignissen liefern Berichte einige Eigenschaften und Methoden, ohne die so manche Aufgabe nicht zu lösen wäre. Im vorliegenden Beitrag erfahren Sie, worum es sich dabei dreht und wie Sie die Eigenschaften und Methoden verwenden.
Steuerelemente und Berichtsbereiche referenzieren
Wenn Sie den Wert eines Steuerelements lesen oder schreiben möchten, greifen Sie wie in Formularen darauf zu: entweder über die entsprechende Auflistung, inklusive Objektname, oder, wenn die Referenz aus dem gleichen Objekt heraus erfolgt, mit dem Schlüsselwort Me.
Für die Variante mit dem Objektnamen gibt es mehrere Möglichkeiten, unter anderem die folgenden:
Reports.Item("rptBeispiel").Controls("ctlBeispiel") Reports!rptBeispiel!ctlBeispiel
Mit dem Schlüsselwort Me sieht der Zugriff etwa folgendermaßen aus:
Me!ctlBeispiel
Auch die einzelnen Berichtsbereiche kann man referenzieren. Das macht Sinn, wenn man beispielsweise einen Bereich ein- oder ausblenden oder eine Eigenschaft ändern möchte. Der Verweis auf einen Berichtsbereich erfolgt über die Section-Auflistung eines Berichts. Dabei kommen für die Standardbereiche Zahlenwerte oder Konstanten in Frage, während man die Gruppenköpfe und -füße nur mit Zahlenwerten referenzieren kann. Den Detailbereich machen Sie etwa mit folgenden Anweisungen unsichtbar:
Me.Section(0).Visible = False Me.Section(acDetail).Visible = False
Für die übrigen Bereiche verwenden Sie die folgenden Konstanten:
- Berichtskopf: acHeader (1)
- Berichtsfuß: acFooter (2)
- Seitenkopf: acPageHeader (3)
- Seitenfuß: acPageFooter (4)
Die Zahlenwerte für die einzelnen Gruppierungsbereiche sehen folgendermaßen aus: Der Kopfbereich der ersten Gruppierungsebene erhält den Zahlenwert 5, der entsprechende Fußbereich den Zahlenwert 6. Die Kopf- und Fußbereiche der übrigen Gruppierungsebenen werden entsprechend durchnummeriert.
Neben der Konstanten und dem Zahlenwert gibt es eine weitere Möglichkeit, einen Berichtsbereich zu referenzieren. Dabei handelt es sich um den Wert der Eigenschaft Name des jeweiligen Bereichs.
Den Namen können Sie nach Ihren eigenen Wünschen anpassen, die standardmäßig vergebenen Namen reichen allerdingsmeist aus (siehe Bild 1).
Bild 1: Der Name der einzelnen Bereiche eines Berichts kann angepasst werden.
über den Namen können Sie auf einen Bereich so zugreifen, als ob es sich dabei um ein Steuerelement des Berichts handelt. Die Bereichsnamen werden sogar von IntelliSense unterstützt (siehe Bild 2).
Bild 2: Referenzieren eines Berichtsbereichs über den Bereichsnamen per IntelliSense
Die Routine aus Listing 1 zeigt, wie Sie die Namen und Höhen aller vorhandenen Berichtsbereiche im Direktfenster ausgeben können.
Private Sub Report_Open(Cancel As Integer) Dim i As Integer On Error Resume Next For i = 0 To 24 Debug.Print "Name des Bereichs: " & Me.Section(i).Name Debug.Print "Höhe des Bereichs: " & Me.Section(i).Height Next i End Sub
Listing 1: Ausgabe der Berichtsbereiche und deren Höhe
Das Ergebnis dieser Prozedur nach dem öffnen eines Berichts sieht etwa wie folgt aus:
Name des Bereichs: Detailbereich Höhe des Bereichs: 1474 Name des Bereichs: Seitenkopfbereich Höhe des Bereichs: 453 Name des Bereichs: Seitenfußbereich Höhe des Bereichs: 1134
Auch die Gruppierungsebenen eines Berichts bieten eine weitere Möglichkeit des Zugriffs, nämlich über die GroupLevel-Auflistung.
Die folgende Anweisung gibt etwa den Namen des Feldes aus, nach dem die erste Gruppierungsebene gruppiert wird:
Debug.Print Me.GroupLevel(0).ControlSource
Doch Vorsicht: Die Gruppierungsebenen sind keinesfalls mit den Berichtsbereichen identisch und haben völlig andere Eigenschaften und Methoden.
Gruppierungen im Griff
Schauen Sie sich zunächst die Eigenschaften und Methoden der Gruppierungsebenen an.
Die Eigenschaften sind weitgehend mit denen aus dem Bereich Gruppieren, Sortieren und Summe identisch. Unter VBA stehen die folgenden Eigenschaften zur Verfügung, wobei einige im Anschluss ausführlicher besprochen werden müssen:
- ControlSource: Gibt das Feld an, nach dem sortiert oder gruppiert werden soll.
- GroupHeader: Schreibgeschützte Eigenschaft, die angibt, ob die Gruppierung einen Gruppenkopf enthält.
- GroupFooter: Schreibgeschützte Eigenschaft, die angibt, ob die Gruppierung einen Gruppenfuß enthält.
- GroupOn: Entspricht der Eigenschaft Gruppieren nach. Die Eigenschaft kann verschiedene Werte annehmen, die vom Datentyp des unter ControlSource angegebenen Feldes abhängen.
- Groupinterval: Entspricht der Eigenschaft Intervall. Die Eigenschaft kann verschiedene Zahlenwerte angeben, die das Aussehen des Intervalls bestimmen.
- KeepTogether: Legt fest, ob die Datensätze und Gruppenkopf/-fuß, wenn möglich, auf einer Seite gedruckt werden sollen.
- SortOrder: Entspricht der Eigenschaft Sortierreihenfolge. Enthält den Wert False (aufsteigende Sortierung) oder True (absteigende Sortierung).
Die Eigenschaften GroupOn und Groupinterval hängen vom Wert der Eigenschaft ControlSource beziehungsweise vom Datentyp des dort angegebenen Feldes ab.
Wenn Sie etwa nach einem Textfeld gruppieren, kann die Eigenschaft GroupOn die Werte 0 (gruppiert nach dem kompletten Feldwert) oder 1 (gruppiert nach den ersten x Zeichen) annehmen, wobei x dem Wert der Eigenschaft GroupInterval entspricht.
Wenn Sie also die Artikel-Tabelle der Südsturm-Datenbank so gruppieren möchten, dass alle Artikel mit dem gleichen Anfangsbuchstaben gruppiert und der Anfangsbuchstabe im Gruppenkopf angezeigt werden soll, realisieren Sie das unter VBA mit der Ereignisprozedur aus Listing 2.
Private Sub Report_Open(Cancel As Integer) 'Erste Gruppierungsebene referenzieren With Me.GroupLevel(0) 'Zu gruppierendes Feld festlegen .ControlSource = "Artikelname" 'Gruppieren nach einer bestinmten Anzahl von Zeichen... .GroupOn = 1 '...die hier festgelegt wird: .GroupInterval = 1 'Gruppenkopf und Detailbereich sollen zusanmengehalten werden. .KeepTogether = 2 End With End Sub
Listing 2: Festlegen der Gruppierungseigenschaften eines Berichts
Um das wie in der Entwurfsansicht der Abbildung zu realisieren, haben wir die Seitenkopf- und Seitenfuß-Bereiche ausgeblendet. Außerdem haben wir der Eigenschaft Datensatzquelle die Tabelle tblArtikel zugewiesen. Die Gruppierung legen wir im Bereich Gruppieren, Sortieren und Summe an, der unten im Access-Fenster erscheint, wenn wir im Ribbon die Schaltfläche Entwurf|Gruppierung und Summen|Gruppieren und Sortieren aktivieren. Hier klicken Sie auf Gruppe hinzufügen und wählen dann unter Gruppieren nach das Feld Artikelname aus. Dem Gruppenkopf weisen wir ein Textfeld mit dem Steuerelementinhalt =Links([Artikelname];1) zu, was jeweils den ersten Buchstaben des Artikelnamen liefert. Außerdem haben wir dem Detailbereich ein Textfeld zur Anzeige des Feldes Artikelname hinzugefügt. Der zugrunde liegende Bericht sieht dann im Entwurf wie in Bild 3 aus.
Bild 3: Entwurf eines Berichts zur Ausgabe eines Artikel-Katalogs.
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: