Avatar billede densortehingst Seniormester
20. februar 2019 - 12:57 Der er 6 kommentarer og
1 løsning

Makro

Ok jeg giver op og spørger herinde :)

Jeg har lavet en lille makro - lad os kalde den makro 3.

Den er indspillet automatisk og leder efter et ord i mit word dokument. Når den finder ordet sætter den 6 stjerner bagefter.
eks:
Søg ordet forår og sæt ******. Det virker.

Nu ville jeg gerne have makroen til at fortsætte og finde det næste "forår" og sætte 6 stjerner.

Når vi når eof skal makroen selvfølgelig stoppe :)

Hvordan gør man det ?
Avatar billede Lene Fredborg Ekspert
20. februar 2019 - 13:32 #1
Hvis du viser din nuværende makro, er det lettere at hjælpe dig. Ingen kan vide, hvordan din nuværende makro ser ud - det kommer an på, hvad du præcis har lavet under optagelsen.

Har du prøvet at optage, hvor du i Søg og erstat vælger "Erstat alle"?

En optaget makro er sjældent optimal, men måske det kan gå an i denne situation.
Avatar billede densortehingst Seniormester
20. februar 2019 - 13:36 #2
sådan: Grunden til at jeg sletter 1 bogstav i klik er den enkle, at den så ikke kan finde "klik" mere. Det kører i en tabel der er 5 spalter bred :)

    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "klik"
        .Replacement.Text = ""
        .Forward = True
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveRight Unit:=wdCharacter, Count:=1
    Selection.TypeBackspace
    Selection.MoveLeft Unit:=wdCell
    Selection.MoveLeft Unit:=wdCell
    Selection.MoveLeft Unit:=wdCell
    Selection.MoveLeft Unit:=wdCell
    Selection.MoveLeft Unit:=wdCell
    Selection.MoveLeft Unit:=wdCell
    Selection.MoveLeft Unit:=wdCell
Selection.TypeText Text:="#"
    Selection.MoveRight Unit:=wdCell
    Selection.MoveRight Unit:=wdCell
    Selection.MoveRight Unit:=wdCell
    Selection.MoveRight Unit:=wdCell
    Selection.MoveRight Unit:=wdCell
    Selection.TypeText Text:="#"
    Selection.MoveRight Unit:=wdCell
    Selection.MoveRight Unit:=wdCell
    Selection.MoveRight Unit:=wdCell
    Selection.MoveRight Unit:=wdCell
    Selection.MoveRight Unit:=wdCell
    Selection.TypeText Text:="#"
    Selection.MoveRight Unit:=wdCell
    Selection.MoveRight Unit:=wdCell
    Selection.MoveLeft Unit:=wdCell
    Selection.MoveLeft Unit:=wdCell
Avatar billede Lene Fredborg Ekspert
20. februar 2019 - 14:28 #3
Der er brug for lidt opklaring:
Det, makroen laver, passer ikke rigtigt med din første forklaring. Som jeg læser din første forklaring, skal ”klik” erstattes med ”klik******” alle steder.

Du skrev, at der skulle indsættes ****** efter det fundne, men du indsætter # ¨(og ikke kun efter ordet ”klik”) - hvad skal der indsættes?

Skal makroen kun finde forekomster af ordet ”klik” i tabellen og ikke i hele dokumentet?

Hvis ja, er markøren i tabellen, når makroen skal køres? (din makro starter med at flytte markøren til starten af dokumentet).

Skal makroen finde noget, hvor ”klik” er en del at et ord, f-eks. ”klikke” eller ”beklikke”?

Er der nogen speciel formatering i tabellen eller er alt formateret på samme måde?
Avatar billede densortehingst Seniormester
20. februar 2019 - 16:08 #4
Dokumentet består af 1 stor tabel på 5 kolonner * xxx rækker. Ja markøren står i dokumentet ved opstart,

Den første forklaring var ikke god nok. Makroen skal finde ordet "klik" (findes ikke i andre variationer (kikke, klikker etc). Når den finder ordet klik hopper den et antal rækker tilbage. Herefter sætter den et # i hver række og hoppe videre til næste række.

der er ingen speciel formatering eller lignende.
Avatar billede Lene Fredborg Ekspert
20. februar 2019 - 17:35 #5
Ja, det var jo en noget anden funktionalitet end først beskrevet ;-)

Forudsætningen for, at man kan lave en makro, som gør noget totalt styret, er, at det er soleklart, hvad der skal ske, og hvad udgangspunktet er. En makro gør lige præcis det, koden i den siger, den skal gøre – hverken mere eller mindre.

Din makrokode hopper ikke et antal rækker tilbage. Den finder første ”klik” og sletter sidste k deri. Derefter hopper den 7 celler til venstre - fortsætter i sidste celle i forrige række, når første celle i en række er nået, men hvis f.eks. det fundne "klik" er i første celle i tabellen, hopper den slet ingen steder, da der ikke er nogen celle til venstre. Derefter indsætter den # i den celle, den er nået til – den _overskriver_ indholdet i cellen med #, dvs. at evt. andet indhold i cellen slettes. Derefter hopper koden 5 celler til højre og overskriver cellens indhold med #. Da der er 5 kolonner ifølge din forklaring, vil det være i samme kolonne, som første # blev indsat i, men i rækken under. Dette gentages endnu én gang. Koden slutter med at rykke 4 celler til venstre uden af foretage noget.

Hvis der skal laves ordentlig kode, som ikke laver noget tilfældigt, er du nødt til at forklare præcist, hvad koden skal gøre. Er det f.eks. meningen, at # skal overskrive indhold i alle celler eller et bestemt antal celler lige under ”klik” (dvs. i samme kolonne) eller???

Står der ”klik” på vilkårlige steder i tabellen?

Måske du kan sende mig dokumentet, så jeg kan se indholdet sammen med en forklaring på, hvad du præcis vil opnå? (LF [at] thedoctools.com).
Avatar billede Lene Fredborg Ekspert
21. februar 2019 - 12:34 #6
Jeg har set på det tilsendte dokument og på baggrund af det + spørgsmål stillet via e-mail har jeg lavet en makro, som gør, hvad du har efterspurgt. Der er meget langt fra den oprindelige beskrivelse af problemet og den makro, du have optaget, til løsningen her ;-).

Aht. andre, som måske ser denne tråd: Det viste sig, at målet reelt var:
Find ”klik”, find en startrække, som er række nr. 67 FØR det fundne og slet i alt 79 (eller 80?) rækker fra startrækken og ned. Gentag, til der ikke findes flere ”klik”. Ifølge forklaringen, jeg har fået, vil der altid være tale om samme antal rækker, der skal slettes. Men jeg erfarede, at der ved sidste ”klik” i dokumentet IKKE er så mange rækker – derfor er der i makroen taget højde for dette.

Du kan bruge F8 til at steppe gemme én makrolinje ad gangen, mens du tester. Kodelinjerne, som står helt til venstre, og som indeholder ”.Select” er indsat for, at du ved at steppe gennem koden med F8 i makroeditoren kan se, hvilke rækker, der bliver udvalgt til at blive slettet – du kan slette de kodelinjer, når du har tjekket, at de rigtige rækker bliver markeret. Da rækkenumrene i dokumentet viste sig ikke at være fortløbende (manglende numre), skal du muligvis rette tallene 67 og 78 i koden, så det passer.

------------------MAKRO START------------------

Sub FindKlikDeleteRows()
    'Find "klik" og slet i alt 79 (evt. 80?) rækker, startende 67 rækker før det fundne
    Dim oTable As Table
    Dim rngDelete As Range
    Dim lngRowIndex_First As Long
   
    Set oTable = ActiveDocument.Tables(1)
   
RepeatFind:
    Set rngDelete = oTable.Range.Duplicate
   
rngDelete.Select
    With rngDelete.Find
        .ClearFormatting
        .Replacement.ClearFormatting
   
        .Text = "klik"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
   
        .Execute
       
        'gentag søgning/sletning af rækker, indtil der ikke findes flere "klik"
        If .Found = True Then
   
            With rngDelete
                'rngDelete indeholder nu det fundne
                'udvid rngDelete til at indeholde hele rækken
.Select
               
                .Start = .Rows(1).Range.Start
                .End = .Rows(1).Range.End
.Select
               
                'udvid rngDelete til at start 68 rækker før og indeholde i alt 80 rækker
                lngRowIndex_First = .Rows(1).Index - 67 '"klik"-rækker er allerede med
                .Start = oTable.Rows(lngRowIndex_First).Range.Start
.Select
                'hvis der er rækker nok til at udvide med 78, så gør det - eller til sidst i tabellen
                If oTable.Rows.Count >= lngRowIndex_First + 78 Then
                    .End = oTable.Rows(lngRowIndex_First + 78).Range.End
                Else
                    .End = oTable.Range.End
                End If
.Select
                'rngDelete indeholder nu alle de 80 rækker - slet dem
                .Rows.Delete
            End With
           
            'fortsæt søgning
            GoTo RepeatFind
        Else
            'ikke fundet "klik"
            GoTo ExitHere
        End If
           
ExitHere:
        'ryd op i Søg og erstat dialogboks
        .Replacement.Text = ""
    End With
End Sub
------------------MAKRO SLUT------------------
Avatar billede densortehingst Seniormester
22. februar 2019 - 09:38 #7
Stor tak til Lene for løsningen. DXen virker fint, selvom jeg ikke helt kan gennemskue hvad den laver :)
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
Tag et kursus i Word og øg effektiviteten

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