ACCES VBA: Eén Filter voor meerdere kolommen - kan dit?

Status
Niet open voor verdere reacties.

fde

Gebruiker
Lid geworden
31 aug 2017
Berichten
110
In mijn doorlopend formulier (frm_sollicitant_zoek_functie) heb ik een keuzelijst met invoervak staan (cboZoekFunctie) waarachter in VBA een filter-functie staat.
Op het doorlopende formulier worden de volgende gegevens weergegeven: ID - NAAM - VOORNAAM - GEBOORTEDATUM - TEL/GSM-NUMMER - EMAIL - FUNCTIE1 - FUNCTIE2 - FUNCTIE3 - SELECTIEVAKJE.

De code voor het filteren van een bepaalde functie werkt perfect voor één kolom. Kan dit uitgebreid worden naar meerder kolommen. 3 Apparte keuzelijsten is niet de bedoeling:

Ik verklaar:
Persoon A kan bv uitvoerder (=functie1) of tekenaar (=functie2) of technieker(=functie3) zijn. Persoon B kan bv tekenaar (=functie1) - uitvoerder(=functie2) - tester(=functie3) zijn.
Als ik "uitvoerder" selecteer via m'n keuzelijst zou ik in principe 2x een persoon (1x uit functie1) & (1x uit functie2) te zien moeten krijgen.


