Wie kann mit VBA festgestellt werden, ob ein Formular/Report einen gewissen Bereich (z.B. Formularkopf) enthält?
Bei der Programmierung innerhalb eines Formulars, stellt sich nicht wirklich die Frage, den es ist ja bekannt was im aktuellen Formular an Bereichen eingerichtet ist und was nicht.
Bei der Programmierung einer allgemeinen Formularübergreifenden Prozedur, ist der Prozedur dies jedoch nicht bekannt, und da stellt sich sehr wohl die Frage, ob eine gewisse Section (Bereich) vorhanden ist oder nicht.
Dazu müssten wir eigentlich nur die VBA Auflistung Section befragen.
Doch Leider gibt es nicht solch eine Auflistung für dieses Objekt :-(
Also schreiben wir uns einfach eine Globale-Funktion die diesen Job für uns erledigt:
Public Function SectionExists(FormReportOBJ As Object, SectionIndex As AcSection _
, Optional ByRef SectionOBJ As Section) As Boolean
On Error Resume Next
Set SectionOBJ = FormReportOBJ.Section(SectionIndex)
SectionExists = (Err.Number = 0)
End Function
Hinweis: Das Objekt Section stellt uns leider nicht die Information zur Verfügung, wie viel Sections vorhanden sind. Somit bleibt uns nichts anderes übrig, als dies mit der Fehlerabfangmethode zu lösen. Nicht elegant, aber es funktioniert ;-)
Andere Fehler haben wir nicht zu erwarten, so dass hier keine weitere Fehlerbehandlung benötigt wird.
Und so kann jetzt unsere Funktion angewandt werden:
Private Sub Form_Load()
Dim SectionOBJ As Section
If SectionExists(Me, acHeader, SectionOBJ) Then
SectionOBJ.BackColor = RGB(255, 0, 0) 'Farbe Rot
End If
End Sub
Erläuterung: Bei Laden des Formulars wird geprüft ob das aktuelle Formular (ME) einen Formularkopf enthält. Wenn dies der Fall ist, liefert unsere Prüf-Funktion SectionExists() den Wert True zurück und die abgefragte Section wird mit der Hintergrundfarbe Rot versehen. Die Variable SectionOBJ ist übrigens per Referenz-Übergabe in der Funktionsprozedur SectionExists() gesetzt worden.
Wenn wir schon dabei sind, mit der gleichen Technik schreiben wir uns noch eine Funktion, die uns die Anzahl der vorhandenen Sections zurück liefert:
Public Function SectionsCount(FormReportOBJ As Object) As Byte
Dim i As Byte, SectionOBJ As Section
On Error Resume Next
For i = 0 To 255
Set SectionOBJ = FormReportOBJ.Section(i)
If Not Err.Number = 0 Then Exit For
Next
SectionsCount = i
End Function
Dies kann z.B. interessant sein, wenn per VBA alle Sections im Formular mit einer Farbe versehen werden soll. Und so geht's:
Private Sub Form_Load()
Dim i As Byte
For i = 0 To SectionsCount(Me)-1
me.Section(i).BackColor = RGB(255, 0, 0) 'Farbe Rot
Next
End Function
Das ganze funktioniert auch mit Berichten. Gerade diese haben durchaus noch weitere Bereiche wie acGroupLevel1Footer, acGroupLevel2Footer usw...
Keine Kommentare:
Kommentar veröffentlichen