fout in stukje code

Status
Niet open voor verdere reacties.

tinie

Gebruiker
Lid geworden
18 apr 2008
Berichten
10
Goeiedag,

Het wil me maar niet lukken om deze code zonder foutmelding te maken. De fout krijg ik altijd bij deze regel: If UserForm2.Controls("tekst" & i) = True Then
Die (tekst & i) is een variabele met de waarden true or false die gebruikt wordt bij Userform2.



Code:
dim i as integer

For i = 1 To 20 step 2
 If UserForm2.Controls("tekst" & i) = True Then
  Me.Controls("Userform2.commandbuttonok" & i).Caption = "niet ok"
   Cells(6 + i, 2).Value = txtbtitel.Value
If txtbopp.Visible = True Then
   Cells(6 + i, 3).Value = txtbopp.Value
 End If
thx
 
Laatst bewerkt door een moderator:
zip je xls file en plaats ze hier, we kunnen de code dan onmiddellijk testen zonder eerst alle nodige forms & controls aan te maken.
Scheelt een hoop typwerk en foutieve foutmeldingen :o
 
hallo,
Ik heb het een klein beetje makkelijker gemaakt, anders zou ik een te groot excelbestand moeten invoegen, maar het principe is hetzelfde.

Dank u
 

Bijlagen

Noetie

Waarom staat er een lus van 1 tot 20 als je maar 1 knop op je userform1 hebt staan?

Begrijp wel wat je in je code doet?

Wil je op de publieke variabele tekst testen, of wat?

Wigi
 
wigi,
Dit stukje code die ik doorgestuurd heb is maar een klein deeltje van mijn bestand. Normaal heb ik een heleboel knoppen op mijn Userform1, wanneer ik op iedere knop1 klik staat er daarbij tekst1 =true enzovoort. Via die knoppen kom ik ook op een userform2 terecht. Wanneer ik dan op die userform2 op de ok knop druk. dan moet voor die ene knop van userform1 gegevens toegevoegd worden op het excelblad. Dit mag dus enkel gebeuren wanneer tekst1=true. Als ik bijvoorbeeld op knop3 druk op userform1 dan staat er daarbij tekst3=true. Dan zit ik terug op userform2, als ik dan daar op knop ok druk, dan moeten er gegevens toegevoegd worden op het excelblad, maar enkel en alleen als tekst3=true is. enzovoort

Ik wil dus een for lus plaatsen met "tekst" & i, zoals je kan zien op het file. Maar die uitdrukking If UserForm2.Controls("tekst" & i) = True Then wil gewoon niet werken.

Dank u
 
Begrijp ik het goed dat je een control gebruikt als een variabel?
De "tekstx" control op userform1 gebruik je eigenlijk om te weten door wie je op userform2 geraakt bent en overeenkomstig wenst te handelen.

Ken je class modules, global variabelen ?? Die heb je nodig.

Definieer 20 global variabelen
Code:
Global blnButton1   As Boolean
Global blnButton2   As Boolean
enz..

Zet blnButton1 bij het click event van cmdButton1
Zet blnButton2 bij het click event van cmdButton2 enz..

Bij verlaten van userform2 moet je handelen volgens de boolean die hoog staat.



Ipv van 20 booleans te declareren zou je ook één long kunnen declareren
Code:
Global lngButtons   As Long
en in het click event van elke knop een macht van 2 invullen in lngButtons volgens de knop.
Knop1 = 2 macht 0 = 1
Knop2 = 2 macht 1 = 2 enz..

Bij verlaten van userform2 moet je handelen volgens de waarde in lngButtons.
 
idd dit is hetgene wat ik wilde vragen. Nu die class module en global variable is nieuw voor mij. Maar ik heb eens gedaan wat jij zei:

- Een class module toevoegen daarin heb ik global tekst1 as boolean geplaatst
Daarin geeft hij al een compileerfoutmelding: Constanten, reeksen met een vaste lengte, door een gebruiker gedefinieerde typen endeclare-instructies zijn niet toegestaan als openbare leden van objectmodules

- Ik heb dan global tekst1 as boolean in een gewone module toegevoegd, maar toch geeft hij dan weer die compileerfout bij de lijn van userform2: If UserForm2.Controls("tekst" & i) = True Then

Toch bedankt met jullie hulp allemaal
 
Sorry voor de verwarring :o
Het was
OF een global class module met vb naam "clsSettings"
OF global variables in een module met vb naam "modMain"


Ik denk dat je twee zaken met elkaar verward, ofwel heb ik het nog niet helemaal door.
"Tekst1" wat is dat nu ? Een control of een global variabele?
Want met
Code:
global tekst1 as boolean
heb je een variabele
en met
Code:
If UserForm2.Controls("tekst" & i) = True Then
zit je controls op te vragen :mad: :confused:



Dit is een vb van een class module, slechts klein aantal variabelen overgenomen.
Code:
Option Explicit

Dim mvarDatabaseName    As String
Dim mvarProvider        As String
Dim mvarDataToSave      As Boolean



Property Get DatabaseName()
    DatabaseName = mvarDatabaseName
End Property
Property Let DatabaseName(NewValue)
    mvarDatabaseName = NewValue
End Property


Property Get Provider()
    Provider = mvarProvider
End Property
Property Let Provider(NewValue)
    mvarProvider = NewValue
End Property


Property Get DataToSave()
    DataToSave = mvarDataToSave
End Property
Property Let DataToSave(NewValue)
    mvarDataToSave = NewValue
End Property

Bij het opstarten van je applicatie declaratie en aanmeken van de class module "Variables"
Code:
Global Variables                As clsVariables

    'Referentie naar class Variables
    Set Variables = New clsVariables
    Variables.Provider = "Microsoft.JET.OLEDB.4.0"

Door het feit dat de class global is, kan je ze over alle userforms, in alle code gebruiken.
Code:
    If CheckDatabase(Variables.DatabasePath & Variables.DatabaseName) = True Then
.

Op het einde van je code de referenties opkuisen met
Code:
    'Verwijderen referenties
    Set Variables = Nothing


Als laatste een tip om je code vééééééééél leesbaarder te maken voor anderen: Gebruik drie letters voor elke variabel, control, ........ die aangeeft waarover het gaat. Een volledig lijst is ergens bij MS wel terug te vinden.
str = String
bln= Boolean
lng= Long
dbl= Double
cmd= Knop
txt= Tekstvak
opt= Option buttons enz.....
 
oké daar ben ik dus gemist.
Nog eventjes ter verduidelijking. Mijn eerste stukje code was dit en dit werkte wel.

Code:
Public Sub okknop1_Click()
If tekst1 = True Then
okknop1.Caption = "niet ok knop"
End If
End Sub

Maar doordat ik dus een heleboel knoppen had, wilde ik met een for lus werken. Daardoor moest ik dus een i bij plaatsen waardoor mijn code veranderde naar:

Code:
Public Sub okknop1_Click()
For i = 1 To 20 Step 2
If "tekst" i = True Then
Me.Controls("okknop1" & i).Caption = "niet ok knop"
End If
Next i
End Sub

Maar met die for lus nam hij altijd aan dat die "tekst" i = false, waardoor ik dus naar iets anders probeerde te zoeken. Dus probeerde ik met een controls ervoor. Maar idd doordat het een variable is kun je dit niet toepassen.

Maar nu moet ik wel nog iets anders kunnen vinden i.p.v. die controls. Ik ga mijn probleem nu eens heel simpel schetsen met een module, mss had ik dit wel wat eerder moeten doen.

Code:
Sub uittesten()
Dim tekst1 As Boolean

tekst1 = True
i = 1
If ("tekst" & i) = True Then
MsgBox "azer"
End If

End Sub

Deze lijn: If ("tekst" & i) = True Then herkent hij als false terwijl ik hem daarstraks al true gemaakt heb.

Bedankt
 
Laatst bewerkt:
oké, kheb het eindelijk gevonden, het enige wat ik moest doen was die "tekst" veranderen in gewoon tekst (dus zonder die " ")

Mag dicht dus
Merci
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan