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