Translate

Montag, 19. Dezember 2016

ACCESS: Prüfen ob Formularkopf/-fuß existiert. Wie viele Sections liegen vor?

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