Find filnavn fra sti ved hjælp af en formel.

Denne artikel udnytter funktionen UDSKIFT, eller rettere en bestemt egenskab ved denne funktion, nemlig at den har et argument, som de øvrige funktioner i kategorien "tekstfunktioner" ikke har; det valgfri argument "forekomst", som vist i illustrationen til venstre. Dette betyder, at når man bruger denne funktion, kan man vælge hvilken forekomst af et eller flere tegn i en tekststreng, man vil arbejde med. Som det fremgår har funktionen fire argumenter, hvoraf de tre er obligatoriske. Det drejer sig om teksten, som noget skal udskiftes, den tekst, der skal udskiftes, det den skal udskiftes med og så til sidst altså det valgfrie argument, som fortæller hvilken forekomst af teksten, hvis den forekommer flere gange, som skal udskiftes. Specificeres der ingen forekomst, udskiftes samtlige forekomster. Denne egenskab ved funktionen udnytter vi så sammen med et par andre funktioner, til at løse opgaven, der er nævnt i overskriften, men lad mig se på et eksempel.

I et regneark har jeg i en kolonne (her A) nogle sti- og filnavne, fx:

Jeg vil nu gerne finde filnavnet. Som det fremgår af det viste lille eksempel, kan stierne være forskellige i længde, De har dog alle det til fælles at mapperne indbyrdes og filnavnet adskilles af det samme tegn, nemlig en '\' (backslash). Man kan naturligvis programmere en brugerdefineret funktion, der løses opgaven, men her løses den med en formel. Jeg viser først den samlede formel, og så forklarer jeg, hvad de enkelte dele gør. Er du ikke interesseret i forklaringen, kan du bare kopiere formlen og så ændre referencerne til de celler, du har brug for.

=HØJRE(A1;LÆNGDE(A1)-FIND("#";UDSKIFT(A1;"\";"#";LÆNGDE(A1)-LÆNGDE(UDSKIFT(A1;"\";"")))))

Først skal vi finde ud af, hvor mange '\', der er i strengen. Det gør vi med denne del af formlen.

LÆNGDE(A1)-LÆNGDE(UDSKIFT(A1;"\";""))

Den vil i det første eksempel give 2 og i det andet 4. Hvad er det formlen gør? Først finder vi længden af den oprindelige streng (hhv. 14 i række 1 og 30 i række 2) med  LÆNGDE(A1). Dernæst udskifter vi alle '\' ,med ingenting og finder længden af den nye streng med LÆNGDE(UDSKIFT(A1;"\";"")), som giver hhv. 12 og 26. Når vi så trækker de to tal fra hinanden, som vist i delformlen, får vi antallet af '\', og det er som nævnt 2 og 4

Nu skal vi så have fat i UDSKIFT en gang til, da vi skal udskifte '\' ,med '#'. I dette tilfælde skal vi dog ikke udskifte alle forekomster af '\',men kun den sidste, og det er her argumentet 'forekomst', kommer ind i billedet, og alene af den grund, at vi har lavet alle de indledende knæbøjninger, da den sidste forekomst jo altid vil være det samme som antallet af forekomster i alt.

UDSKIFT(A1;"\";"#";LÆNGDE(A1)-LÆNGDE(UDSKIFT(A1;"\";""))

Nu ville resultatet se således ud, hvis det faktisk blev vist i cellen.

Nu skal vi så finde den finde den position, som det nye tegn '#' står på, og det gør vi med

FIND("#";UDSKIFT(A1;"\";"#";LÆNGDE(A1)-LÆNGDE(UDSKIFT(A1;"\";""))))

som giver resultaterne hhv. 7 og 21. Nu skal vi så tage en del af strengen fra højre, men først skal vi lige finde ud af, hvor mange tegn, der skal med, og det gør vi med

LÆNGDE(A1)-FIND("#";UDSKIFT(A1;"\";"#";LÆNGDE(A1)-LÆNGDE(UDSKIFT(A1;"\";""))))

som taget den samlede længde af den oprindelige streng og fratrækker det, vi lige har beregnet. Her er svarene 7 og 9 i de to eksempler. Vi skal altså bruge de henholdsvis 7 og 9 tegn, som står længst til højre i den oprindelige streng, og så er vi tilbage ved den samlede formel

=HØJRE(A1;LÆNGDE(A1)-FIND("#";UDSKIFT(A1;"\";"#";LÆNGDE(A1)-LÆNGDE(UDSKIFT(A1;"\";"")))))

som giver henholdsvis ole.jpg og ingen.jpg i de to eksempler.

Jeg håber at dette var forståeligt, men ellers bare prøv at kopiere formlen og prøv selv med andre antal ' \' eller helt andre tegn. Det skal bare være det samme skilletegn overalt i strengen. Vil man gøre formlen mere fleksibel, så den kan bruges med andre tegn, kan man ændre den til fx

=HØJRE(A1;LÆNGDE(A1)-FIND(B2;UDSKIFT(A1;$B$1;$B$2;LÆNGDE(A1)-LÆNGDE(UDSKIFT(A1;"\";"")))))

hvor skilletegnet i strengen skrives i B1, og det tegn, der skal bruges midlertidigt skrives i B2.


Vil man finde filnavnet med en brugerdefineret funktion, kunne den se således ud.

Function filnavn(sti) As String
    filnavn = Mid(sti, InStrRev(sti, "\") + 1, Len(sti))
End Function