# VB6: >Set ctlControl = Controls("TextBox1")< in VBA-Word ähnlich möglich?



## Nix&Alleswisser (21. Mai 2010)

N'Abend, liebe Leut!

Ich quäle mich schon seit längerem durch die Suche und googeln hat mich auch nicht zum Ziel gebracht. Vielleicht ist meine Frage so dä..., dass man das nie thematisiert hat.

*Kurzfassung:*
Gibt es einen ähnlichen Befehls-Ausdruck für VBA Word, wie er in VB6 möglich ist:
Set ctlControl = Controls(<Name des Controls, das in einem Array abgelegt wurde>) 

*Langfassung:*

*Vorgeschichte:*
In MS Word muss der Anwender (AW) in angebotenen Dot-Vorlagen mehrere Forms abarbeiten bis dann nach dem letzten fertig bearbeitetem Form erst die Inhalte aller durchlaufenen Forms in das Dokument geschrieben werden. Ich habe eine Ablaufsteuerung realisiert, womit der AW u.a. mit "Weiter" ins nächste Form kommt, aber auch mit "Zurück" in das vorige Form springen kann (die weiteren Möglichkeiten lasse ich jetzt mal weg). Bisher hatte ich es so realisiert, dass die zu verlassenen Forms dann einfach per Hide versteckt werden.
Jetzt wurde ich verdonnert, Forms zu schließen und die Controls eben zwischenzuspeichern wegen Speicherplatz ...

*Gegebenheiten:*
Mit Klassenmodulen konnte ich mich bislang nicht anfreunden - ich lege die Werte und Eigenschaften ausgesuchter Controltypen des zu verlassenen Forms nach einem bestimmten Schema in ein dynamisches Array mit 4 Dimensionen ab (ich mag Arrays ).

Damit es hier nachvollziehbar bleibt, nehme ich mal exemplarisch ein Array mit 2 Dimensionen: "Dim Array() as String". 
Das Beispielformular (Form01) hat 3 Controls: TextBox1 und 2 Command-Buttons.

Beim Verlassen des Form01 mit "Weiter" werden alle Controls des Form01 im Wege einer Schleife abgehandelt und der Control-Typ ausgewertet, also nur die für mich interessanten Controls ins Array gespeichert (z.B. "If TypeOf Control Is TextBox Then ...").  Das Array wurde jetzt befüllt mit:
Array(0 , 0) = "TextBox1" - Name des Controls 
Array(0 , 1) = "Hallo"        - Value des Controls
Array(0 , 2) = "Wahr"        - Eigenschaft Visible des Controls 

Form01 wird dann per Unload geschlossen.

Wenn ich in Form01 wieder zurückspringen will, wird es neu geladen.  Anhand des Arrays (das mir auch den Formularnamen verrät) erkenne ich, dass Frm01 schon einmal initialisiert bzw. bearbeitet wurde. Daher mache ich keine Grund-Initialisierung des Forms (das geschieht nur, wenn das Form zum 1. Mal geladen wird), sondern möchte nun die Controls entsprechend befüllen oder z.B. die EIgenschaft "Visible" setzen.

*Problem:*
Die Prozedur zur Abhandlung der Controls ist in ein Modul ausgelagert, befindet sich also nicht als Modul in der Form.

In VB6 konnte man folgendes verwenden:

Dim i As Integer
i = 0
Do
Set ctlControl = Controls(Array(i , 0))   'Ctrl-Namen zuweisen

If TypeOf ctlControl Is TextBox Then 
... behandle die Text-Box entsprechend des Arrays
ElseIf TypeOf ctlControl Is CheckBox Then
usw.
End If         
i = i + 1   'nächstes Control einstellen
If i > UBound(Array, 1) Then Exit Do   'Wenn der Höchstwert der 1. Dimension erreicht ist, dann Schleife verlassen​Loop While Ablauf_aStrFrmDaten(i , 0) <> "" 'wenn nächster Platz nicht mit Control-Namen belegt ist, dann raus

Ich erhalte zum Begriff Controls die Fehlermeldung "Sub oder Function nicht definiert". Nun suche ich eine Anweisung, die in VBA verarbeitet werden kann.
Der Befehl Control.Add(Array(i , 0)) geht nicht und mein Bauch sagt mir auch, dass ein Add wohl hier falsch wäre. Problematisch ist wohl, dass ich nicht in einem formularinternen Modul operiere. Aber ich möchte auch nicht in jedem Form einen Haufen Code integrieren. 

Kann mir jemand helfen? Besten Dank!


----------



## tombe (21. Mai 2010)

Also auf die Schnelle habe ich gerade mal was in der Art nachgestellt. Ich erhalte die gleiche Fehlermeldung wenn das Array/die Variable nicht so definiert ist, das sie in dem Bereich erreichbar ist.

Nachdem ich sie in meinem Beispiel als Global definiert hatte, hat es funktioniert.

Gruß Thomas


----------



## Nix&Alleswisser (21. Mai 2010)

tombe hat gesagt.:


> Also auf die Schnelle habe ich gerade mal was in der Art nachgestellt. Ich erhalte die gleiche Fehlermeldung wenn das Array/die Variable nicht so definiert ist, das sie in dem Bereich erreichbar ist.
> 
> Nachdem ich sie in meinem Beispiel als Global definiert hatte, hat es funktioniert.
> 
> Gruß Thomas



Hallo Thomas,

ich vergaß zu der Codezeile: "Set ctlControl = Controls(Array(i , 0))" zu erwähnen, dass sowohl das Array mit "Public Array() As String" als auch die Controlvariable ctlControl mit: "Public ctlControl As Control" in einem separaten Modul global definiert sind.

Dass es bei Dir geklappt hat, kann nur daran liegen, dass Du in VB6 getestet hast und nicht in VBA von MS Word oder stehe ich hier auf dem Schlauch? Setze ich die Codezeile in ein Form rein, bekomme ich die Error: "Das angegebene Objekt konnte nicht gefunden werden". 
Ich habe hier MS Word 2002 SP 3 drauf und ab 01.07.10 wird man uns mit Office 2007 versorgen (solange möchte ich nicht warten). VBA hängt sich am Objekt(?) "Controls" auf, das es in VB6 gibt.

Ich hoffe, Du kannst mir nochmal helfen oder jemand anders weiß Rat.

*Es geht mir hier nur darum, dass ich in VBA Controlnamen (As String) einer Variablen (AS Control) zuweisen kann* (geht wohl nur mit Set-Befehl). Vergesst die Vorgeschichte mit den Arrays!
*Wie könnte ich: Set ctlControl = Controls("TextBox1") in VBA umsetzen?*
Dann kann ich mit ctlControl weiter operieren.

Danke und Gruß,
Markus


----------



## tombe (22. Mai 2010)

Hi Markus,

nein ich habe nicht mit VB getestet. Ich habe in WORD 2000 () ein neues Dokumente erstellt und dort 2 UserForms. In jede davon habe ich 2 Textfelder sowie einen Button gesetzt.
Werden die Felder in Form1 gefüllt und auf dem Button geklickt, wird die Variable/das Array mit den Werten belegt und die Form1 aus- und Form2 eingeblendet. Wird in Form2 auf dem Button geklickt, wird diese aus- und Form1 wieder eingeblendet. Dabei wird geprüft ob die Variable/das Array Werte enthält und dementsprechend angezeigt.

Ich hänge meinen Versuch mal hier an vielleicht hilft dir das ja weiter. Im Dokument einfach auf dem Button klicken um die Form1 zu starten!!

Gruß Thomas


----------



## Nix&Alleswisser (22. Mai 2010)

Hallo Thomas,

mein Dienst-Laptop hier im Urlaub erlaubt mir kein Download  , sodass ich erst in 2 Tagen zu Hause am Heim-PC gucken könnte. Dein Erfahrungsbericht hat mich zum Ausprobieren ermutigt und so habe ich nun die Lösung des Problems gefunden!

Ich habe 1 Frm "UserForm1" mit einem Textfeld "TextBox1" und ein Button "CommandButton1" kreiert.

Private Sub CommandButton1_Click()
Dim ctlControl As Control
Set ctlControl = Controls("TextBox1")
ctlControl.Visible = False​End Sub

Das hat geklappt - schön. ABER: Ich will den ganzen Codesalat in einem externen Modul unterbringen  
Daher habe ich dem VBA-Projekt ein Modul hinzugefügt und folgenden Sub integriert:

Sub FeldAusblenden()
Dim ctlControl As Control
Set ctlControl = Controls("TextBox1")
UserForm1.ctlControl.Visible = False​End Sub

Den bisherigen Sub im Frm "UserForm1" habe ich geändert auf:

Private Sub CommandButton1_Click()

Call FeldAusblenden
End Sub

Wenn man jetzt den Button drückt, kommt wieder die Error: "Sub oder Function nicht definiert" und das Codewort "Controls" ist markiert. Dieses Codewort ist vermutlich ein Objekt des Frm. Ich habe dann den Sub einfach mal probeweise abgeändert auf:

Sub FeldAusblenden()
Dim ctlControl As Control
Set ctlControl = UserForm1.Controls("TextBox1")
ctlControl.Visible = False​End Sub

Und so hat es nun funktioniert! Also werde ich an den Sub im externen Modul auch das Formularobjekt übergeben müssen (ich denke, dass ich das hinbekomme).
Trotzdem danke ich Dir Thomas für Deine Hilfe! Denn wenn es bei einem klappt (auch wenn Du ggf. kein externes Modul hattest), dann macht das Hoffnung und spornt mich an.

Vielen Dank!
Gruß,
Markus


----------

