Avatar billede Claus Mester
17. august 2007 - 11:52 Der er 14 kommentarer og
2 løsninger

VBA variabler som definition af kontroller og userform

Hvordan kan jeg skrive denne funktion:

Variabler:
myForm as String  'Navnet på min userform
myTxtbox as Control  'Kontroller på min userform

myForm = "UserForm1"
myTextbox = myForm + ".txtbox1"

msgbox myForm.myTextbox.Text

Ovenstående fejler, men hvordan kan jeg opnå denne funktion?

Lidt svært at forklare, så håber i kan følge mig.
Avatar billede Claus Mester
17. august 2007 - 11:54 #1
En lille fejl:

myTextbox as String (ikke Control)

En variabel mere:
myElement as string

myForm = "UserForm1" (min userform)
myTextbox = ".txtbox1"
myElement = myForm + myTextbox

msgbox myElement.Text
Avatar billede word-hajen Nybegynder
17. august 2007 - 17:15 #2
Er dit spørgsmål en udløber af http://www.eksperten.dk/spm/792163?
Avatar billede Claus Mester
18. august 2007 - 11:00 #3
Nej ikke helt en udløber. Men læner sig op af det jeg også søger der, tror jeg.

Her søger jeg efter, hvordan jeg kan definere en variabel som navnet på en userform og kombinere det med et navn på en given kontrol og knytte en egenskab til det hele.

Når jeg forsøger mig med:

En UserForm1 med en TextBox1 og en knap og følgende:

Dim MyVar1, MyVar2 as String
MyVar1 = "Userform1"
myVar2 = "Textbox1"

msgbox myVar1.myVar2.Text

Får jeg en fejl der lyder: Run-time error '424': Object required.

Kan du følge mig?
Avatar billede word-hajen Nybegynder
18. august 2007 - 11:49 #4
Hvorfor ikke bare lave en procedure, hvor du sender kontrollen med? For det er vel det, du har behov for?

Public Sub Meddelelse(objControl as Control)
    et eller andet her
End sub

****midt i en procedure i din userform****
Call Meddelelse(me.Textbox1)
****

På den måde har du fuld adgang til lige nøjagtig den kontrol, som du har sendt videre.
Avatar billede kjulius Novice
19. august 2007 - 01:53 #5
For loadede forms er der ikke noget til hinder for at referere til controlproperties via et index som består af navnet:

msgbox forms(MyVar1).controls(myVar2).Text
Avatar billede Claus Mester
19. august 2007 - 04:41 #6
word-hajen:
Det er ikke helt det jeg ude efter. I en løkke har jeg behov for at kunne referere til en ikke statisk specificeret UserForm og en ikke statisk specificeret kontrol, samt henvise til den kontrols text egenskab.

Iøvrigt får jeg fejl når jeg benytter "Me" i mine koder. Bortset fra (og udelukkende kun her) når jeg benytter den sammen med (Un)load Me.

kjulius:
Det er præcis hvad jeg er ude efter. Men din kode resulterer hos mig i en fejl der lyder:

"Sub or Function not defined"

Ved "forms".
Avatar billede tjacob Juniormester
19. august 2007 - 11:58 #7
Lige netop Forms Collection kan du ikke tilgå med en Streng (som man kan i de fleste andre Collections). Det SKAL være via et Index (tal).

Følgende kode fungerer fint: msgbox Forms(0).Controls(myVar2).Text

nicolaus: Du kan evt. iterere gennem hele Forms Collection, og via navnet finde Index til din form, og derefter bruge ovenstående kode (husk at formen skal være Loaded for at optræde i Forms Collection).

    Dim i As Integer
    For i = 0 To Forms.Count - 1
        If Forms(i).Name = MyVar1 Then Exit For
    Next i
    MsgBox (Forms(i).Controls(MyVar2).Text)
Avatar billede tjacob Juniormester
19. august 2007 - 12:21 #8
OBS:  Jeg ser nu at det VBA:

    Så skal du nok ændre Forms til UserForms
Avatar billede kjulius Novice
19. august 2007 - 13:11 #9
Hvilken office applikation bruger du? Jeg må tilstå, at jeg kun har prøvet det af i Access, og her virker det perfekt.
Avatar billede word-hajen Nybegynder
19. august 2007 - 16:44 #10
Bare en sidebemærkning. Hvis du får fejl, når du benytter Me, befinder du dig ikke i din form. Det er alene her, du kan bruge Me. Til gengæld kan du godt bruge Me.txtetellerandet til at kalde en procedure, der befinder sig et andet sted end på din form og du har behov for variabel-control, når blot du så kalder proceduren fra din form.
Avatar billede Claus Mester
04. september 2007 - 09:01 #11
Ja, i har jo fuldstændig ret i det i skriver. Så mit alternativ er (kan jeg forstå) at adressere min userform med navnet "frmTestetEllerAndetLangtNavn" med:

Userforms(0).txtBox1.Text, såfremt dens index er 0. Og befinder jeg mig på den, kan jeg adressere kontroller med me.txtBox1.Text.

Fint. Tak skal i have :)
Avatar billede word-hajen Nybegynder
04. september 2007 - 21:30 #12
Øhh... nej. Hvis du kalder en procedure i et modul fra din userform, skal du sende formen med. Eksempel:

********kode på formen****
Private Sub cmdOK_Click
    Call GennemløbKontroller(me)
End Sub
**************************

*****kode i et modul****
Public Sub GennemløbKontroller(objForm as frmTestetEllerAndetLangtNavn)
    objForm.txtBox1.text = "Weee....."
End Sub
************************
Avatar billede Claus Mester
03. oktober 2007 - 08:52 #13
Tak for hjælpen. Jeg løste udfordringen ved en blanding af jeres input og funktioner.
Husk at lægge et svar.
nicolaus
Avatar billede word-hajen Nybegynder
03. oktober 2007 - 12:37 #14
Tak for tilbagemeldingen.
Avatar billede kjulius Novice
03. oktober 2007 - 13:07 #15
Tak. Hvad blev løsningen? - og hvilken office applikation anvender du, det svarede du ikke på... :-)
Avatar billede Claus Mester
03. oktober 2007 - 17:13 #16
Så lyset i tjacobs løsning af
19/08-2007 11:58:33. Men benytter pt. denne løsning:

Jeg definerer en global variabel, der udstyres med navnet på den txtbox jeg befinder mig i, gennem kontrollens "exit" hændelse. Når jeg siden skal addressere kontrollen, skriver jeg formens navn fuldt ud (uden brug af variabel) efterfulgt af variablen der repræsenterer kontrollen. Altså noget i stil med:

Sub exit ...
myCtrl = "txtbox1"
End Sub

Sub adressCtrl
Userform1(myCtrl).Backcolor = .....
End Sub

Jeg bruger Excel og Word 2003 :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester