Regels selecteren in keuzelijst dmv van vba

Status
Niet open voor verdere reacties.

Nico84

Gebruiker
Lid geworden
21 jul 2011
Berichten
187
Om mijn formulier heb ik een keuzelijst lstArtikelen die alle artikelen laat zien (20 stuks)
De rijbron van lstArtikelen is:
Code:
SELECT tbl_Artikel.Artikelnr, tbl_Artikel.ArtikelOmschrijving FROM tbl_Artikel ORDER BY tbl_Artikel.Artikelnr;

De bedoeling is dat in lstArtikelen de artikelen geselecteerd (niet gefilterd) worden die in query1 voorkomen.
Komt artikelnr 3 voor in query1 dan moet artikelnr 3 geselecteerd worden in lstArtikelen enz. enz.

Nu heb ik al een beetje gepuzzeld, maar het werkt uiteraard niet.
Weet wel als je ipv ? een 5 invult dat de 6e regel geselecteerd wordt.

Code:
With CurrentDb.OpenRecordset("SELECT DISTINCT Query1.Artikelnr FROM Query1 ORDER BY Query1.Artikelnr")
	While NOT .EOF
		me.lstArtikelen.selected(?)= true
		.MoveNext
	Wend
End With

Hoe krijg ik het netjes voor elkaar dat hij alle regels naloopt en de bijbehorende regel selecteerd in lstArtikelen?
 
Grappig dat je exact dezelfde vraag hebt als uit een (Engelse) topic uit 2010 (zelfs met ongeveer dezelfde bewoordingen :) ) maar niet het antwoord daaruit hebt overgenomen, want dat werkt wel:

Code:
    Set rs = CurrentDb.OpenRecordset("SELECT DISTINCT Query1.Artikelnr FROM Query1")
    With rs
        Do While Not .EOF
            strCat = strCat & "|" & .Fields("CatID")
            .MoveNext
        Loop
        Close
    End With
    Set rs = Nothing
    
    strCat = strCat & "|"
    Set lbo = Me.lstArtikelen
    For intI = 0 To lbo.ListCount - 1
        If InStr(1, strCat, "|" & lbo.ItemData(intI) & "|") > 0 Then
            lbo.Selected(intI) = True
        End If
    Next
 
En om te laten zien dat het ook in één keer kan:

Code:
    Set lst = Me.lstArtikelen
    With rs
        Do While Not .EOF
            For intI = 0 To lst.ListCount - 1
                If CStr(.Fields("CatID")) = CStr(lst.ItemData(intI)) Then
                    lst.Selected(intI) = True
                    Exit For
                End If
            Next
            .MoveNext
        Loop
        Close
    End With
    Set rs = Nothing
    Set lst = Nothing
 
Ik had gegoogled en heel wat sites bekeken, maar ben die engelse site niet tegengekomen.
Toevallig dan dat mijn vraag bijna overeenkomt.
Schijnbaar zoek jij toch op een andere manier dan ik.

Heb het ff snel uitgeprobeerd en werkt uiteraard.
Bedankt weer OctaFish!
 
Ik zoek voor antwoorden op vragen die ik niet gelijk paraat heb vaak op Engelse termen, omdat die taal nèt iets gangbaarder is op het internet :) En dan vind je dus ook andere oplossingen dan je op een Nederlandstalige site vind. Hier heb je overigens de site waar ik de oplossing vandaan heb gehaald. De tweede oplossing heb ik overigens wel zelf bedacht; ik vroeg me af of het ook in éen keer kon, en dat kan dus wel. Die oplossing is technisch overigens wel (al is dat met weinig records nauwelijks meetbaar) langzamer dan de eerste variant, omdat de lus elke keer twee keer wordt afgedraaid. De eerste oplossing gebruikt één lus en een Instr, dus die zou sneller moeten zijn.
Volgens mij kan de vraag weer op Opgelost!
 
Uit het eerste antwoord snap ik deze regel code niet helemaal
Code:
If InStr(1, strCat, "|" & lbo.ItemData(intI) & "|") > 0 Then

Met de eerste lus (als ik het goed begrijp) worden de artikelnrs uit de query uitgelezen en in een string gezet.
4|5|7|8|10| op deze manier.

Vervolgens wordt het artikelnr uit de keuzelijst vergeleken met de string.
Als de waarde dan voorkomt resulteerd dat in een waarde groter dan 0.
Klopt dat een beetje?
 
Zie je helemaal juist! Daarom is die oplossing in de praktijk ook iets sneller, omdat bij de tweede variant beide lussen elke keer opnieuw worden afgedraaid.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan