• 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.

combobox vullen met gegevens uit 3 kolommen

Status
Niet open voor verdere reacties.

ikselle

Gebruiker
Lid geworden
25 mei 2009
Berichten
198
Ben hier opnieuw met probleempje :
Ik wil de unieke, gesorteerde(op eerste kolom) gegevens van drie kolommen (A, B en C) gescheiden door een komma in een combobox aan de gebruiker aanbieden.
Indien de gebruiker niet de juiste identificatie vind wordt er een nieuwe userform aangeboden om de nieuwe gegeven in te vullen.
Ik vond op de site van sn prachtige (soms voor mij moeilijk te volgen) voorbeelden maar kom er niet toe dit in mijn bestandje aan te passen.:mad:
Kan er iemand een duwtje geven ? Alvast bedankt!
 

Bijlagen

Bedankt Cobbe voor je voorstel dat ongeveer mijn denkwijze volgt. Moet nu een paar uurtjes weg maar ga dit zeker vanavond proberen in te passen !!:thumb:
 
Cobbe, heb zoals gezegd uw gedachtelijn gevolgd en het is me gelukt om de combobox te vullen met 1 gegeven (logisch want je wil maar een waarde uit de eerste kolom). Maar wanneer ik de waarden uit de tweede kolom bijvoeg krijg ik een probleem in de do...loop lus die blijkbaar niet eindigt. Wat doe ik daar verkeerd ? Heb de do...loop nu eventjes uitgezet.
 

Bijlagen

Weet nog altijd niet wat je nu eigenlijk wil.

Kijk eens of het formulier nu wel correct ingevuld wordt.
 

Bijlagen

De bedoeling is dat de gebruiker snel een nummerplaat met de bijbehorende bestuurder kan noteren. Het snelst gaat dit volgens mij met een combobox, gebaseerd op de reeds ingevulde gegevens (zodra een letter getypt wordt wordt de nrplaat reeds zichtbaar of hij kan scrollen). De geselecteerde gegevens worden dan wegegeschreven op hetzelfde blad. Vind de gebruiker geen gegevens van de ingevoerde nummerplaat (m.a.w. als de array leeg is) dan laat ik de nieuwe gegevens invoeren via een andere userform. Het eerste gedeelte lukt op dit moment redelijk. Er zijn nog twee problemen:
1) ik krijg de array niet dynamisch gedeclareerd (nu bevat hij zoveel elementen als er geschreven rijen zijn)
2) ik krijg de array niet uniek
Ik hoop je hiermee genoeg ingelicht te hebben. Bedankt voor je hulp.:)
 

Bijlagen

Het laatste stuk.
De sorteercode kan ook wel beter, maar er staan voorbeelden genoeg op het forum om dat zelf te doen.
Code:
With Sheets("Bron").Range("a2:a" & nLastOne)
    Set s_gegeven = .Find(plaat, LookIn:=xlValues)
    If Not s_gegeven Is Nothing Then
        'maak array aan van UNIEKE eigenaars met dezelfde nummerplaat
        nRij = s_gegeven.Row()
        s_dummy = s_gegeven
        nTeller = 0
        Do
          s_dummy = s_gegeven
          sRest = Range("B" & nRij).Value & ", " & Range("C" & nRij).Value
            If InStr(c00, sRest & "|") = 0 Then
               aTrack(nTeller) = sRest
               c00 = c00 & "|" & sRest & "|"
               nTeller = nTeller + 1
            End If
          Set s_gegeven = .FindNext(s_gegeven)
         nRij = nRij + 1
        Loop While Not s_gegeven Is Nothing And s_gegeven = Range("A" & nRij).Value
     Else
        Erase aTrack
     End If
End With
If IsArrayEmpty(aTrack) Then
  MsgBox "Nummerplaat niet gevonden"
  'open een invoeruserform
Else
MsgBox "Ik heb wat gevonden"
Ufr_nrplaat.ComboBox2.List = aTrack


  
  
  
  'For nTeller = 1 To UBound(aTrack)
  '  If aTrack(nTeller) = aTrack(nTeller - 1) Then
  '    aTrack = Filter(aTrack, aTrack(nTeller), False)
  '  End If
  'Next
  'Ufr_nrplaat.ComboBox2.List = aTrack
End If
Erase aTrack
End Sub
 
Met vereenvoudigde sortering en je kan ook zoeken op naam of vnaam

Code:
Private Sub CommandButton1_Click()
s = LCase(TxtIdentificatie)
With Sheets("Bron")
    .Cells(1).CurrentRegion.Sort .[A1], , .[B1], , , .[C1], , True
    ar = .Cells(1).CurrentRegion
    For j = 2 To UBound(ar)
        If InStr(1, LCase(ar(j, 1)), s) Or InStr(1, LCase(ar(j, 2)), s) Or InStr(1, LCase(ar(j, 3)), s) Then
            If InStr(1, c00, ar(j, 1) & "," & ar(j, 2) & "," & ar(j, 3)) = 0 Then c00 = c00 & "|" & ar(j, 1) & "," & ar(j, 2) & "," & ar(j, 3)
        End If
    Next j
End With
If Len(c00) > 0 Then Ufr_nrplaat.ComboBox2.List = Application.Transpose(Split(Mid(c00, 2), "|")) Else MsgBox "niets gevonden"
End Sub
 
Code:
Private Sub CommandButton1_Click()
s = TxtIdentificatie
With Sheets("Bron")
    .Cells(1).CurrentRegion.Sort .[A1], , .[B1], , , .[C1], , True
  ar = .Cells(1).CurrentRegion.Resize(, 3)
    For j = 2 To UBound(ar)
      If ar(j, 1) = s And InStr(c00, Join(Application.Index(ar, j, 0), ", ")) = 0 Then
         c00 = c00 & "|" & Join(Application.Index(ar, j, 0), ", ")
      End If
    Next
End With
If Len(c00) > 0 Then Ufr_nrplaat.ComboBox2.List = Application.Transpose(Split(Mid(c00, 2), "|")) Else MsgBox "niets gevonden"
End Sub
 
@HSV,

Deze begreep ik nooit
Code:
Join(Application.Index(ar, j, 0), ", ")
De 0 maakt er blijkbaar een matrix van die alle 'kolommen' uit ar meeneemt. Zo leer ik weer wat:D

Even de code aangepast zodat aan de zoekvoorwaarde van de TS wordt voldaan.

Code:
Private Sub CommandButton1_Click()
s = LCase(TxtIdentificatie)
With Sheets("Bron")
    .Cells(1).CurrentRegion.Sort .[A1], , .[B1], , , .[C1], , True
    ar = .Cells(1).CurrentRegion.Resize(, 3)
    For j = 2 To UBound(ar)
        If InStr(1, LCase(ar(j, 1)), s) Then
            If InStr(1, c00, Join(Application.Index(ar, j, 0), ", ")) = 0 Then c00 = c00 & "|" & Join(Application.Index(ar, j, 0), ", ")
        End If
    Next j
End With
If Len(c00) > 0 Then Ufr_nrplaat.ComboBox2.List = Application.Transpose(Split(Mid(c00, 2), "|")) Else MsgBox "niets gevonden"
End Sub
 
Je bent bekend met de formulefunctie 'Index'?
Is de zoekvoorwaarde 'Lcase'?

Een ifje minder en de transpose kan ook nog verwijderd worden.
Code:
Private Sub CommandButton1_Click()
s = LCase(TxtIdentificatie)
With Sheets("Bron")
    .Cells(1).CurrentRegion.Sort .[A1], , .[B1], , , .[C1], , True
  ar = .Cells(1).CurrentRegion.Resize(, 3)
    For j = 2 To UBound(ar)
      If LCase(ar(j, 1)) = s And InStr(c00, Join(Application.Index(ar, j, 0), ", ")) = 0 Then
         c00 = c00 & "|" & Join(Application.Index(ar, j, 0), ", ")
      End If
    Next
End With
If Len(c00) > 0 Then Ufr_nrplaat.ComboBox2.List = Split(Mid(c00, 2), "|") Else MsgBox "niets gevonden"
End Sub
 
Wordt 12345 gevonden met de code uit #9 en wordt met dezelfde code voldaan aan?
(zodra een letter getypt wordt wordt de nrplaat reeds zichtbaar of hij kan scrollen).

Dat de 0 de laatste kolom uit de index ophaalt wist ik niet.:thumb:
 
Index(matrix,rij,kolom)
Misschien een testje om te lezen wat de waarde van c00 nu wordt.
Code:
c00 = c00 & "|" & Join(Application.Transpose(Application.Index(ar, 0, j)), ", ")
 
Had ik al gedaan en nog wat andere combinaties. Vandaar het duimpje. Maar volgens mij dwalen we af. Dus de vraag maar teruggeven aan de TS. Er komen nog voldoende vervolgvragen verwacht ik.;)
 
@VenA
@HSV
Bedankt voor jullie inbreng. Uw code is veel korter dan wat ik er van terecht bracht. Maar ze is voor mij wel erg moeilijk te begrijpen. Hoe komt het bijvoorbeeld dat er geen foutmeldingen komen terwijl jullie geen variabelen declareren (o.a. s, ar, c00) en wat doet/betekent
Code:
Join(Application.Index(ar, j, 0), ", ")
? Dit vond ik tevens terug op de site van snb. Het maakt alles veel korter en dan kom ik bij de vraag of het dan ook sneller gaat.

Hierbij twee bedenkingen :
1) de code van HSV negeerde de inbreng van "12345"
2) in de combobox hoeft de nummerplaat zelf niet meer te verschijnen
Omwille van puntje 2 heb ik tevergeefs een tijdje getracht jullie codes aan te passen maar dit leerde me alleen dat ik nog veel te leren heb !!!:d
Heb jullie cmdbuttons samen op dezelfde userform gezet.
 

Bijlagen

Punt 1 en punt 2 opgelost.
Wat betreft je 1ste vraag, zolang er bovenaan je code geen Option Explicit staat hoef je de variabelen niet te declareren.
Of het echt nodig is om variabelen te declareren om code te doen werken is het antwoord Neen. Er zijn al ontelbare discussies gevoerd over het declareren en de ene zweert erbij, de andere schenkt er geen of weinig aandacht aan. Argument voor zou zijn het vermijden van typo's maar als je een beetje aandachtig bent tijdens het schrijven van code is er echter geen probleem als je het niet doet.
Op je vraag of het sneller gaat is het antwoord dat alles wat uitgevoerd wordt in het werkgeheugen (geen interactie met het werkblad) ontelbare malen sneller uitgevoerd wordt.
 

Bijlagen

@Warme bakkertje,
Bedankt voor je uitleg en je bijdrage aan de code. Punten 1 en 2 werden inderdaad verholpen maar de combolist is nu wel niet meer uniek (als je bijv "AAA111"invoert).
 
Wel als je op VenA zoek klikt.

Edit. Je wil geen nummerplaat meer zien.

Code:
Private Sub CommandButton2_Click()
Me.TxtIdentificatie.Enabled = False
s = LCase(TxtIdentificatie)
With Sheets("Bron")
    .Cells(1).CurrentRegion.Sort .[A1], , .[B1], , , .[C1], , True
    ar = .Cells(1).CurrentRegion.Resize(, 3)
    For j = 2 To UBound(ar)
      If InStr(1, LCase(ar(j, 1)), s) Then
        If InStr(1, c00, Join(Application.Index(ar, j, 0), ", ")) = 0 Then
            c00 = c00 & "|" & Join(Application.Index(ar, j, 0), ", ")
            c01 = c01 & "|" & ar(j, 2) & ", " & ar(j, 3)
        End If
      End If
    Next j
End With
If Len(c00) > 0 Then Ufr_nrplaat.ComboBox2.List = Application.Transpose(Split(Mid(c01, 2), "|")) Else MsgBox "niets gevonden"
End Sub
 
Laatst bewerkt:
@VenA Dit is het helemaal !!!
Ook HSV, Cobbe en warme bakkertje van harte bedankt. Ik hoop ooit met mijn beperkte "kennis" ook anderen te kunnen helpen. Op dit moment tracht ik de door jullie aangebrachte code te ontcijferen. Want naast het feit dat de code nu ook werkt, wil ik nu toch graag uitzoeken hoe dit werkt.:thumb:
Wat mij betreft kan deze vraag als "opgelost" gezet worden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan