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

Zoeken in 2 kolommen met autofilter

Status
Niet open voor verdere reacties.

toverkamp

Gebruiker
Lid geworden
11 sep 2006
Berichten
403
Beste forumleden,
Ik heb een formulier gemaakt waar men door het zoeken naar storingscodes alle storingen vindt m.b.t. die storingcode. Maar het probleeem is echter dat de storingscodes in 2 kolommen staan. Dit komt omdat er meerdere storingscodes bij één storing kunnen horen.
Maar nu lukt het mij tot nu toe om alleen te zoeken in één kolom, terwijl ik in de 2 kolommen moet zoeken. Ik gebruik de volgende code:
Code:
Private Sub zoekstoringscodezoekbutton_Click()

Dim c As Range, filteredRange As Range
    With Sheets("reactietijden").Range("B4").CurrentRegion
        .AutoFilter
        .AutoFilter Field:=51, Criteria1:=zoekstoringscodecmbbox.Value
Dim b As Range, gilteredRange As Range
        With Sheets("reactietijden").Range("B4").CurrentRegion
        .AutoFilter
        .AutoFilter Field:=53, Criteria1:=zoekstoringscodecmbbox.Value
End With
End With
       
With Sheets("reactietijden").AutoFilter.Range
     On Error Resume Next
Set filteredRange = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
    
With Sheets("reactietijden").AutoFilter.Range
     On Error Resume Next
Set gilteredRange = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
    
End With
End With
    
    
    For Each c In Intersect(filteredRange, Sheets("reactietijden").Columns(2))
        storingscode.zoekstoringscodedatumlist.AddItem c
    For Each b In Intersect(gilteredRange, Sheets("reactietijden").Columns(2))
        storingscode.zoekstoringscodedatumlist.AddItem b
    Next
    Next
    
    For Each c In Intersect(filteredRange, Sheets("reactietijden").Columns(6))
        storingscode.zoekstoringscodefiliaalnrlist.AddItem c
    For Each b In Intersect(gilteredRange, Sheets("reactietijden").Columns(6))
        storingscode.zoekstoringscodefiliaalnrlist.AddItem b
    Next
    Next
    
    For Each c In Intersect(filteredRange, Sheets("reactietijden").Columns(7))
        storingscode.zoekstoringscodekassanrlist.AddItem c
    For Each b In Intersect(gilteredRange, Sheets("reactietijden").Columns(7))
        storingscode.zoekstoringscodekassanrlist.AddItem b
    Next
    Next
    
    For Each c In Intersect(filteredRange, Sheets("reactietijden").Columns(40))
        storingscode.zoekstoringscodereactietijdlist.AddItem c.Text
    For Each b In Intersect(gilteredRange, Sheets("reactietijden").Columns(40))
        storingscode.zoekstoringscodereactietijdlist.AddItem b.Text
    Next
    Next
End Sub

Ik heb een printscrean erbij gedaan. Ik hoop dat het zo duidelijk is, anders hoor ik het wel.
Alvast bedankt!:thumb:
 

Bijlagen

  • storingscodes.JPG
    storingscodes.JPG
    78,7 KB · Weergaven: 43
Ik denk dat het misschien toch niet helemaal duidelijk is. Dus vandaar dat ik maar een voorbeeldbestandje heb toegevoegd. Ik hoop dat het nu lukt!
 

Bijlagen

Heeft niemand een idee??... ik heb al vanalles geprobeerd, maar kom er gewoon niet uit:evil:
 
Hoi toverkamp,

In de bijlage zit denk ik de oplossing.

Maar eventjes een tip.
Gebruik breakpoint (F9) en loop stap voor stap door je probleem code(F8).

Als je dit hebt gedaan dan zie je bijvoorbeeld dit:
Code:
 For Each [COLOR="Blue"][B]c[/B][/COLOR] In Intersect(filteredRange, Sheets("reactietijden").Columns(2))
        storingscode.zoekstoringscodedatumlist.AddItem c
    For Each [COLOR="Red"]b[/COLOR] In Intersect(gilteredRange, Sheets("reactietijden").Columns(2))
        storingscode.zoekstoringscodedatumlist.AddItem b
    [COLOR="red"]Next[/COLOR]
    [COLOR="blue"][B]Next[/B][/COLOR]

De loop For Each b wordt dus in iedere For Each c gedaan.

Wat ook niet klopt is:
Code:
Set filteredRange = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
Je wilt dat filteredRange de waarde krijgt van de autofilter in:
Code:
With Sheets("reactietijden").Range("B4").CurrentRegion
        .AutoFilter
        .AutoFilter Field:=51, Criteria1:=zoekstoringscodecmbbox.Value
Maar voordat je filteredRange zet doe je de volgende autofilter al.


Suc6 en denk aan de breakpoints, alleen op deze manier kun je snel en makelijk problemen oplossen
 

Bijlagen

Spiderman, bedankt voor de tip!! Ik ga er zeker mee werken, ook bedankt voor het oplossen van mijn probleem!! Ik kan weer een stuk verder!

Supersss:thumb: :thumb:

Misschien toch iets te vroeg gejuichd.... Hij werkt wel wanneer er in Field 51 en Field 53 waarden staan, maar zodra één van deze velden leeg is. Je zoekt bijvoorbeeld naar T2, dan krijg je een foutmelding van: Fout 1004 tijdens uitvoering: er zijn geen cellen gevonden.
 
Laatst bewerkt:
Hoi toverkamp,

Zo dan :D

Hallo spiderman!

Allereerst hartelijk dank voor uw reactie! In het bestandje wat jij had toegevoegd doet ie 't wel, maar nu wil ik 'm implementeren in mijn eigen bestand, wat veel groter is. Dan geeft hij bijvoorbeeld alleen maar de waarde uit Field 51 weer. Ik weet niet hoe het kan.

Code:
    With Sheets("reactietijden").Range("B4").CurrentRegion
        .AutoFilter
        .AutoFilter Field:=51, Criteria1:=zoekstoringscodecmbbox.Value
        Set filteredRange = Sheets("reactietijden").AutoFilter.Range.Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
        .AutoFilter
        .AutoFilter Field:=53, Criteria1:=zoekstoringscodecmbbox.Value
        If Sheets("reactietijden").Range("B:B").SpecialCells(xlCellTypeVisible).Rows.Count > 4 Then
            Set gilteredRange = Sheets("reactietijden").AutoFilter.Range.Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
        End If
        .AutoFilter
    End With

heeft het misschien hier ergens mee te maken?
 
Hoi toverkamp,

Waarschijnlijk zit het hem in de volgende regel.
Code:
 If Sheets("reactietijden").Range("B:B").SpecialCells(xlCellTypeVisible).Rows.Count > 4

De 4 op het einde staat voor de regel waarin je de kolom header hebt staan.
In je voorbeeld staat deze op rij 4. Als er nu dus geen data wordt gevonden dan is het resultaat dus 4.
Als er 1 of meerdere rijen zichtbaar zijn, dan is het resultaat dus de laatste rij.

Kijk maar of je hier iets aan hebt.
 
Hoi toverkamp,

Waarschijnlijk zit het hem in de volgende regel.
Code:
 If Sheets("reactietijden").Range("B:B").SpecialCells(xlCellTypeVisible).Rows.Count > 4

De 4 op het einde staat voor de regel waarin je de kolom header hebt staan.
In je voorbeeld staat deze op rij 4. Als er nu dus geen data wordt gevonden dan is het resultaat dus 4.
Als er 1 of meerdere rijen zichtbaar zijn, dan is het resultaat dus de laatste rij.

Kijk maar of je hier iets aan hebt.

Ik heb de kolom header in mijn eigen bestand exact hetzelfde staan als in het bestandje wat jij hebt toegevoegd, het enigste verschil is dat her veel meer rijen in staan. Dus ik vind het wel vreemd dat hij het bij mijn bestand het niet doet...
 
Hoi toverkamp,

Is het mogelijk om het orginele bestand naar me te mailen? Dat kijkt net iets makelijker
 
Spiderman,

ik heb even gekeken in het "kleine" bestandje, doe daar eens het volgende:
Knip de gegevens uit kolom BB5 en BC5 naar BB8 en BC8

Klik dan nog een keer op de button en typ daar L2 in. Dan krijg je hetzelfde probleem als in mijn grote bestand: hij vind namelijk alleen 2 keer L2 uit kolom AZ, die in BB wordt niet gevonden.
 
Hoi toverkamp,

Ik ben er niet trots op maar ik kon geen andere manier vinden:

Verander het bovenste gedeelte van je code in:
Code:
Private Sub zoekstoringscodezoekbutton_Click()

    Dim c As Range, filteredRange As Range
    Dim b As Range, gilteredRange As Range
    zoekstoringscodedatumlist.Clear
    zoekstoringscodefiliaalnrlist.Clear
    zoekstoringscodekassanrlist.Clear
    zoekstoringscodereactietijdlist.Clear
    
    On Error Resume Next
    With Sheets("reactietijden").Range("B4").CurrentRegion
        .AutoFilter
        .AutoFilter Field:=51, Criteria1:=zoekstoringscodecmbbox.Value
        Set filteredRange = Sheets("reactietijden").AutoFilter.Range.Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
        .AutoFilter
        .AutoFilter Field:=53, Criteria1:=zoekstoringscodecmbbox.Value
        Set gilteredRange = Sheets("reactietijden").AutoFilter.Range.Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
        .AutoFilter
    End With
    On Error GoTo 0

Vanaf de For Each veranderd er dus niets.
 
Hoi spiderman,

in principe werkt de oplossing wel, mijn dank daar voor! Maar ik heb (volgens mij) een iets betere oplossing gevonden die iets sneller werkt:
Code:
Private Sub zoekstoringscodezoekbutton_Click()

    zoekstoringscodedatumlist.Clear
    zoekstoringscodefiliaalnrlist.Clear
    zoekstoringscodekassanrlist.Clear
    zoekstoringscodereactietijdlist.Clear
    
On Error Resume Next
  With Sheets("reactietijden")
    st = .Range("B4").CurrentRegion
    For j = 2 To UBound(st)
      If st(j, 1) = "" Then Exit For
      If InStr(st(j, 51) & st(j, 53), storingscode.zoekstoringscodecmbbox.Value) > 0 Then
        c1 = c1 + Format(st(j, 1), "dd-mm-yyyy") + "|"
        c5 = c5 + Format(st(j, 5)) + "|"
        c6 = c6 + Format(st(j, 6)) + "|"
        c7 = c7 + Format(st(j, 42)) + "|"
          
      End If
    Next
  End With
  With storingscode
    .zoekstoringscodedatumlist.List = Split(c1, "|")
    .zoekstoringscodefiliaalnrlist.List = Split(c5, "|")
    .zoekstoringscodekassanrlist.List = Split(c6, "|")
    .zoekstoringscodereactietijdlist.List = Split(c7, "|")
  End With
End Sub

Het probleem is echter dat de listbox "zoekstoringscodereactietijdlist" de gegevens weergeeft als kommagetal en niet als :mm.
 
Hoi toverkamp,

Misschien dat je hier iets aan hebt?

Code:
Private Sub zoekstoringscodezoekbutton_Click()

    zoekstoringscodedatumlist.Clear
    zoekstoringscodefiliaalnrlist.Clear
    zoekstoringscodekassanrlist.Clear
    zoekstoringscodereactietijdlist.Clear
[COLOR="Red"]Dim st As Range[/COLOR]
    On Error Resume Next
    With Sheets("reactietijden")
    [COLOR="red"]Set st [/COLOR]= .Range("B4").CurrentRegion
      For j = 2 To [COLOR="Red"]st.Rows.Count[/COLOR]
      If st(j, 1) = "" Then Exit For
      If InStr(st(j, 51) & st(j, 53), storingscode.zoekstoringscodecmbbox.Value) > 0 Then
        c1 = c1 + Format(st(j, 1), "dd-mm-yyyy") + "|"
        c5 = c5 + Format(st(j, 5)) + "|"
        c6 = c6 + Format(st(j, 6)) + "|"
        c7 = c7 & Format(st(j, [B]39[/B][COLOR="red"]).Text[/COLOR]) & "|"
          
      End If
    Next
  End With
  With storingscode
    .zoekstoringscodedatumlist.List = Split(c1, "|")
    .zoekstoringscodefiliaalnrlist.List = Split(c5, "|")
    .zoekstoringscodekassanrlist.List = Split(c6, "|")
    .zoekstoringscodereactietijdlist.List = Split(c7, "|")
  End With
End Sub

P.S Ik heb de 42 veranderd in 39 omdat 42 bij mijn leeg was.
 
Het werkt zo prima spiderman! Bedankt voor je oplossing! Misschien een heel klein detaill, soms komen de tijd als volgt in de listbox te staan 35:00:00 en soms ook als 35:00. Die tweede notatie vind ik iets duidelijker staan. Misschien dat er iets aan de code aangepast kan worden?
 
Hoi toverkamp,

Probeer dit eens:

Verander
Code:
 c7 = c7 & Format(st(j, 39).Text, "hh:mm") & "|"
In
Code:
st(j, 39).NumberFormat ("[h]:mm")
c7 = c7 & Format(st(j, 39).Text, "hh:mm") & "|"
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan