Tekst rechts van dubbele punt extraheren

Status
Niet open voor verdere reacties.

0909E9UIDQW

Nieuwe gebruiker
Lid geworden
31 mei 2012
Berichten
3
Hallo,

In Access importeer ik met regelmaat een tabel (vanuit een Excel bestand). Dit bestand wordt mij standaard aangeleverd.
Hier zit een bepaalde kolom in met velden die leeg zijn of gevuld zijn met: willekeurige tekst, dan een dubbele punt en dan een e-mailadres.
Het veld heet [tekstblok1]

Wat ik nu graag wil is in mijn Access-tabel een berekend veld maken, die standaard via een expressie de tekst rechts van de dubbele punt overneemt. Met andere woorden: het e-mailadres haalt uit het veld [telstblok1].
Ik zit wat te klooien, maar ik krijg het niet gedaan. Het gedeelte voor de spatie is geen enkel probleem: Left([tekstblok1];InStr(1;[tekstblok1];":"))
Maar als ik met MID, Right of Trim begin krijg ik steeds SYNTAX meldingen.

Kan iemand mij helpen?

Alvast bedankt,

Groet,

Serge
 
Laatst bewerkt:
Om te beginnen: waarom een berekend veld? Lijkt mij geen handige optie. Ik zou sowieso een aparte tabel maken waarin je de correcte opmaak op de velden toepast, en waarin je de excel tabel importeert. Dan heb je 2 voordelen: a) je hebt controle over de importgegevens, en je hebt altijd de juiste opmaak in je hoofdtabel. En je hebt de mogelijkheid om de gegevens nog te filteren en controleren (eigenlijk 3 voordelen dus ;) ). But wait, there's more: je hebt ook nog eens geen berekend veld nodig in je tabel, want wat je wilt (het tekstveld splitsen) kan makkelijk door de gescheiden velden in de juiste velden te importeren (voordeel 4). Kan er nog wel meer verzinnen als je beter overtuigd wilt worden :).
Het splitsen zou met Left en Right moeten kunnen, want beide opties werken op dezelfde manier. Alleen werkt de ene van links, en de ander van rechts. Dus ik ben benieuwd naar de code die je met Right hebt gemaakt en die niet werkt.
 
Dank voor je reactie Michel.

Je hebt al door dat ik absoluut geen gevorderde ben. Ik neem je advies ter harte.
Met de Right code maak ik vast een ontzettende noop denkfout: Right([tekstblok1];InStr(1;[tekstblok1];":"))
De logica van Left snap ik, maar van Right is voor mij zoiets als achteruit rijden met een aanhanger. Ik stuur dan altijd de verkeerde kant op. :o

Kun je me op weg helpen?

Serge
 
Je moet eerst proberen de functie te snappen, voordat je hem kunt toepassen. De functie Left heeft deze opbouw: Left(«string»; «lengte»). De functie Right deze: Right(«string»; «lengte»). Daar zit dus geen verschil in. Nog een overeenkomst: ze vragen beide welk veld, en hoeveel tekens je wilt. Bij Left is dat simpel te bepalen, want je zoekt een specifiek teken op met Instr en (dat teken hoef je zelf niet neem ik aan) en daar trek je 1 positie van af. Dus deze formule is precies goed:
Code:
Expr1: Left([tekstblok1];InStr(1;[tekstblok1];":")-1)
Bij Right weet je niet precies hoeveel tekens je vanaf rechts moet ophalen, maar toch is dat wel te bedenken. Als je weet dat een bepaalde string 30 tekens lang is, en als je ook weet dat de dubbele punt op positie 14 staat, dan heb je 30-14=16 tekens nodig vanaf rechts. De truc is dus dat je de lengte van de string uitrekent, en daar de startpositie van af trekt. En dan krijg je deze formule:
Code:
Expr2: Right([tekstblok1];[COLOR="#0000FF"]Len([tekstblok1])[/COLOR]-[COLOR="#FF0000"]InStr(1;[tekstblok1];":")[/COLOR])
En dat is dus je uitkomst :)
 
Ik had nog meer varianten geprobeerd. Maar het lukte me dus ab-so-luut niet.
Tja. En zo als je het beschrijft klinkt het zo simpel en logisch.

Ik heb je formule geprobeerd. En het werkt. Uiteraard!

Hartelijk dank voor de snelle reactie, de oplossing én niet te vergeten voor je uitleg. Ik geloof dat ik nu de logica snap.

Serge
 
Als beter alternatief, in dit geval, voor de functie Right, kun je de functie Mid gebruiken, of nog beter Mid$
Deze functie heeft 3 argumenten: Mid$(tekenreeks, begin, lengte)
Maar het derde argument (de lengte) is optioneel. Dus als je het 3de argument niet invult, wordt de lengte vanzelf tot het einde van de tekenreeks berekend.
Het wordt dan:
Code:
Mid$([tekstblok1];InStr([tekstblok1];":")+1)

Opmerking:
Let ook op de functie InStr zoals ik die hier gebruik. Het eerste argument (de start positie) wordt door mij niet ingevuld. Omdat ook dit argument optioneel is, wordt bij niet invullen automatisch startpositie 1 gebruikt.
 
Ik zie niet hoe het een beter alternatief is: het is niet sneller, en bereikt exact hetzelfde. Bovendien weet TS nu hoe hij de functie Right moet gebruiken :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan