Tekstfuncties

Status
Niet open voor verdere reacties.

Chrisss

Gebruiker
Lid geworden
20 jan 2006
Berichten
72
Beste Accessers,

Ik hoop dat jullie mij kunnen helpen met de twee volgende dingetjes.

1.
Ik ben bekend met de functies Left, Mid en Right.
Stel: [nummer] = "0123456789"
Mid([nummer];4;2) geeft dan "34" als resultaat.
Bestaat er echter ook een functie die vanaf rechts gaat tellen zodat het resultaat "67" is?

2.
[nummer]="012S.3AB456.789"
Bestaat er een functie die de punten weghaalt, ongeacht waar ze staan?
Zodat het resultaat dus "012S3AB456789" is.

Dank en groet,

Chris
 
Vraag 2 is het makkelijkst:
tmp:Replace([Veld];".";"")

Vraag 1: er is bij mijn weten niet zo iets als een rechtstellende Mid functie. Wat ik in dat geval doe, is met Len([Veld]) de lengte van de string bepalen, en de beginpositie daar van af laten hangen.
Je kirjgt dan:
tmp:Mid([Veld];Len[Veld])-4;2)
 
INFO:
LEN()
LEFT()
RIGHT()
MID()

1.
Ik ben bekend met de functies Left, Mid en Right.
Stel: [nummer] = "0123456789"
Mid([nummer];4;2) geeft dan "34" als resultaat.
Bestaat er echter ook een functie die vanaf rechts gaat tellen zodat het resultaat "67" is?

SELECT LEFT(RIGHT('0123456789', 4),2)

Output : 67

Byee VRC
 
Laatst bewerkt:
Bedankt,

vraag 2 kan inderdaad op die manier oplossen.

De functie 'Replace' geeft mij in een selectiequerie echter de melding
'De expressie bevat een ongedefinieerde functie 'Replace'.
Ik doe precies wat Octafish aangaf. Werkt het niet in een selectiequerie?

Groet,

Chris
 
Ik heb net dit in een db geprobeerd: tmp: Replace([Product FR];" ";"|") en het werkt prima.
Hoe wil je de functie gebruiken? In een bijwerkquery? Want dan moet je de veldnaam (tmp) weglaten.
 
bedankt,

vraag 2 kan inderdaad op die manier oplossen.

De functie 'replace' geeft mij in een selectiequerie echter de melding
'de expressie bevat een ongedefinieerde functie 'replace'.
Ik doe precies wat octafish aangaf. Werkt het niet in een selectiequerie?

Groet,

chris

select replace('012s.3ab456.789','.','');
 
Ik typ het toch echt wel goed in.
Bij een bijwerkquery werkt het ook niet.
Nou zag ik net een oudere post hier van iemand waarbij 'replace' ook niet werkt.
Hij werd door Octafish via het visual basic-scherm naar 'verwijzingen..' verwezen.
Bij mij staat daar een hele lijst met niet aangevinkte verwijzingen.

Aan staan: -Visual Basic For Applications, -Microsoft Access 8.0 Object Library, -Microsoft DOA 3.51 Object Library

Verder staan en nog meer dan honderd (!) uitgeschakeld. Moet er misschien toch eentje aanvinken hier?

Als ik naar de Functies-map ga in 'Opbouwfunctie voor expressies' staat 'Replace' er ook inderdaad niet bij. (Mid, Left, en dat soort dingen wel...)

Moet ik het in deze hoek zoeken?
 
Laatst bewerkt:
Welke Access versie gebruik je? Want 8 is wel heel oud volgens mij.
 
Nou, ik gebruik Access 97.
Dat is inderdaad misschien wat verouderd, maar verder werkt het altijd perfect.
Hebben ze 'replace' pas na 1997 bedacht? Dan houdt het op natuurlijk...
 
bij mij werkt het gewoon.
ik deed het eerst in MS SQL Server 2005 maar zag net boven dat je het in een access topic had geplaatst dus heb ik ff een access bestandje gemaakt en getest en het werkt.
zie bijlage.

Byee VRC
 

Bijlagen

Het kan zijn dat je een extra bibliotheek nodig hebt. Je kunt eens proberen om de Microsoft Office #.0 Object Library erbij te zetten. (# zal ook wel 8 zijn...)
 
Bedankt Visha, ik kan echter alleen .mdb openen volgens mij; geen .accdb in ieder geval.
Ik geloof echt dat die replace-functie de manier is, maar mijn computer kent hem niet.
Ter indicatie; als ik een formule begin met 'right' dan maakt ie van de 'r' een 'R' als ik klaar ben, wat aangeeft dat access 'm kent. De 'r' van 'replace' blijft een 'r'.

Octafish, Microsoft Office 8.0 Object Library aanvinken heeft niet geholpen. Access wel opnieuw gestart, maar helaas.
Baal er wel van; 'replace' zou echt uitkomst bieden om punten en komma's uit nummers te halen...
 
Bedankt Visha, ik kan echter alleen .mdb openen volgens mij; geen .accdb in ieder geval.
Ik geloof echt dat die replace-functie de manier is, maar mijn computer kent hem niet.
Ter indicatie; als ik een formule begin met 'right' dan maakt ie van de 'r' een 'R' als ik klaar ben, wat aangeeft dat access 'm kent. De 'r' van 'replace' blijft een 'r'.

Octafish, Microsoft Office 8.0 Object Library aanvinken heeft niet geholpen. Access wel opnieuw gestart, maar helaas.
Baal er wel van; 'replace' zou echt uitkomst bieden om punten en komma's uit nummers te halen...

Gebruik maken van VBA.
Alt+F11
 
Je kunt zelf een functie maken, zoals deze:

Code:
Public Function TekstVervangen(Tekst As String, Vervangtekst As String, Optional VervangDoor As String)

    If Nz(VervangDoor, "") = "" Then VervangDoor = ""
    TekstVervangen = Replace(Tekst, Vervangtekst, VervangDoor)

End Function

Je zet hem in een willekeurige (nieuwe) module.

Gebruik:

Expr1: TekstVervangen([Besluiten];" ") waarbij het derde element leeg blijft
Expr1: TekstVervangen([Besluiten];" ";"|") waarbij het derde element de vervangende tekst is.
 
Okay, dat klinkt goed.

Bij uitvoeren krijg ik nu de module te zien en een melding:
Compileerfout:
Sub of Function is niet gedefinieerd

Vervolgens wordt de eerste regel geel.
Het woord Replace wordt blauw.

Wel het gevoel dat ik er bijna ben!!
 
Laatst bewerkt:
We hebben de botte bijl methode nodig, want hij kent Replace dus echt niet....

Code:
Public Function TekstVervangen(Tekst As String, Vervangtekst As String, Optional VervangDoor As String)
Dim i As Integer
Dim Tmp As String

    If Nz(VervangDoor, "") = "" Then VervangDoor = ""
    For i = 1 To Len(Tekst)
        If Mid(Tekst, i, 1) = Vervangtekst Then
            Tmp = Tmp & VervangDoor
        Else
            Tmp = Tmp & Mid(Tekst, i, 1)
        End If
    Next i
    TekstVervangen = Tmp

End Function
 
Ik doe een dansje door de kamer!!!

Ik snap geen hol van die code, maar het werkt perfect!!!

Super bedankt weer eens!!

Groet,
Chriss
 
Het is wel zo handig als je het wel snapt, dus een kleine uitleg, als je uitgedanst bent ;)
Je hebt eerst een check of je de derde parameter wel hebt ingevuld. Waarschijnlijk is die niet eens nodig, maar hij kan geen kwaad...

Vervolgens wordt er een loop gemaakt, die gedurende de lengte van de aangeleverde tekst elk karakter apart inleest. (Mid(Tekst, i, 1)) Als de loop 5 keer heeft gelopen, dan is i=6, en dan pakt Mid(Tekst,6,1) dus het 6e teken.

For i = 1 To Len(Tekst)
If Mid(Tekst, i, 1) = Vervangtekst Then
Tmp = Tmp & VervangDoor
Else
Tmp = Tmp & Mid(Tekst, i, 1)
End If
Next i

Elk teken wordt vergeleken de te vervangen tekst (één teken overigens; als je meer tekst tegelijk wilt vervangen, moet ik de functie aanpassen).
Als het teken overeenkomt met de variabele VervangDoor, dan wordt dat teken toegevoegd aan de tijdelijke tekstvariabele tmp, anders wordt het teken zelf toegevoegd aan de tijdelijke variabele. Als de hele tekst is gecontroleerd, dan wordt de variabele tmp toegewezen aan de functie.
Laat nog maar even weten of je ook meerdere tekens tegelijk wilt kunnen vervangen, want dan pas ik de functie wel aan.
 
Ja, ik begin denk ik er wel logica in te zien.
Hij bouwt dus Tmp vanaf het begin op door als het teken niet overeenkomt met 'vervangtekst' het origineel te nemen, en komt ie wel overeen 'vervangdoor' te gebruiken. Als de hele tekst is doorlopen wordt Tmp het resultaat van de functie.
Toch?

Ik heb zeker wel belang bij de functie die ook voor meerdere tekens werkt!
Sla ik die mooi op, want die komt gauw genoeg van pas.
Leuk om die code's een beetje te leren snappen. Je kunt er zoveel meer mee dan de standaard functies van Access. Ik moet maar een cursus gaan doen, denk ik.
 
Enige nadeel van zo'n eigen 'replace' functie is dat Access daar heel langzaam mee omgaat t.o.v. ingebouwde replace. Op zich niet zo'n ramp, maar ik werk hier bv vaak met tabellen met tussen de 50 en 100 duizend records, en dan wordt je daar niet vrolijk van. Zou als ik jou was toch eens kijken naar een 2000 of 2003 versie.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan