Findandreplace Functie

Status
Niet open voor verdere reacties.

Paolodesouza

Gebruiker
Lid geworden
10 mrt 2011
Berichten
6
Goedemiddag,

Ik probeer middels de findandreplace funtie in een query velden (namen van werknemers) vanuit de ene database te vervangen zodat ze overeenkomen met een andere tabel. Bij de ene database staat namelijk het personeelsnr ervoor. Echter zit ik met het volgende probleem: soms komt een naam ook voor in een gedeelte van een andere naam, voorbeeld Jans en Janssen. Als ik dan Jans laat vervangen voor 00012 Jans bijvoobeeld, dan veranderd Janssen in 00012 Jans sen. Hoe kan ik dit verhelpen? Ik hoop dat het een beetje duidelijk uitgelegd is.
Op internet heb ik de volgende functie gevonden en in access gezet:
PHP:
Function FindAndReplace(ByVal strInString As String, _
        strFindString As String, _
        strReplaceString As String) As String
Dim intPtr As Integer
    If Len(strFindString) > 0 Then  'catch if try to find empty string
        Do
            intPtr = InStr(strInString, strFindString)
            If intPtr > 0 Then
                FindAndReplace = FindAndReplace & Left(strInString, intPtr - 1) & _
                                        strReplaceString
                    strInString = Mid(strInString, intPtr + Len(strFindString))
            End If
        Loop While intPtr > 0
    End If
    FindAndReplace = FindAndReplace & strInString
End Function
Ik ben verder niet bekend met VBA. Iemand die een oplossing weet?

Mvg,
Michael
 
Ik zou het in dit geval ook helemaal niet met Instr oplossen; ik neem aan dat je het personeelsnummer wel in een tabel hebt staan; als je dat uit het teksveld kunt trekken (dat dan wel opzoeken met Instr), dan kun je het tekstveld splitsen in een veld met het Persoonsnummer, en de Naam. De naam of het personeelsnummer kun je dan koppelen aan de andere tabel, en dan is het een simpele bijwerkquery om de velden over te zetten.
 
Bedankt voor je snelle reactie.
Dat heb ik in eerste instantie ook geprobeerd. Nu is het probleem dat bij de tabel die ik wil aanpassen de ene keer de voornaam erbij staan. Of er staat het soort contract tussen haakjes erbij (Oproep) of (Uitzend) bijvoorbeeld. Dus zodra ik het uit elkaar heb gehaald is het nog niet te koppelen met de andere tabel. Vandaar dat ik het op deze manier probeerde.
 
Je zult toch op de een of andere manier moeten koppelen op een combinatie van gegevens die uniek is. Heb je geen andere velden die je er bij kunt trekken?
 
Ik ben een andere oplossing aan het bedenken, zit even te kijken welke andere velden ik kan koppelen.
Maar is het niet mogelijk dat die Findandreplace functie iets aangepast kan worden waardoor hij het alleen vervangt als de hele cel overeenkomt met hetgeen ik in de functie zet? Dit ipv dat hij iets vervangt als ook een deel van de cel overeenkomt.
 
Bedoel je zoiets?

Code:
Function FindAndReplace(ByVal strInString As String, strFindString As String) As String
Dim intPtr As Integer
    If Len(strFindString) > 0 Then
        intPtr = InStr(strInString, strFindString)
        If intPtr > 0 Then
            FindAndReplace = Mid(strInString, Len(strFindString) + 1, Len(strInString))
        Else
            FindAndReplace = strInString
        End If
    End If
End Function
Deze haalt een waarde uit een veld (bijvoorbeeld personeelsnummer) en verwijdert het uit het andere veld.
 
Een gedeelte van die functie komt van pas ben ik achtergekomen. Ik zag dat in de andere database er ook het personeelsnummer toegevoegd kan worden. Vanuit de andere tabel hoeft dus in dat geval alleen nog de naam weggehaald worden. Kan ik daar dezelfde functie van jou voor gebruiken of kan dat ook met de eerste functie die ik erop had geplaatst? Alleen bij de laatstgenoemde kan het alleen per letter dacht ik.
 
Ik zou het niet per letter doen, zoals de eerste functie. Niet alleen omslachtige code, maar je wilt testen op de volledige veldinhoud, niet op een deel. Ik denk wel dat je de aangepaste functie kunt gebruiken. Probeer het eens uit...
 
Ik heb de functie in access gezet. Hoe kan ik deze dan laten uitvoeren in een query? Hierin heb ik nog weinig ervaring. Ik heb geprobeerd te werken met jokertekens, dit werkt alleen niet. Elke veld ziet er zo uit bijvoorbeeld: 00001 [Jan Jansen]. En alleen het nummer zou dus moeten overblijven.
 
Als het voorbeeld als maatstaf kan gelden, dan is het relatief simpel, en heb je geen aparte functie nodig. Dan zet je de volgende formule in een leeg veld:

Code:
Expr1: IIf(IsNumeric(Left([Naam];1));Left$([Naam];InStr(1;[Naam];" ")-1);"")

Ik heb er nog een check in gezet die controleert of het eerste teken van de reeks een cijfer is; heb je die niet nodig, dan krijg je zoiets:
Code:
Expr1: Left$([Naam];InStr(1;[Naam];" ")-1)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan