Controle Combo en TextBoxen op geen waarde

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Yellow.

Onderstaand een code om te controleren of de textboxen leeg zijn of niet. Indien er textboxen leeg zijn, wordt het aantal in een msgbox vermeld en na het klikken op OK, wordt de eerst lege textbox geselecteerd.

Dit gaat goed. Echter er staan ook nog 2 comboboxen om te controleren. ComboBox3 en ComboBox4.

Ik weet niet zo goed hoe dit in te passen. Ik zat te denken aan een extra For, maar dit gaat niet werken. Tenminste niet op de wijze die ik in gedachte heb. Daarnaast is het ook nog eens zo dat het selecteren nu slechts voor een TextBox is.

Kan iemand mij een aanzet geven?

Alvast bedankt.

Code:
    Dim j As Long
    Dim Counter As Long
    
    Counter = 0
    
    For i = 2 To 5
        If Controls("TextBox" & i).Value = vbNullString Then
            Counter = Counter + 1
            If j = 0 Then j = i
        End If
    Next i
    
    If Counter <> 0 Then
        MsgBox "U heeft " & Counter & IIf(Counter <> 1, " verplichte velden", " verplicht veld") & " niet ingevuld"
        Controls("TextBox" & j).SetFocus
        Exit Sub
    End If
 
Probeer het eens zo:
Code:
    Dim j As Long
    Dim Counter As Long
    
    Counter = 0
    
    For i = 2 To 5
        If i = 3 Or i = 4 Then
            If Controls("ComboBox" & i).Value = vbNullString Then
                Counter = Counter + 1
            End If
        End If
        If Controls("TextBox" & i).Value = vbNullString Then
            Counter = Counter + 1
            If j = 0 Then j = i
        End If
    Next i
    
    If Counter <> 0 Then
        MsgBox "U heeft " & Counter & IIf(Counter <> 1, " verplichte velden", " verplicht veld") & " niet ingevuld"
        Controls("TextBox" & j).SetFocus
        Exit Sub
    End If

Dan heb je in ieder geval het juiste aantal.
Je weet dan alleen niet of de lege control een TextBox, ComboBox of misschien wel beiden was.
 
Laatst bewerkt:
Edmoor.

Of het beide is maakt niet uit. Immers de eerste lege control moet worden geselecteerd. De cursor in een TextBox of ComboBox verraadt dan om welke Control het gaat.

Wat ik denk ik kan doen is bij beide For loops ook het type Control apart als bijvoorbeeld X declareren. Zodra deze eenmaal zijn gedeclareerd dan zou dit bij de volgende niet meer mogen uitmaken.

Vervolgens kan ik, denk ik, dan middels: Controls(X & j).SetFocus, de juiste control selecteren. Of ik moet iets over het hoofd zien.
 
Even snel opgezet, maar nog niet getest.

Code:
    Dim J As Long
    Dim Counter As Long
    Dim X As String

    Counter = 0
    
    For i = 2 To 5
        If i = 3 Or i = 4 Then
            If Controls("ComboBox" & i).Value = vbNullString Then
                Counter = Counter + 1
                
                If J = 0 And X = vbNullString Then
                    J = i
                    X = "ComboBox"
                End If
            End If
            
            If Controls("TextBox" & i).Value = vbNullString Then
                Counter = Counter + 1
                
                If J = 0 And X = vbNullString Then
                    J = i
                    X = "TextBox"
                End If
            End If
        End If
    Next i
    
    If Counter <> 0 Then
        MsgBox "U heeft " & Counter & IIf(Counter <> 1, " verplichte velden", " verplicht veld") & " niet ingevuld"
        Controls(X & J).SetFocus
        Exit Sub
    End If
 
Code:
Sub M_snb()
  for j=1 to 5
    y=y*(me("textbox" & j).text<>"")
    if j<3 then y=y*(me("combobox" & j).listindex>-1)
  next

  knop_vervolg.visible=y
End Sub
 
# Edmoor,
Na een heerlijk ziek bedje kom ik terug op mijn vraag.

Ik kom uit op onderstaande code.

Code:
    Dim J As Long
    Dim Counter As Long
    Dim U As String
    
    Counter = 0
    
    For i = 3 To 4
        If Controls("ComboBox" & i).Value = vbNullString Then
            Counter = Counter + 1
                
            If J = 0 Then
                J = i
                U = "ComboBox"
            End If
        End If
    Next i
    
    For i = 2 To 5
        If Controls("TextBox" & i).Value = vbNullString Then
            Counter = Counter + 1
            
            If J = 0 Then
                J = i
                U = "TextBox"
            End If
        End If
    Next i
    
    If Counter <> 0 Then
        MsgBox "U heeft " & Counter & IIf(Counter <> 1, " verplichte velden", " verplicht veld") & " niet ingevuld"
        Controls(U & J).SetFocus
        Exit Sub
    End If

Ik heb nu 2 x een For functie gebruikt. Dit kan volgens mij ook anders, maar dat laat ik graag aan jou over.

In jouw code werd telkens TextBox2 geselecteerd. Dit terwijl de comboboxen erboven ook leeg waren. Middels bovenstaande heb ik wel het resultaat.

Wel een puntje. Middels deze code worden alle controls in het userform bekeken. Dit terwijl dit stukje in een multipage staat en wel op het eerste blad hiervan. Hierom dacht ik eerder aan: For Each ctr in Me.MultiPage1.Pages(0).Controls, waarvan ctr als Control was gedeclareerd, maar dat werd hem niet. Misschien dat jij hier een oplossing voor weet.

Ik hoor graag van je.
 
Laatst bewerkt:
Misschien kun je hier verder op borduren.
Code:
Dim ctr As Control
For Each ctr In MultiPage1.Pages(0).Controls
If TypeName(ctr) = "TextBox" Or TypeName(ctr) = "ComboBox" Then MsgBox ctr.Name
Next ctr
 
Heb je een speciale reden om andere helpers te negeren ?
 
@snb,

Nee absoluut niet. Ik ben gewoon erg druk. Ik heb jouw code gelezen en ik dacht dat ik hier ook op had gereageerd, maar als ik zo terug lees dan zie ik die reactie van mij aan jou er niet bij staan. Ik vermoed dat ik toen iets verkeerd heb gedaan. Mijn excuus. Het is in ieder geval niet bewust gebeurd.

Mijn reactie aan jou van toen was, wat jij met die code doet. Immers ik zie iets van een knop.visible = y ,staan. Ik heb slechts een knop die alles invoert en vooraf controleert op lege velden. Daarnaast had ik jou ook in die reactie bedankt. Ik hoor uiteraard graag van jou. Al zijn jouw codes voor mij vaak een puzzel op zicht, maar dat is het verschil tussen een ver gevorderd en een vergeleken met jou, een redelijk gevorderd persoon. Ik blijf mij verbazen in jouw oplossingen en jouw korte codes.

@HSV.
Zover kwam ik dus ook en ik had deze ook veel verder. Echter ik kreeg hem niet werkend. Dit omdat ik de voorwaarden en vergelijkingen zoals in mijn uiteindelijke code, hier niet in kreeg verwerkt. Op de 1 of andere wijze werd er niet geteld en werd er ook niet het eerst lege veld gekozen. Kan uiteraard ook zijn dat ik de outer-For en de inner-For niet goed schrijf. Ik zal eens kijken of ik hem nog kan terugschrijven zodat jij eventueel zelf kunt zien waar het in mis ging. Ik zeg eerlijk ik heb mij nog niet echt verdiept in For in een For. Het mag mij dan wel eens gelukt zijn, maar ten eerste die code was enorm simpel en ten tweede zal er ook sprake zijn van beginnersgeluk. Ook de For Each is mij nog niet helemaal duidelijk.

Zelf ben ik van mening dat als men hier enkel maar een vraag stelt en daarbij zelf niet met een code aankomt men het in feite maar overlaat aan een ander. Men leert dan niets. Zodra men een code plaatst met daarbij de vraag, dan zie je aan de code vanzelf wel of diegene zich ook daadwerkelijk zelf ook inzet. Dan kun je leren van fouten en of andere manieren. Zodra men hier voor het eerst is en echt totaal niets weet dan is het logisch, maar op den duur, mag je toch wel verwachten dat iemand ook eigen initiatief toont.
 
@HSV,

Ik heb even snel zitten terugdenken.

Na jouw code, welke ik ook had, kwam ik vervolgens met For i = 2 To 5
Daarna kreeg ik een probleem omdat de eerste die gevonden werd, een lege TextBox2 was. Deze werd anders dan ik net schreef wel geselecteerd. Dit terwijl de ComboBoxen als eerste staan. Als je in mijn code kijkt dan bestaat er geen ComboBox2 in de MultiPage. Ik was vervolgens gaan goochelen met If ctr.Value = vbNullString. Zodra dit dan het geval was dan zou dit de eerste moeten zijn, maar waar liep ik op vast... i = 2. Hier begint de code namelijk mee en zoekt vervolgens dan naar een control met een 2 wat telkens TextBox2 als resultaat gaf.

Eigenlijk had er dan eerst moeten worden gekeken naar de comboboxen, maar dat lukte mij uiteindelijk met mijn eigen oplossing. Twee lossen For-functies.

Ben ik nu zelf erg cryptisch of snap je een beetje waar ik met mijn verhaal heen wil gaan.

Wat ik in feite nog steeds wil bereiken is dat de eerst lege control de For bepaald. Dus in geval van een TextBox: i = 2 To 5 en in het geval van een ComboBox: i = 3 To 4.
Vanaf hier ging ik gaan dwalen omdat ik die bepaling er niet in kreeg. Ik goochelde in de For Each met: If ActiveControl.Value = vbNullstring and TypeName(ctr) = "TextBox" dan i = 2 To 5 Then........ Dit deed ik ook in het geval van een ComboBox. Toen werd ik het zat en koos ik radicaal voor een nieuwe opzet welke ik reeds heb geplaatst.

Edit: Wat ik wel vreemd vind is als volgt. Ik heb de For Each ctr .... wel gebruikt onder de RESET knop. Deze knop heeft als doel alle text en comboboxen te legen en daarna ComboBox3 weer te selecteren. Ook wordt deze aangeroepen zodra er een nieuwe invoer is afgerond. In deze code werd ctr.Value = vbNullString weer wel geaccepteerd.

Mijn idee is nu eigenlijk dat ctr.Value = vbNullString in mijn controle code dan helemaal niet kan werken en dat er op een andere wijze moet worden gekeken of de ctr leeg is, Ja of Nee.

Code:
Private Sub Reset()
    Dim ctr As Control
    
    For Each ctr In MultiPage1.Pages(0).Controls
        If TypeName(ctr) = "TextBox" Or TypeName(ctr) = "ComboBox" Then ctr.Value = vbNullString
    Next ctr
    
    With ComboBox4
        .Clear
        .Enabled = False
    End With
    
    ComboBox3.SetFocus
    
End Sub
 
Laatst bewerkt:
@ snb,

Mag ik jou vragen waarom jij TextBox1.Text gebruikt in plaats van TextBox1.Value. Wat ik hier het verschil in?

Je hebt al eens eerder geschreven dat een TextBox is voor Tekst, maar een tekst kan toch ook een Value zijn?
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan