In den vorherigen Beiträgen dieser Beitragsreihe haben wir uns bereits angesehen, wie Sie auf die Module im VBA-Editor zugreifen, neue Module erstellen und den enthaltenen Code bearbeiten. Es fehlt allerdings noch eine wichtige Schnittstelle zwischen Benutzer und der automatisierten Bearbeitung von VBA-Code: Die Klasse CodePane, die unter anderem die Möglichkeit bietet, vom Benutzer gesetzte Markierungen im Code auszulesen und solche zu setzen. Letzteres können Sie beispielsweise nutzen, um per VBA gesuchte Stellen im Code zu markieren, damit der Benutzer diese erkennen kann. Dieser Beitrag stellt die CodePane-Klasse und ihre Möglichkeiten vor.
Vorbereitung
Um die Elemente der Klasse VBE nutzen zu können, benötigen Sie einen Verweis auf die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3 Object Library, den Sie im Verweise-Dialog des VBA-Editors hinzufügen können (Menüeintrag Extras|Verweise).
Vorbereitende Beiträge
Wenn Sie erfahren wollen, wie Sie überhaupt bis zu der hier beschriebenen Klasse gelangen, helfen die folgenden Beiträge weiter:
- VBA-Projekt per VBA referenzieren (www.access-im-unternehmen.de/1337)
- Zugriff auf den VBA-Editor mit der VBE-Klasse (www.access-im-unternehmen.de/1350)
- Zugriff auf VBA-Projekte per VBProject (www.access-im-unternehmen.de/1351)
- Module und Co. im Griff mit VBComponent (www.access-im-unternehmen.de/1352)
- VBA-Code manipulieren mit der CodeModule-Klasse (www.access-im-unternehmen.de/1353)
Elemente der CodePane-Klasse
Die CodePane-Klasse und ihre Eigenschaften, Methoden und Auflistungen können Sie im Objektkatalog (zu öffnen mit der Taste F2) im Überblick ansehen, wenn Sie dort nach CodePane suchen (siehe Bild 1). Die CodePane-Klasse hat folgende Eigenschaften, Methoden und Auflistungen:
Bild 1: Die CodePane-Klasse im Objektkatalog
- CodeModule: Verweis auf das CodeModule-Objekt, das im CodePane-Objekt enthalten ist
- CodePaneView: Gibt die aktuelle Darstellung im CodePane wieder – entweder vollständiges Modul (1) oder nur einzelne Prozeduren (0).
- Collection: Erlaubt den Zugriff auf alle geöffneten CodePane-Objekte.
- CountOfVisibleLines: Liefert die Anzahl der sichtbaren Zeilen im Fenster.
- GetSelection: Liefert den aktuell markierten Bereich mit den vier Rückgabeparametern.
- SetSelection: Setzt eine Markierung anhand von vier Parametern.
- Show: Versieht das CodePane-Objekt, für das diese Methode aufgerufen wurde, mit dem Fokus.
- TopLine: Gibt die Zeilennummer der oben im Fenster angezeigten Zeile aus und erlaubt auch das Einstellen dieser Zeile.
- VBE: Verweis auf die VBE-Klasse.
- Window: Verweis auf das übergeordnete Window-Objekt
Auf das CodePane-Objekt zugreifen
Um auf ein CodePane-Objekt zuzugreifen, gibt es mehrere Möglichkeiten. Der Zugriff erfolgt entweder von der Auflistung CodePanes der VBE-Klasse, vom untergeordneten CodeModule-Element oder über die Eigenschaft ActiveCodePane der VBE-Klasse.
Wenn Sie den Namen eines Moduls kennen und auf sein CodePane-Objekt zugreifen wollen, nutzen Sie den Weg über CodeModule. Dazu referenzieren Sie zuerst das CodeModule-Objekt, das sie über die gleichnamige Eigenschaft des entsprechenden Elements der VBComponents-Auflistung des aktuellen VB-Projekts erhalten. Dieses bietet über die CodePane-Eigenschaft Zugriff auf das CodePane-Objekt.
Damit wir sehen, ob wir das richtige CodePane-Objekt referenzieren, zeigen wir sein Fenster mit der Show-Methode an:
Public Sub CodePanePerCodeModule() Dim objCodeModule As CodeModule Dim objCodePane As CodePane Set objCodeModule = VBE.ActiveVBProject. VBComponents("mdlBeispielcode").CodeModule Set objCodePane = objCodeModule.CodePane objCodePane.Show End Sub
Damit können Sie auf alle CodePane-Elemente zugreifen, auch die von aktuell noch geschlossenen Modulen. Nur die aktuell in Window-Elementen angezeigten CodePane-Elemente können Sie über die Auflistung CodePanes der VBE-Klasse ansprechen.
Die folgende Prozedur durchläuft in einer For Each-Schleife alle Elemente der CodePanes-Auflistung und referenziert das jeweils aktuelle Element mit der Variablen objCodePane:
Public Sub CodePanePerWindow() Dim objCodePane As CodePane For Each objCodePane In VBE.CodePanes Debug.Print objCodePane.CodeModule.Parent.Name Next objCodePane End Sub