• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

in listbox selecteren geeft foutmelding

Status
Niet open voor verdere reacties.

Andre175

Gebruiker
Lid geworden
2 feb 2018
Berichten
351
goedeavond allen


Ik zie het niet meer waar het nu fout gaat.
3 comboxen, keuze 1, keuze 2 en keuze 3.

bij keuze 1 wordt de listbox gefilterd op keuze 1
bij keuze 2 wordt listbox verder gefilterd op keuze 2
Als er bij keuze 3 maar 1 optie overblijft, worden de 6 textboxen automatisch gevuld met de juiste gegevens.

Als er na keuze 3, keuze 1 opnieuw een keuze gemaakt wordt, wordt de rest gereset en kunnen keuze 2 en 3 opnieuw gemaakt worden.
Als er na keuze 2 de gevonden waarden in de listbox geselecteerd worden, dan worden alle boxen met de juiste waarde gevuld.

tot zover alles oké....

HET PROBLEEM.......
wanneer er na keuze 1 (bijvoorbeeld klant 3), en keuze 2 en 3 blijven leeg, in de listbox geklikt wordt komt er een foutmelding in de sub ListBox_Click
of wanneer er gelijk in de listbox geclickt wordt, zonder eerst een keuze te maken mbv een combobox.....
Foutmelding is dan "kan de eigenschap Column niet verkrijgen....."

Ik had het idee om de Change_events uit te schakelen wanneer er een Listbox_Click is....
maar kom daar ook niet verder mee.

Kan iemand mij de goede richting op sturen?


Bekijk bijlage keuze123_listbox_click.xlsb
 
Laatst bewerkt:
Die foutmelding wordt gegeven als de array waarmee je listbox.column wilt vullen leeg is.
 
Dat vermoeden had ik ook, echter in de listbox wordt een regel geselecteerd waar toch echt waarden in staan.


Wordt er namelijk alleen met CB1 een keus gemaakt en dan in de listbox geklikt, dan komt de foutmelding bij CB3.Value = ListBox1.Column(3)
Wordt en geen keus gemaakt met een combobox, en dan in de listbox geklikt, dan komt de foutmelding bij CB2.Value = ListBox1.Column(2)
Code:
Private Sub ListBox1_Click()

    
    CB1.Value = ListBox1.Column(1)
    CB2.Value = ListBox1.Column(2)
    CB3.Value = ListBox1.Column(3)
    
    For j = 4 To 9
    Me("TB" & j - 3).Value = ListBox1.Column(j)
    Next
    
End Sub
Vandaar dat ik dacht dat ik de Change event van de comboxen moest voorkomen voordat de boxen met de geselecteerde gegevens gevuld worden, zodra er in de listbox iets aangeklikt wordt.

Met de info van de site van JKPieterse heb ik het 1 en ander geprobeerd, helaas zonder resultaat.
 
Leer eerst eens rekenen/tellen en de basisbeginselen van Ubound en Lbound en dan zowel voor een array, listbox en combobox. Dit gaat natuurlijk nooit werken als jj+y < 9

Code:
For jj = 4 To 9
 Me("TB" & jj - 3).Value = sn(j, jj + y)
Next
 
Goedemiddag.

Ik moet eerlijk toegeven dat ik alle basisbeginselen niet volledig beheers, ik ben ook op zoek naar een goed boek over VBA.
Lezen uit een boek vind ik een stuk makkelijker als het gaat om leerstof.
Ik probeer ook steeds alles uit te zoeken waarom iets gaat zoals het gaat.
Naar mijn gedachten gaat onderstaande goed
Code:
For jj = 4 To 9
 Me("TB" & jj - 3).Value = sn(j, jj + y)
Next
immers Me("TB" & jj-3) --> bij jj=4 --> wordt het TB1
bij jj=5 --> wordt het TB2
enz.
bij sn(j, jj + y) ----> j is voor rij aanduiding
jj+y voor kolom aanduiding

bij jj = 4 wordt TB1 voorzien van de waarde uit kolom 5 (kolom E)

De code die ik tot nu toe had, is mede door SNB verkregen, ik heb deze alleen uitgebreid van 3 textboxen naar 6.
En het filteren van de listbox na het maken van een keuze heb ik toegevoegd.

Met uitzondering van het selecteren in de listbox zonder dat keuze 1 en 2 gemaakt zijn werkt het zoals bedoeld.

Code:
Dim sn, y
[COLOR="#00FF00"]Public NoEvents As Boolean[/COLOR]

Private Sub UserForm_Initialize()
    sn = ActiveSheet.Cells(1).CurrentRegion
    y = Abs(sn(1, 1) = "ID")
    With CreateObject("scripting.dictionary")
        For j = 2 To UBound(sn)
            x0 = .Item(sn(j, 1 + y))
        Next
        
        CB1.List = .keys
    End With

    ListBox1.List = [Tabel].Value
    
End Sub

Private Sub CB1_Change()
    CB2.ListIndex = -1
    CB3.ListIndex = -1
    If CB1.ListIndex > -1 Then CB2.List = F_lijst(1)
    
        ListBox1.List = [Tabel].Value
         
        For i = ListBox1.ListCount - 1 To 0 Step -1
                If InStr(1, ListBox1.List(i, 1), CB1, vbTextCompare) = 0 Then ListBox1.RemoveItem (i)
        Next
End Sub

Private Sub CB2_Change()
    CB3.ListIndex = -1
    If CB2.ListIndex > -1 Then CB3.List = F_lijst(2)
'    If CB3.ListCount = 1 Then CB3.ListIndex = 0
    
        ListBox1.List = [Tabel].Value
         
        For i = ListBox1.ListCount - 1 To 0 Step -1
                If InStr(1, ListBox1.List(i, 1), CB1, vbTextCompare) = 0 Then ListBox1.RemoveItem (i)
        Next
        For i = ListBox1.ListCount - 1 To 0 Step -1
                If InStr(1, ListBox1.List(i, 2), CB2, vbTextCompare) = 0 Then ListBox1.RemoveItem (i)
        Next
End Sub

Private Sub CB3_Change()


    If CB3 = vbNullString Then
    For jj = 1 To 6
        Me("TB" & jj).Value = vbNullString
    Next
    Exit Sub
    
    End If
    
    If CB3.ListIndex = -1 Then Exit Sub
    
    c01 = CB1.Value & CB2.Value & CB3.Value
    For j = 1 To UBound(sn)
        If sn(j, 1 + y) & sn(j, 2 + y) & sn(j, 3 + y) = c01 Then Exit For
    Next
    
    For jj = 4 To 9
        Me("TB" & jj - 3).Value = sn(j, jj + y)
    Next
End Sub

Function F_lijst(x)
    For j = 1 To UBound(sn)
        For jj = 1 To x
            If sn(j, jj + y) <> Me("CB" & jj).Value Then Exit For
        Next
        If jj = x + 1 And InStr(c01 & "|", "|" & sn(j, jj + y) & "|") = 0 Then c01 = c01 & "|" & sn(j, jj + y)
    Next
    F_lijst = Split(Mid(c01, 2), "|")
End Function

Private Sub ListBox1_Click()
    
    [COLOR="#00FF00"]AbortChangeEvent = True[/COLOR]
    
    CB1.Value = ListBox1.Column(1)
    CB2.Value = ListBox1.Column(2)
    CB3.Value = ListBox1.Column(3)
    
'    For j = 4 To 9
'    Me("TB" & j - 3).Value = ListBox1.Column(j)
'    Next

    [COLOR="#00FF00"]AbortChangeEvent = False[/COLOR]
    
End Sub

Wanneer keuze 1 en/of 2 niet gemaakt zijn en er wordt iets geselecteerd in de listbox gaat het fout.
Stel: geen enkele keuze wordt gemaakt en een regel in de listbox wordt geselecteerd. Dan zal als eerste de waarde van CB1 wijzigen waardoor Private Sub CB1_Change() in werking treed. Hierdoor wordt de inhoud van de listbox gewijzigd en loopt de code in Private Sub ListBox1_Click() vast.
Vandaar dat ik in Private Sub ListBox1_Click() het Change Event tijdelijk wil uitschakelen. (groen gemarkeerde code)
Tot nu toe nog zonder succes.

Ben ik nu in de goede richting aan het denken of probeer ik nu iets te doen wat niet mogelijk is?
Hier heb ik ook het 1 en ander gelezen over het beheersen van events.

Bekijk bijlage keuze123_listbox_click.xlsb
 
Laatst bewerkt:
Helder moment?????
Het zal geen programmeertaal hoogstandje zijn, maar het werkt wel. :)



Code:
Private Sub UserForm_Initialize()
    [COLOR="#FF0000"]ContoleKlik = 0[/COLOR]
    
    sn = ActiveSheet.Cells(1).CurrentRegion
    y = Abs(sn(1, 1) = "ID")
    With CreateObject("scripting.dictionary")
        For j = 2 To UBound(sn)
            x0 = .Item(sn(j, 1 + y))
        Next
        
        CB1.List = .keys
    End With

    ListBox1.List = [Tabel].Value
    
End Sub
Private Sub CB1_Change()
    [COLOR="#FF0000"]If ContoleKlik = 1 Then Exit Sub[/COLOR]
    CB2.ListIndex = -1
    CB3.ListIndex = -1
    If CB1.ListIndex > -1 Then CB2.List = F_lijst(1)
    
        ListBox1.List = [Tabel].Value
         
        For i = ListBox1.ListCount - 1 To 0 Step -1
                If InStr(1, ListBox1.List(i, 1), CB1, vbTextCompare) = 0 Then ListBox1.RemoveItem (i)
        Next
End Sub

Private Sub CB2_Change()
    [COLOR="#FF0000"]If ContoleKlik = 1 Then Exit Sub[/COLOR]
    CB3.ListIndex = -1
    If CB2.ListIndex > -1 Then CB3.List = F_lijst(2)
'    If CB3.ListCount = 1 Then CB3.ListIndex = 0
    
        ListBox1.List = [Tabel].Value
         
        For i = ListBox1.ListCount - 1 To 0 Step -1
                If InStr(1, ListBox1.List(i, 1), CB1, vbTextCompare) = 0 Then ListBox1.RemoveItem (i)
        Next
        For i = ListBox1.ListCount - 1 To 0 Step -1
                If InStr(1, ListBox1.List(i, 2), CB2, vbTextCompare) = 0 Then ListBox1.RemoveItem (i)
        Next
End Sub

Code:
Private Sub ListBox1_Click()
    [COLOR="#FF0000"]ContoleKlik = 1[/COLOR]
    
    CB1.Value = ListBox1.Column(1)
    CB2.Value = ListBox1.Column(2)
    CB3.Value = ListBox1.Column(3)
    
    For j = 4 To 9
    Me("TB" & j - 3).Value = ListBox1.Column(j)
    Next

   [COLOR="#FF0000"] ContoleKlik = 0[/COLOR]
    
End Sub
 
Dan kan je net zo goed On Error Resume Next gebruiken.
 
Niet geheel met je eens, On Error Resume Next betekend met ALLE foutmeldingen negeert worden.
Zoals ik het gedaan heb is het enkel dat de foutmelding onderschept wordt bij het selecteren in de listbox.

Ik ben tevreden, alles werkt zoals het voor mij werken moet, er gebeuren geen vreemde dingen wat er ook ingevoerd of geselecteerd wordt.

Misschien dat ik over een half jaartje ook zeg, dat had anders gemoeten. met de kennis die ik nu heb, ben ik nu tevreden.
Andere oplossingen zijn uiteraard welkom, daar leer ik alleen maar van.
Dus roept u maar.....;)


Bekijk bijlage keuze123_listbox_click.xlsb
 
Laatst bewerkt:
Maak er dan zoiets van:
Code:
On Error Goto Fout
.
.
.
.
Fout:
    If Err.Number = 381 Then [COLOR="#008000"]'Of welk nummer het dan ook is[/COLOR]
        Exit Sub
    Else
        Msgbox Err.Description
    End If
 
Bedankt Edmoor.
ik zal zeker jou bijdrage ook eens gaan proberen.

Wat is nu daadwerkelijk het verschil met de oplossing die jij aangeeft en de oplossing die ik heb toegepast?
Puur dat iemand anders mijn code makkelijker kan lezen als diegene met mijn oplossing aan het werk moet?
 
Het verschil is dat je de controle niet over meerdere subs verdeelt maar alleen daar waar het hoort.
 
oke....duidelijk.

maar voor nu weltrusten.....wekker om 6 uur
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan