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

UDF Instr met Wildcards

Status
Niet open voor verdere reacties.

arrie23

Gebruiker
Lid geworden
20 okt 2009
Berichten
400
Beste allemaal,

Ik heb van dit forum een mooie UDF ('vindSteekwoorden') geplukt die in een tekst kan zoeken op een lijstje met meerdere steekwoorden en als resultaat teruggeeft welke van die steekwoorden er in de tekst voorkomen (in 1 cel, elk steekwoord gescheiden door een komma).

Dit werkt perfect zolang er in het lijstje met steekwoorden geen wildcard is opgenomen. Ik zou echter graag willen dat het ook mogelijk is met wildcards in de steekwoorden.

Het bijgevoegd bestand verduidelijkt mijn vraag (hopelijk). In kolom A de teksten, in kolom E het lijstje steekwoorden (met en zonder wildcards), in kolom B het resultaat van de UDF en in kolom C (handmatig) het gewenste eindresultaat. Het lijkt erop dat de Instr-functie die gebruikt wordt in de UDF niet kan omgaan met wildcards. Is er een alternatief te bedenken? De functie Vind.Spec werkt wel gewoon met wildcards maar krijg ik zelf helaas niet verwerkt in deze UDF (onvoldoende kennis van VBA).

Bekijk bijlage UDF_Instr_met_Wildcards.xlsm
 
Verander de functie in:

Code:
Function vindSteekwoorden(Tekst As String, steekwoorden As Range) As String
    Tekst = LCase(Tekst)
    For Each Steekwoord In steekwoorden
        If Tekst Like "*" & Steekwoord & "*" Then vindSteekwoorden = vindSteekwoorden & ", " & Steekwoord
    Next
End Function

Met vriendelijke groet,


Roncancio
 
Beste Roncancio,

Werkt helemaal perfect! Bedankt voor de snelle reactie! :thumb:
 
Netjes Roncancio!

Nog 1 kleine toevoeging aan je code om het - naar mijn gevoel - af te maken...

Function vindSteekwoorden(Tekst As String, steekwoorden As Range) As String
Tekst = LCase(Tekst)
For Each Steekwoord In steekwoorden
If Tekst Like "*" & Steekwoord & "*" Then vindSteekwoorden = vindSteekwoorden & ", " & Steekwoord
Next
vindSteekwoorden = Mid(vindSteekwoorden, 2)
End Function
Ben je die - in mijn ogen - storende eerste komma kwijt. ;)
 
Ginger,

Klopt helemaal, maar TS heeft de komma vooraan ook in het gewenste resultaat staan (kolom C).:thumb:

Met vriendelijke groet,


Roncancio
 
Geen idee of zoekfunctie hoofdlettergevoelig moet zijn. Anders volstaat:

Code:
Function vindSteekwoorden(Tekst As String, steekwoorden As Range) As String
    For Each Steekwoord In steekwoorden
        If LCase(Tekst) Like LCase("*" & Steekwoord & "*") Then vindSteekwoorden = vindSteekwoorden & ", " & Steekwoord
    Next
End Function

Met vriendelijke groet,


Roncancio
 
Het is inderdaad hoofdlettergevoelig, die LCase had ik er zojuist zelf ook al in verwerkt (zover kwam ik nog net :d). Toch bedankt voor de aanvulling en het meedenken.

@Ginger, die eerste komma had ik tot nu toe buiten de UDF om verwerkt/verwijderd maar dit is nog eleganter. Bedankt voor je input!!:thumb:
Ik heb er overigens vindSteekwoorden = Mid(vindSteekwoorden, 3) van gemaakt anders blijft er nog een spatie vooraan staan
 
Laatst bewerkt:
Ik heb er overigens vindSteekwoorden = Mid(vindSteekwoorden, 3) van gemaakt anders blijft er nog een spatie vooraan staan
Heel goed! Enne... ik had niet gezien dat er ook nog een spatie bij stond. Dus prima opgelost zo.
 
Je hoeft helemaal niet met 'jokertekens' te werken, want instr is per definitie wildcard georiënteerd en als default hoofdlettergevoelig.

Code:
Function F_snb(c00, sn)
  For Each it In sn
    If InStr(c00, it) Then F_snb = F_snb & ", " & it
  Next
End Function
 
Laatst bewerkt:
Beste snb,

Bedankt voor je reactie maar volgens mij is dit (nagenoeg) dezelfde UDF als die ik eerst had en waarmee de wildcards helaas niet werken. Als ik jouw oplossing loslaat op mijn voorbeeldbestand loop ik tegen hetzelfde probleem aan.

Oorspronkelijke code:
Code:
Function vindSteekwoorden(Tekst As String, steekwoorden As Range) As String
    Tekst = LCase(Tekst)
    For Each Steekwoord In steekwoorden
        If InStr(1, Tekst, LCase(Steekwoord)) > 0 Then vindSteekwoorden = vindSteekwoorden & ", " & Steekwoord
    Next
End Function
 
als je in plaats van sterretjes gewoon spaties gebruikt:

Code:
Function F_snb(c00, sn)
    For Each it In sn
       For Each it1 In Split(it)
         If InStr(c00, it1) > 0 Then F_snb = F_snb & ", " & it1
       Next
    Next
End Function
 
Beste snb. Bedankt voor je nieuwe optie. Dit werkt op zich ook wel alleen worden die woorden dan, als ik het helemaal goed begrijp, als aparte steekwoorden gezien en niet meer als combinatie.
Als ik in onderstaande twee teksten met een wildcard zoek op de combinatie 'koud*bier'
1. Er is koud water en bier en cola
2. Er is bier en koud water en cola
Dan bevat regel 1 wel 'koud*bier' maar regel 2 niet (deze bevat bier*koud). Als je de boel opknipt (wat jouw tweede voorstel volgens mij doet) wordt in zowel regel 1 als regel 2 het woord koud en bier aangetroffen. Dit is echter niet helemaal hetzelfde.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan