[vba] Variabele variabelenaam in sub

Pagina: 1
Acties:
  • 242 views sinds 30-01-2008
  • Reageer

  • Boogie
  • Registratie: Januari 2001
  • Laatst online: 24-04 04:51
Als je een sub aanroept en een integer meegeeft,
en je wilt vervolgens de integer in de variabelenaam gebruiken.
Hoe moet dat?

Wat wil ik:
Geef 2 mee aan sub:
code:
1
2
3
4
sub knoptekst(knopnr as integer)
  knop2.capion=foo
  'iets als:  knop & knopnr.caption?
EndSub


ik plak dus de "2" aan "knop" zodat ik iets met knop2 kan

in PHP zou ik
PHP:
1
2
3
function fnaam($i){
    $glob_var{$i}="foo"
}
gedaan hebben.

In vba heb wel alle mogelijke leestekens geprobeerd en flink gezocht.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dit kan niet (iig niet zonder terug te vallen op érg ranzige code :X ). Je kunt wel een array van controls gebruiken en een index meegeven.

code:
1
2
3
4
5
6
7
Sub knoptekst(lIndex as long, strMyText as string)
  cmdBla(lIndex).caption = myString
End Sub

'Aanroepen:
KnopTekst 2, "Dit is een test"
KnopTekst 3, "W00t! First post!"


Een array van controls maak je door het object (knop in dit geval) te kopiëren en plakken en "ja/yes" te geven als 'ie vraagt of 'ie een array moet maken. In dit voorbeeld heb ik de knoppen cmdBla genoemd.

Of de control zelf mee geven aan je sub/functie...

code:
1
2
3
4
5
6
7
Sub knoptekst(ByRef oMyKnop as CommandButton, strMyText as string)
  oMyKnop.caption = myString
End Sub

'Aanroepen:
KnopTekst Command2, "Dit is een test"
KnopTekst Command3, "W00t! First post!"

[ Voor 112% gewijzigd door RobIII op 12-08-2004 12:51 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Klopt, je kunt geen concatenation doen op die wijze ter referentie aan een control. De control meegeven aan je subroutine (byref) of je controls in een array dumpen en eraan refereren met de index. Misschien heb je hier ook wat aan: VB HOWTO'tje

Verwijderd

Volgens mij kun je dit doen met:

Eval ("Forms!<Formuliernaam>!knop" & knopnr & ".caption = foo")

Ik heb iets dergelijks eerder voor elkaar gekregen, maar dat is al weer een tijdje geleden. suc6


-Edit-

Ik heb even gekeken, maar het is niet mogelijk om met Eval() eigenschappen van het object zelf aan te passen. Je kunt met Eval wel 'functies' van het object uitvoeren (bvb SetFocus) of vergelijkingen maken. Mischien een beetje knullige code, maar het werkt wel:

code:
1
2
3
4
Private Sub knoptekst(knopnr As Integer)
   Eval ("Forms!test!knop" & knopnr & ".setfocus")
   Me.ActiveControl.Caption = "foo"
End Sub

[ Voor 75% gewijzigd door Verwijderd op 12-08-2004 13:47 ]


  • Bud_s
  • Registratie: Maart 2002
  • Laatst online: 23-05 13:46
eeuhhh ... als je bedoelt om de waarde van de integer achter de string te plakken , probeer dan eens :

code:
1
Knop & format(KnopNr)


als je :
code:
1
Knop & str(KnopNr)

zou gebruiken, krijg je zo'n vervelende voorloopspatie

Ik gebruik een soortgelijke constructie om met een "For I = 1 to x" een SQL statement op te bouwen voor een x aantal "select Sum(veld) as Varx " op te bouwen en vervolgens
in een "array(x)" te proppen

[ Voor 37% gewijzigd door Bud_s op 12-08-2004 14:45 ]


  • thomrob
  • Registratie: Maart 2001
  • Laatst online: 22-05 12:22

thomrob

allround developer

ik gebruik de volgende soort code om dynamisch aan veldnamen te refereren

code:
1
2
3
4
5
dim i as integer
dim RS as recordset
for i =1 to 100
RS(("c") & (i)) = "de waarde die het veld uit de tabel moet krijgen"
next i


de tabel bevat in dit geval de veldnamen c1,c2,c3.....etc tot en met c100. Door de naamgeving van de velden te beeindigen met nummers is het mogelijk er met een loop doorheen te gaan (een soort van array heb je dan). Ik kan me herinneren dat ik aardig wat gezocht heb om de syntax hiervoor gevonden te krijgen maar het is erg nuttig.

Wat jij wil is dynamisch refereren aan een variabele en ik denk dat dit wel mogelijk moet zijn omdat een veld in een recordset evenals een variabele gewoon een object is waarnaar je door middel van naamgeving naar kunt verwijzen.

code:
1
dim Svar as Variable


iets in deze trant, ben nu even uit het uitproberen 8)7

[ Voor 40% gewijzigd door thomrob op 13-08-2004 00:14 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Toch leuk dat er nog steeds mensen zijn die denken dat het (makkelijk) kan ;) Trust me, maak er gewoon een Array van of geef het ByRef mee aan je functie...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

RobIII schreef op 12 augustus 2004 @ 12:46:
Dit kan niet (iig niet zonder terug te vallen op érg ranzige code :X ). Je kunt wel een array van controls gebruiken en een index meegeven.
in vbA?, nee geen controlarrays mogelijk (wel in vb).

code:
1
2
3
sub knoptekst(knopnr as integer)
  controls("knop" & cstr(knopnr)).caption=foo
EndSub

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op 13 augustus 2004 @ 00:55:
[...]


in vbA?, nee geen controlarrays mogelijk (wel in vb).

code:
1
2
3
sub knoptekst(knopnr as integer)
  controls("knop" & cstr(knopnr)).caption=foo
EndSub
Ik las toch echt VB6 |:(
My mistake 8)7

[ Voor 6% gewijzigd door RobIII op 13-08-2004 01:09 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1