Code:
Private Sub cboZoekFunctie_AfterUpdate()
    Me.Filter = "[FUNCTIE1_SOLLICITANT] = """ & Me.cboZoekFunctie & """"
    'Me.Filter = "[FUNCTIE2_SOLLICITANT] = """ & Me.cboZoekFunctie & """"
    'Me.Filter = "[FUNCTIE3_SOLLICITANT] = """ & Me.cboZoekFunctie & """"
    Me.FilterOn = True
End Sub

Heeft er iemand hiervoor een oplossing of iemand die me op weg kan helpen?
 
Ik ben al een aantal jaren uit Acces, maar wat ik deed om 1 userform met verschillende tabellen te benaderen was een query maken waar de 3 tabellen in zaten en van daar uit maakte ik een nieuwe tabel die door de query gevuld werd en die vulde weer het userform. Ik kan mij voorstellen dat zoiets ook voor een filter werkt.
 
hellboy01: De functie (invoervak) komt uit één en dezelfde tabel. Momenteel zijn er 87 functies (records) in gedefinieerd en er komen functies op geregelde basis bij. Dit geeft momenteel bijna 650.000 verschillende combinaties verdeeld over drie kolommen (functie1 - functie2 - functie3). Zoveel queries ga ik echt niet maken. Stel je voor dat ik een bijkomende functiekolom (functie4) moet toevoegen dan ben ik al aan 53,4 miljoen combinaties.
 
Laatst bewerkt:
Kort door de bocht nee dat kan niet. (Tenzij je middels VBA een nieuwe recordset opbouwt)

Mij lijkt jouw opzet niet goed. Zoek maar eens op 'database normaliseren'

Voor deze vraag heb je 3 tabellen nodig:
TblNamen;
TblFuncties;
TblKoppelNamenFuncties.

In de koppeltabel knoop je de naam en de functie aan elkaar. In deze tabel zet je bv NaamId, FunctieID, Vanaf, Tm. Als je dit op orde hebt is het opvragen van wat dan ook geen enkel probleem.

Nb. Het gebruik van Capslock aan voor kolomnamen is niet echt van deze tijd en het gebruik van 'rare' tekens zou ik ook niet gebruiken in kolomnamen.
 
Dit antwoorden is "uit te zoeken waard"
Ik kom er later op terug VenA
 
Het antwoord van VenA (Kort door de bocht nee dat kan niet) is niet correct, want het kan wel. Maar je zult een kleine aanpassing moeten doen aan de query die je voor het formulier gebruikt, je moet daar namelijk een veld aan toevoegen. Dat veld gebruik je om de drie functies (ik zie geen grote normalisatieprobleem; ik vermoed dat één persoon op 3 functies kan solliciteren en die wil je dan vastleggen. Ideaal is het niet, maar praktisch wel werkbaar) samen te voegen, dus je krijgt dan iets als: Zoekveld: [FUNCTIE1] & [FUNCTIE2] & [FUNCTIE3]. Vervolgens gebruik je de keuzelijst om op dat nieuwe veld ([Zoekveld] dus te filteren.
 
Beste OctaFish,

Ik had eerst de VBA code aangepast in dezelfde stijl zoals je geschreven had:
Me.Filter = "[FUNCTIE1_SOLLICITANT]&[FUNCTIE2_SOLLICITANT]&[FUNCTIE3_SOLLICITANT] = """ & Me.cboZoekFunctie & """"
Hier kreeg ik geen enkel foutmelding op (in VBA - na uitproberen van het formulier) doch het werkt niet compleet. Dit probeersel geeft alleen "FUNCTIE1" weer.

Dan heb ik jouw wijze uitgeprobeerd:

Qry aanpassing - kolom bijgevoegd zoals hierbij beschreven: ZOEKEN: [FUNCTIE1_SOLLICITANT] & [FUNCTIE2_SOLLICITANT] & [FUNCTIE3_SOLLICITANT]
VBA aanpassing: Me.Filter = "[ZOEKEN] = """ & Me.cboZoekFunctie & """" i.p.v. Me.Filter = "[FUNCTIE1_SOLLICITANT] = """ & Me.cboZoekFunctie & """"

Deze oplossing geeft ook geen foutmelding maar evengoed geeft niet de juiste waarde. Ik had bij één persoon een "zelfde" functie bijgevoegd in de kolom "FUNCTIE3" waarvan er reeds 23 personen zijn benoemd in de kolom "FUNCTIE1" ; doch nr.24 werd/wordt niet getoond.

Heb ik iets foutief geïnterpreteerd in jouw uitleg? Dat kan best want m'n VBA-kennis is echt abominabel.
 
Laatst bewerkt:
Op het moment dat je een zoekveld maakt met waarden uit meerdere velden, is het resultaat in dat veld een string met alle waarden uit die velden. Je keuzelijst laat één functie zien, die nu dus op meerdere plekken in de zoekstring kan voorkomen. In de oude zoeksituatie was dat geen probleem omdat de zoekwaarde volledig terugkwam in het zoekveld, maar nu is dat dus niet meer het geval. Je kunt dus niet meer met "=" zoeken, maar je moet met wildcards zoeken. Dus met LIKE.
 
Ik heb LIKE uitgeprobeerd. Maar blijkbaar werkt het niet goed of heb ik iets niet goed gedaan.
Als ik de qry aanpas via de recordbron van het formulier heb ik gemerkt als je met een samengevoegde string werkt dat je in de criteria een * voor en na de functie dient te plaatsen, wil je de complete reeks van personen van de desbetreffende functie weer te geven. Dus: LIKE "*functieomschrijving*"
Ik heb geprobeerd om dit te doen in VBA te zetten, maar daar loopt het blijkbaar mis.
 
Beste OctaFish,

Na opzoek- en probeer werk heb ik een oplossing gevonden die werkt.

Code:
Private Sub cboZoekFunctie_AfterUpdate()
    Me.Filter = "[ZOEKEN] like '*" & Me.cboZoekFunctie & "*'"
    Me.FilterOn = True
End Sub

Met dank om me op weg te helpen met de "LIKE".
 
Laatst bewerkt:
Je kunt het beter zo doen:
Code:
     Me.Filter = "[ZOEKEN] like ""*" & Me.cboZoekFunctie & "*"""
 
Kan je me aub uitleggen wat het verschil is met al die quotes want dat begrijp ik echt niet; ' " ---- " ' " of " " " ---- " " " "
 
In beginsel kun je een tekststring op twee manieren 'vastleggen'. Met enkele quootjes (zoals net gedaan) of met dubbele quoots. Dus "vastleggen". De tweede methode is robuuster en veiliger omdat je daarmee ook namen kunt benoemen als: 's Gravenhage. Zou je plaatsnamen filteren, dan loopt jouw code daarop vast, en gaat mijn code gewoon door. Dat komt doordat de string ''s Gravenhage' wordt gezien als feitenlijk twee strings: '' (een lege string) en Gravenhage' en dat is dan weer een foute string omdat er wel een eindquootje is, maar geen beginquoot. De string "'s Gravenhage" is dus wél correct. Ik gebruik dus nooit de eerste variant, maar altijd de tweede. Maar er zit een addertje onder het gras: " is een beschermd teken. Daarom moet je, als je het teken ook als stringdivider wilt gebruiken, het teken herhalen.
 
Met dank voor deze verhelderende uitleg. Nu begrijp ik ook waar en waarom het in het verleden mis ging met die quoots.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan