Avatar billede sigurd_h Praktikant
07. september 2009 - 11:57 Der er 7 kommentarer og
1 løsning

Andet sidste ord i sætning

Hej

Jeg har en lang sætning, men jeg ønsker kun at bruge det andet sidste ord i sætningen.
Hvordan trækker jeg det ud?

Pft.

Sigurd
Avatar billede tjacob Juniormester
07. september 2009 - 12:40 #1
Her er en makroløsning:

Find det sidste og næstsidste mellemrum i sætningen med InStrRev, og derefter selve ordet med Mid. For eksempel sådan her:

Dim OrgStr As String, NewStr As String, i As Long, j As Long
OrgStr = "Dette bla bla bla bla bla bla bla bla er en meget lang sætning."
i = InStrRev(OrgStr, " ", , vbTextCompare)
j = InStrRev(OrgStr, " ", i - 1, vbTextCompare)
NewStr = Mid(OrgStr, j + 1, i - j - 1)

NewStr indeholder nu: "lang"

Du skal nok lave noget errorhandling for det tilfælde at der ikke ER to mellemrum i sætningen.

Du kan også lave det med formler (FIND og MIDT), men da der (såvidt jeg kan se) ikke er en FIND-funktion der søger bagfra (som InStrRev), bliver det temmelig besværligt.

Hvis du har brug for hjælp til at anvende makroen, så sig til.
Avatar billede martin_moth Mester
07. september 2009 - 12:41 #2
Der er mindst 2 måder i VBA:


Første alternativ

1. Indlæser sætningen i en string-variabel
2. Trimmer alle mellemrum efter sidste ord vær (RTrim)
3. Finder position på sidste mellemrum (InStrRev)
4. Med udgangspunkt i denne position, finder du det nærmeste mellemrum før positionen fundet i punkt 3 (InStrRev)
5. Du tager ordet mellem positionerne fundet i punkt 3 og 4, og gemmer det i en ny stringvariabel (Mid)

Variablen i punkt 5. indeholder næstsidste ord

Andet alternativt:

1)indlæs sætningen i en stringvariabel
2) Fjern alle mellemrum før første og efter sidste ord (RTrim og LTrim)
3) Opret et array med en post for hvert for ved at bruge funktionen Split med et mellemrum " " som delimiter
Næstsidste position i arrayet indeholder dit ord - og næstsidste position kan du finde med UBound, og trække en fra
Avatar billede martin_moth Mester
07. september 2009 - 12:44 #3
Nå - tjacob var allerede i gang. Han har løst mit "alternativ 1" fuldstændigt som jeg har beskrevet, pånær at han springer punkt 2 over ;-)
Avatar billede sigurd_h Praktikant
07. september 2009 - 12:48 #4
Mange tak for dit svar.

Jeg vil gerne have hjælp til anvendelsen, jeg har ca. 1500 rækker. De ligger alle i A.
Jeg kunne godt tænke mig det andet sidste ord i B.

Kan du hjælpe? :)

Sigurd
Avatar billede tjacob Juniormester
07. september 2009 - 13:02 #5
Det nemmeste er at lave det som en funktion du kan bruge direkte i regnearket:

Sådan gør du:

1. Indsæt et modul i Visual Basic
2. I modulet indsætter du følgende:

Public Function FindOrd(Byval pStr as String) As String
   
    Dim OrgStr As String, NewStr As String, i As Long, j As Long
    OrgStr = RTrim(pStr)
    i = InStrRev(OrgStr, " ", , vbTextCompare)
    j = InStrRev(OrgStr, " ", i - 1, vbTextCompare)
    NewStr = Mid(OrgStr, j + 1, i - j - 1)
    FindOrd = NewStr

End Function

-Bemærk at jeg har indsat Martins meget fornuftige tjek for efterfølgende space.

3. I regnearket bruger du funktionen som alle andre:

Hvis sætningen ligger i A1, så indsætter du:  =FindOrd(A1) i B1

Den kan du 'trække' ned i hele B-kolonnen.
Avatar billede tjacob Juniormester
07. september 2009 - 13:29 #6
Nu nævnte jeg jo Errorhandling, men glemte det selv:
Funktionen bør se sådan ud:

Public Function FindOrd(Byval pStr as String) As String
 
    On Error GoTo ErrorHandler
    Dim OrgStr As String, NewStr As String, i As Long, j As Long
    OrgStr = RTrim(pStr)
    i = InStrRev(OrgStr, " ", , vbTextCompare)
    j = InStrRev(OrgStr, " ", i - 1, vbTextCompare)
    NewStr = Mid(OrgStr, j + 1, i - j - 1)
    FindOrd = NewStr
ErrorHandler:
    FindOrd=""
    Resume Next

End Function

-Så vil der komme en tom celle ved fejl.
Avatar billede tjacob Juniormester
07. september 2009 - 13:32 #7
UPS: Der var en lille fejl:

Sådan:

Public Function FindOrd(Byval pStr as String) As String

    On Error GoTo ErrorHandler
    Dim OrgStr As String, NewStr As String, i As Long, j As Long
    OrgStr = RTrim(pStr)
    i = InStrRev(OrgStr, " ", , vbTextCompare)
    j = InStrRev(OrgStr, " ", i - 1, vbTextCompare)
    NewStr = Mid(OrgStr, j + 1, i - j - 1)
    FindOrd = NewStr
    Exit Function
ErrorHandler:
    FindOrd=""
    Resume Next

End Function
Avatar billede tjacob Juniormester
22. september 2009 - 18:31 #8
Hvad så sigurd_h?
Hvis du ikke kunne bruge mine (eller martins) tips, så tag points selv.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester