Booleans als voorwaarde

Status
Niet open voor verdere reacties.

MaikBisschop

Gebruiker
Lid geworden
19 mrt 2018
Berichten
39
Hallo,

Ik ben bezig om een excelblad alleen invulbaar te maken d.m.v. userforms die openen bij het openen van het werkblad.

Nu heb ik drie textboxen en wil ik graag dat wanneer alle drie de textboxen, twéé of meerdere karakters bevatten, de CommandButton2 zichtbaar
wordt (De knop om naar de volgende userform te gaan).

Mijn idee was dan ook wanneer één van de textboxen ( TextBox1, TextBox2 of
TextBox3 ) meer dan twéé karakters bevat, de bijbehorende variabele "(Memory1, Memory2 of Memory3) "True" wordt. Dus bijvoorbeeld:

Code:
If Len(Me.Textbox1.Text) >= 2 Then
          Memory1 = True

Alleen werkt dit niet dus post ik hier mijn code, met de vraag hoe het wel kan.
(Alleen het stukje waar het om gaat)

Code:
Private Sub UserForm_initialize()

'///////////////////////////////////////

Dim Memory1 As Boolean
Dim Memory2 As Boolean
Dim Memory3 As Boolean
Dim Memory4 As Boolean

'///////////////////////////////////////

If Len(Me.TextBox1.Text) >= 2 Then
    Memory1 = True
        Else
    Memory1 = False
End If

If Len(Me.TextBox2.Text) >= 2 Then
    Memory2 = True
        Else
    Memory2 = False
End If

If Len(Me.TextBox3.Text) >= 2 Then
    Memory3 = True
        Else
    Memory3 = False
End If

'///////////////////////////////////////

If Memory1 = True And Memory2 = True And Memory3 = True Then
    CommandButton2.Enabled = True
        Else
    CommandButton2.Enabled = False
End If

'///////////////////////////////////////

End Sub

Ik werk +/- nog maar een week met VBA, en heb nog niet de nodige kennis om te zien waar het misgaat.
Ik hoop dat jullie mij kunnen helpen!

Met vriendelijke groet,
Maik Bisschop
 
zet deze code eens in het change event van alle 3 textboxen.

Als is het natuurlijk wel een moeilijke manier van werken.

deze in alle drie de Textbox_Change events moet genoeg zijn:

Code:
If Len(TextBox1) > 1 And Len(TextBox2) > 1 And Len(TextBox3) > 1 Then 
        CommandButton2.Enabled = True
Else
        CommandButton2.Enabled = False
End if
 
Laatst bewerkt:
Bedankt voor uw snelle reactie!

Ik weet dat de door u geplaatste code werkt, alleen zou ik graag willen weten waarom de mijne niet werkt.
Vooral omdat er nog meerdere 'soorten' voorwaarden bij komen bijvoorbeeld:

- Er moet een optie geselecteerd zijn in een ListBox
- Bepaalde 'checkboxes' moeten aangevinkt zijn
- E.v.t verdere uitbereidingen

Mijn Bedoeling was om de eindvoorwaarde, van opgesomde variabelen te maken. Dit omdat het zo in
mijn ogen makkelijker uit te bereiden en je heel makkelijk verschillende voorwaarden kunt combineren.

U wordt hartelijk bedankt voor uw reactie, maar ik zou graag op 'mijn' manier verder willen bouwen.

Met vriendelijke groet,
Maik Bisschop
 
Laatst bewerkt:
jouw code werkt mits je ze in elk betrokken change event plaatst. In een initialize_event zal er niets mee gebeuren.
 
De code die ik gepost heb staat in een 'initialize event', om de bestaande waarden in de cellen die gekoppeld zijn aan de textboxes te initialiseren bij
het openen van de userform. (anders gaat de voorwaarde volgens mij pas gelden bij het aanpassen van een texbox). Ik had de code al in elke 'change event'
staan, alleen reageert mijn commandbutton nergens op.

Hierbij mijn volledige code:

Code:
[B]Private Sub UserForm_initialize()[/B]

'///////////////////////////////////////

ListBox1.AddItem "Multibake® D"     'Add products to ListBox1
ListBox1.AddItem "Multibake® I"
ListBox1.AddItem "Multibake® I HT"
ListBox1.AddItem "Multibake® R"
ListBox1.AddItem "Multibake® H"

'///////////////////////////////////////

TextBox1.Value = Sheets("Fill-in sheet").Range("D6").Value      'Initialize value of cell D6 on "Fill-in sheet"
TextBox2.Value = Sheets("Fill-in sheet").Range("D7").Value      'Initialize value of cell D7 on "Fill-in sheet"
ListBox1.Value = Sheets("Fill-in sheet").Range("D9").Value      'Initialize value of cell D9 on "Fill-in sheet"
TextBox3.Value = Sheets("Fill-in sheet").Range("D10").Value     'Initialize value of cell D10 on "Fill-in sheet"

'///////////////////////////////////////

Dim Memory1 As Boolean
Dim Memory2 As Boolean
Dim Memory3 As Boolean
Dim Memory4 As Boolean

'///////////////////////////////////////

If ListBox1.ListIndex = -1 Then     'Label 6 shows selected product
    Label6.Caption = "None"
        Else
    Label6.Caption = ListBox1.Value
End If

'///////////////////////////////////////

If Len(Me.TextBox1.Text) > 1 Then
    Memory1 = True
        Else
    Memory1 = False
End If

If Len(Me.TextBox2.Text) > 1 Then
    Memory2 = True
        Else
    Memory2 = False
End If

If Len(Me.TextBox3.Text) > 1 Then
    Memory3 = True
        Else
    Memory3 = False
End If

If ListBox1.ListIndex = -1 Then
    Memory4 = True
        Else
    Memory4 = False
End If

'///////////////////////////////////////

If Memory1 = True And Memory2 = True And Memory3 = True And Memory4 = True Then
    CommandButton2.Enabled = True
        Else
    CommandButton2.Enabled = False
End If

'///////////////////////////////////////

[B]End Sub[/B]

'//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[B]Private Sub CommandButton1_Click()[/B]

'///////////////////////////////////////

UserForm2.Hide      'Hide UserForm2 when CommandButton1 is pressed
UserForm1.Show      'Show UserForm1 when CommandButton1 is pressed

'///////////////////////////////////////

[B]End Sub[/B]

'//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[B]Private Sub CommandButton2_Click()[/B]

'///////////////////////////////////////

Sheets("Fill-in sheet").Range("D6").Value = TextBox1.Value      'Text from TextBox1 will be displayed in cel D6 on "Fill-in sheet", when CommandButton2 is pressed
Sheets("Fill-in sheet").Range("D7").Value = TextBox2.Value      'Text from TextBox2 will be displayed in cel D7 on "Fill-in sheet", when CommandButton2 is pressed
Sheets("Fill-in sheet").Range("D9").Value = ListBox1.Value      'Text from ListBox1 will be displayed in cel D9 on "Fill-in sheet", when CommandButton2 is pressed
Sheets("Fill-in sheet").Range("D10").Value = TextBox3.Value     'Text from TextBox3 will be displayed in cel D10 on "Fill-in sheet", when CommandButton2 is pressed

'///////////////////////////////////////

UserForm2.Hide      'Show UserForm 4 when CommandButton2 button is pressed
UserForm3.Show      'Hide UserForm 3 when CommandButton2 button is pressed

'///////////////////////////////////////

[B]End Sub[/B]

'//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[B]
Private Sub ListBox1_Click()[/B]

'///////////////////////////////////////

Label6.Caption = ListBox1.Value    'Selected value from ListBox1 is shown in Label6

'///////////////////////////////////////

[B]End Sub[/B]

'//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[B]Private Sub TextBox1_Change()[/B]

'///////////////////////////////////////

Dim Memory1 As Boolean

If Len(Me.TextBox1.Text) > 1 Then
    Memory1 = True
        Else
    Memory1 = False
End If

If Memory1 = True And Memory2 = True And Memory3 = True And Memory4 = True Then
    CommandButton2.Enabled = True
        Else
    CommandButton2.Enabled = False
End If

'///////////////////////////////////////
[B]
End Sub[/B]

'//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[B]Private Sub TextBox2_Change()[/B]

'///////////////////////////////////////

Dim Memory2 As Boolean

If Len(Me.TextBox2.Text) > 1 Then
    Memory2 = True
        Else
    Memory2 = False
End If

If Memory1 = True And Memory2 = True And Memory3 = True And Memory4 = True Then
    CommandButton2.Enabled = True
        Else
    CommandButton2.Enabled = False
End If

'///////////////////////////////////////

[B]End Sub[/B]

'//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[B]Private Sub TextBox3_Change()[/B]

'///////////////////////////////////////

Dim Memory3 As Boolean
    
If Len(Me.TextBox3.Text) > 1 Then
    Memory3 = True
        Else
    Memory3 = False
End If

If Memory1 = True And Memory2 = True And Memory3 = True And Memory4 = True Then
    CommandButton2.Enabled = True
        Else
    CommandButton2.Enabled = False
End If

'///////////////////////////////////////

[B]End Sub[/B]

'//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[B]Private Sub ListBox1_Change()[/B]

'///////////////////////////////////////

If ListBox1.ListIndex = -1 Then
    Memory4 = True
        Else
    Memory4 = False
End If

If Memory1 = True And Memory2 = True And Memory3 = True And Memory4 = True Then
    CommandButton2.Enabled = True
        Else
    CommandButton2.Enabled = False
End If

'///////////////////////////////////////
[B]
End Sub[/B]

'//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[B]Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)[/B]

'///////////////////////////////////////

If CloseMode <> 1 Then Cancel = 1     'Prevent users from closing with the Close box in the title bar
MsgBox "Please fill in all forms first!", vbCritical

'///////////////////////////////////////

[B]End Sub[/B]
 
Tja, als je een klein deel van je code plaatst is een goed antwoord lastig, maar plaats je bestand eens.
 
dat zag ik ook, maar om de code te testen is een userform in een bestand wel handig. En dat ga ik in ieder geval niet nabouwen.
 
Wat je precies wil bereiken kan ik uit de code niet opmaken. Als je variabelen op meerdere plekken wil gebruiken dan zal je deze op een hoger niveau moeten plaatsen/declareren. Voor wat ik er van heb kunnen maken.

Code:
Dim ar, ar1

Private Sub UserForm_initialize()
  ListBox1.List = Array("Multibake® D", "Multibake® I", "Multibake® I HT", "Multibake® R", "Multibake® H")
  CommandButton2.Enabled = False
  ar = Sheets("Fill-in sheet").Range("D6:D10")
  ar1 = Split("TextBox1 TextBox2 ListBox1 TextBox3")
  For j = 0 To UBound(ar1)
    Me(ar1(j)).Value = ar(j + 1 - (j > 1), 1)
  Next j
End Sub

Sub VenA()
  For Each it In ar1
    If Len(Trim(Me(it).Value)) > 0 Then t = t + 1
  Next it
  CommandButton2.Enabled = t = 4
End Sub

Private Sub TextBox1_Change()
  VenA
  ar(1, 1) = TextBox1.Value
End Sub

Private Sub TextBox2_Change()
  VenA
  ar(2, 1) = TextBox2.Value
End Sub

Private Sub ListBox1_Change()
  VenA
  ar(4, 1) = ListBox1.Value
End Sub

Private Sub TextBox3_Change()
  VenA
  ar(5, 1) = TextBox3.Value
End Sub

Private Sub CommandButton2_Click()
  Sheets("Fill-in sheet").Range("D6:D10") = ar
End Sub
 
Laatst bewerkt:
Vena bedankt voor uw reactie, maar dit moet ook voor mij overzichtelijk blijven. Deze werkmap gaat deel uitmaken van het
automatiseringsproces van 3D offertetekeningen (Dus gaat iets verder dan dat ik hier zo makkelijk uit kan leggen).

SjonR, bij deze het geëxporteerde userform.

Bekijk bijlage Userform2.zip
 
Wat is er onoverzichtelijk aan gestructureerde code zonder al die hinderlijke commentregels met //////? Heb je de code getest? Aan een export van jouw userform hebben we niet zoveel. Een paar textboxen een listbox en een commandbutton kent iedere helper hier wel. Het onderliggende bestand met daarin fictieve data en alle userforms lijkt mij een beter antwoord op de reactie van @SjonR in #8.
 
VenA,

zoals ik eerder aangaf ben ik totaal onbekend met vba. Ik heb er geen boeken over o.i.d. alleen het internet.
Ik ben ook geen programmeur, dus is het voor mij handig dat ik het opgebouwd heb op een manier die ik ook begrijp.
Dus ik zeg niet dat je code onoverzichtelijk is, maar dat het voor mij onoverzichtelijk is.
 
Probleem is opgelost. Lag niet aan mijn code, maar door een fout in een andere userform werkte deze ook niet naar behoren.
Code heb ik inmiddel versimpelt en verduidelijkt, waardoor ik met mijn huidige kennis het toch goed begrijp.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan