Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Bild 1: Zu benennende Steuerelemente
Als ich neulich mal wieder einige Steuerelemente zu einem Formular hinzugefügt habe, die durchnummerierte Namen erhalten sollten wie txt01, txt02 und so weiter, kam die Eingebung: Warum diese langweilige Arbeit immer wieder von Hand erledigen, statt einfach ein Tool dafür zu entwickeln Gesagt, getan: Es sollte ein kleines Add-In her, mit dem sich diese erste kleine Aufgabe vereinfachen ließ. Wie Sie vermutlich auch, programmiere ich nämlich lieber als dass ich immer wiederkehrende Aufgaben durchführe. Das Durchnummerieren von markierten Steuerelementen nach bestimmten Vorgaben soll die erste Funktion dieses Add-Ins sein. Ihnen und mir fallen sicher noch noch weitere Ideen für den Einsatz dieses Add-Ins ein!
Der Auslöser für die Programmierung des in diesem Beitrag beschriebenen Add-Ins ist das unscheinbare Formular aus Bild 1.
Bild 1: Zu benennende Steuerelemente
Die drei Kombinationsfelder sollen die Namen cboSucheNach1, cboSucheNach2 und cboSucheNach3 erhalten und die Textfelder rechts daneben die Namen txtSucheNach1, txtSucheNach2 und txtSucheNach3.
Darauf, das von Hand zu erledigen, hatte ich keine Lust. Also habe ich zuerst eine kleine Prozedur geschrieben, die wie in Listing 1 aussieht.
Public Sub SteuerelementeBenennen(strBezeichnung As String, strPlatzhalter As String, intStellen As Integer, _ Optional intStart As Integer = 1) Dim frm As Form Dim ctl As Control Dim intNummer As Integer Dim strStellen As String intNummer = intStart Set frm = Screen.ActiveForm strStellen = String(intStellen, "0") For Each ctl In frm.Controls If ctl.InSelection Then ctl.Name = Replace(strBezeichnung, strPlatzhalter, Format(intNummer, strStellen)) intNummer = intNummer + 1 End If Next ctl End Sub
Listing 1: Prozedur zum Benennen von Steuerelementen
Sie erwartet die folgenden Parameter, um die Benennung der Steuerelemente so flexibel wie möglich zu machen:
- strBezeichnung: Bezeichnung des Steuerelements inklusive eines Platzhalters, an dessen Stelle die Nummern eingetragen werden.
- strPlatzhalter: Platzhalter, der durch die Nummern ersetzt werden soll.
- intStellen: Anzahl der Stellen für die Durchnummerierung. Der Wert 2 würde beispielsweise bei den ersten Namen um eine führende 0 ergänzt werden, also beispielsweise 02.
- intStart: Gibt die Nummer für das erste Steuerelement an. Standardwert ist 1. Geben Sie einen anderen Wert an, wird die Nummerierung mit diesem begonnen.
Ein Aufruf dieser Prozedur sieht beispielsweise wie folgt aus:
SteuerelementeBenennen "cboSucheNach[]", "[]", 1, 1
Hier wird immer der Basisname cboSucheNach[] verwendet, bei dem die Zeichenfolge [] durch die aktuelle Zahl ersetzt wird – in diesem Fall mit einer Stelle, also ohne führende 0 bei den ersten Einträgen.
Die Prozedur trägt zuerst den Wert der Startzahl aus dem Parameter intStart in die Variable intNummer ein. Dann referenziert sie das aktuell geöffnete Formular mit Screen.ActiveForm. Diese erste Fassung enthält noch keine Prüfung, ob beispielsweise überhaupt ein Formular geöffnet ist oder ob der Benutzer Steuerelemente zum Umbenennen markiert hat.
Dann verwendet die Prozedur den Wert aus dem Parameter intStellen, um in strStellen eine Zeichenkette mit so vielen Nullen zu füllen, wie es in intStellen angegeben ist. Damit starten wir in eine For Each-Schleife über alle Steuerelemente des mit frm referenzierten Formulars.
In der Schleife prüfen wir zuerst in einer If…Then-Bedingung, ob das aktuell durchlaufene Steuerelement markiert ist. Dazu nutzen wir die Eigenschaft InSelection. In der If…Then-Bedingung stellen wir die Eigenschaft Name des mit ctl referenzierten aktuellen Steuerelements auf die gewünschte Bezeichnung ein.
Diese ermitteln wir, indem wir den Platzhalter strPlatzhalter in strBezeichnung mit Replace ersetzen, und zwar durch den Wert aus der Variablen intNummer mit dem Format aus strStellen.
Prüfungen
Damit haben wir den größten Teil bereits erledigt. Bevor wir ein Add-In auf Basis dieser Prozedur anlegen, wollen wir jedoch noch zwei Prüfungen einbauen. Die Erste soll untersuchen, ob überhaupt ein Formular in der Entwurfsansicht geöffnet ist. Dazu deklarieren wir eine Variable namens bolEntwurfsansicht:
Dim bolEntwurfsansicht As Boolean
Die Abfrage von Screen.ActiveForm fassen wir in On Error Resume Next/On Error Goto 0 ein, um die Fehlerbehandlung für diese eine Anweisung zu deaktivieren. Der Grund ist, dass der Aufruf ohne geöffnetes Formular einen Fehler auslöst, den wir vermeiden wollen. Dann prüft die Prozedur, ob frm leer ist, was der Fall ist, wenn kein Formular geöffnet ist. Ist frm nicht leer, prüfen wir mit der Eigenschaft CurrentView, ob die aktuelle Ansicht die Entwurfsansicht ist. Falls ja, stellen wir die Variable bolEntwurfsansicht auf True ein:
... On Error Resume Next Set frm = Screen.ActiveForm On Error Goto 0 If Not frm Is Nothing Then If frm.CurrentView = acCurViewDesign Then bolEntwurfsansicht = True End If End If
Hat bolEntwurfsansicht danach noch den Wert False, ist das aktive Element entweder kein Formular oder dieses ist nicht in der Entwurfsansicht geöffnet. In diesem Fall gibt die Prozedur eine entsprechende Meldung aus und wird abgebrochen:
If bolEntwurfsansicht = False Then MsgBox "Es ist kein Formular in der Entwurfsansicht geöffnet.", vbOKOnly + vbExclamation, "Kein Formular geöffnet" Exit Sub End If
Außerdem kann es sein, dass wir die gleichen Steuerelemente zu Testzwecken mehrere Male umbenennen oder dass diese aus anderen Gründen zuvor bereits solche Namen erhalten haben, wie Sie diese mit der Prozedur zuweisen wollen. Dabei kann es vorkommen, dass Sie einem Steuerelement einen Namen geben wollen, der bereits vergeben ist. Dies würde einen Fehler auslösen.
Um dies zu verhindern, durchlaufen wir eine ähnliche For Each-Schleife wie diejenige, welche die gewünschten Namen zuweist, bereits vorher und vergeben Namen wie xyz1, xyz2 und so weiter für die Steuerelemente, bevor diese ihre endgültigen Namen erhalten. Danach müssen wir intNummer erneut mit intStart initialisieren:
For Each ctl In frm.Controls If ctl.InSelection Then ctl.Name = "xyz" & intNummer intNummer = intNummer + 1 End If Next ctl intNummer = intStart
Ungünstige Aktivierreihenfolge
Es kann sein, dass die Aktivierreihenfolge der zu benennenden Steuerelemente nicht der Reihenfolge entspricht, in der die Steuerelemente neben- oder untereinander angeordnet sind.
Die For Each-Schleife über alle Control-Elemente des Formulars durchläuft diese jedoch in der Reihenfolge, die der Aktivierreihenfolge entspricht.
Die Aktivierreihenfolge können Sie jedoch zuvor über den Dialog Reihenfolge einstellen, wenn die Aktivierreihenfolge nicht stimmt (siehe Bild 2). Diesen Dialog öffnen Sie über den Ribbon-Befehl Entwurf|Tools|Eigenschaften.
Bild 2: Aktivierreihenfolge der Steuerelemente
Parameter per Formular eingeben
Damit der Benutzer die Parameter bequem eingeben kann, wenn er das Add-In aufgerufen hat, stellen wir ihm ein passendes Formular zur Verfügung. Dieses soll die zuletzt verwendeten Werte außerdem speichern. Dazu erstellen wir zuerst eine Tabelle namens tblOptionen. Diese enthält die Felder aus Bild 3.
Bild 3: Entwurf der Tabelle zum Speichern der Add-In-Optionen
Das Formular zur Eingabe dieser Optionen benennen wir frmSteuerelementeNummerieren. Nach dem Anlegen stellen wir seine Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und Bildlaufleisten auf Nein und Automatisch zentrieren auf Ja ein.
Außerdem legen wir als Datensatzquelle die Tabelle tblOptionen fest und stellen die Eigenschaft Zyklus auf Aktueller Datensatz ein. So kann der Benutzer nicht versehentlich einen zweiten Satz Optionen hinzufügen. Schließlich ziehen wir die vier Felder der Tabelle aus der Feldliste in den Detailbereich des Formularentwurfs. Außerdem fügen wir eine Schaltfläche namens cmdSteuerelementeBenennen hinzu. Das Ergebnis finden Sie in Bild 4.
Bild 4: Formular zum Eingeben der Parameter
Die Prozedur, die durch die Schaltfläche cmdSteuerelementeBenennen ausgelöst wird, braucht nun prinzipiell nur noch die Prozedur SteuerelementeBenennen aufzurufen und dieser die Parameter aus den Textfeldern zu übergeben. Dazu definieren wir die folgende Prozedur:
Private Sub cmdSteuerelementeBenennen_Click() SteuerelementeBenennen Me!Bezeichnung, _ Me!Platzhalter, Me!Stellen, Me!Start End Sub
Nun öffnen wir das Zielformular in der Entwurfsansicht und markieren die umzubenennenden Felder. Wenn wir dann das Formular frmSteuerelementeNummerieren öffnen, die Parameter einstellen und auf die Schaltfläche cmdSteuerelementeBenennen klicken, erhalten wir die Meldung aus Bild 5.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo