Auf VBA-Code zugreifen mit der CodePane-Klasse

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:

Die CodePane-Klasse im Objektkatalog

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

Da das CodePane-Objekt selbst keine Name-Eigenschaft enthält, greifen wir über objCodePane.CodeModule.Parent auf das VBComponent-Objekt dieses CodePane-Objekts zu und geben seinen Namen aus. Das liefert nur die Namen der Module, die aktuell geöffnet sind.

Aktuelles CodePane-Objekt referenzieren

Meist interessiert in Zusammenhang mit dem CodePane-Objekt jedoch das aktuelle CodePane-Objekt. Dieses referenzieren Sie mit der Eigenschaft ActiveCodePane der VBE-Klasse.

Die folgende Prozedur erledigt das und gibt den Namen des VBComponent-Objekts des CodeModule-Objekts des aktuellen CodePane-Objekts im Direktbereich aus:

Public Sub AktuellesCodePane()
     Dim objCodePane As CodePane
     Set objCodePane = VBE.ActiveCodePane
     Debug.Print objCodePane.CodeModule.Parent.Name
End Sub

Verschiedene Ansichten im CodePane-Objekt

Für die Anzeige im CodePane-Objekt gibt es zwei Optionen. Diese lesen Sie über die schreibgeschützte Eigenschaft CodePaneView ein. Die möglichen Werte lauten:

  • vbext_cv_FullModuleView (1): Zeigt immer das ganze Modul an.
  • vbext_cv_ProcedureView (0): Zeigt nur den ausgewählten Bereich beziehungsweise die ausgewählte Prozedur an.

Sie können die Ansicht nur über die Optionen des VBA-Editors einstellen, und zwar auf der Registerseite Editor im Bereich Fenstereinstellungen unter Standardmäßig ganzes Modul anzeigen (siehe Bild 2).

Einstellen der Eigenschaft

Bild 2: Einstellen der Eigenschaft

Die Einstellung vbext_cv_ProcedureView ist eher selten anzutreffen und sieht beispielsweise wie in Bild 3 aus.

Anzeige einzelner Prozeduren statt des ganzen Moduls

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

Schreibe einen Kommentar