Avatar billede Fredeo Nybegynder
02. januar 2010 - 18:25 Der er 4 kommentarer og
1 løsning

Makro til fjernelse af bestemte linjer i Word

Jeg har følgende problem: Jeg modtager data fra en database som Word-dokument, hvor hver post i db er opstillet som vist nedenfor. Jeg har imidlertid brug for, at ændre opstillingen for at kunne importere det i et andet program.

1 (post nr.)
Variabel1, Variabel2, Variabel3
Plan: Variabel4; Snit: Variabel5; Beskrivelse: Variabel6

2
Variabel1, Variabel2, Variabel3
Plan: Variabel4; Snit: Variabel5; Beskrivelse: Variabel6
etc.

Kunsten er nu at få Word-dokumentet ændret, så hver post ser ud som følger:

1
Snit: Variabel5
Beskrivelse: Variabel6

2
Snit: Variabel5
Beskrivelse: Variabel6

Det er lykkedes at lave en simpel lille makro der udfører en række søg og erstat sekvenser, det går fint når jeg bare skal søge efter linjeskift, dobbelt linjeskift og semikolon, men problemet er at få anden linje i hver post slettet (Variabel1, Variabel2, Variabel3). Formateringen (fx linjeskift) er som vist i eksemplerne.
Avatar billede Lene Fredborg Ekspert
02. januar 2010 - 19:33 #1
Et par spørgsmål for at finde den enkleste måde at klare det på:
Er der to linjeskift, hver gang en ny post starter - og ingen andre steder?
Består hver post af præcis 3 afsnit?
Starter post 1 som første afsnit i dokumentet?
Avatar billede Fredeo Nybegynder
02. januar 2010 - 19:49 #2
Ja hver post er adskildt af dobbelt linjeskift og det er kun her de bruges - men der skal også være dobbelt linjeskift mellem posterne i resultatet.

Ja hver post består af præcis tre afsnit.

Ja post 1 (er en tal-variabel) er det første i dokumentet.
Avatar billede Lene Fredborg Ekspert
03. januar 2010 - 00:10 #3
Under de givne forudsætninger og under forudsætning af, at "afsnittene" virkelig er afsnit - afsluttet med afsnitstegn - bør du kunne køre nedenstående kode før den kode, du selv har skrevet. Makroen starter med 2. afsnit i dokumentet sletter det. Derefter slettes til slutningen af dokumentet er nået nr. 3 efterfølgende afsnit (hver post indeholder reelt 4 afsnit inkl. det tomme afsnit imellem, men da 2 afsnit lige er slettet fra den behandlede post, er det 3. efterfølgende afsnit, der skal slettes):

Sub DeleteParagraph2FromEachRecord()
    Dim n As Long
   
    With ActiveDocument
        For n = 2 To .Paragraphs.Count Step 3
            'Der slettes løbende afnit - stop når enden af dokument er overskredet
            If n > .Paragraphs.Count Then Exit For
            .Paragraphs(n).Range.Delete
        Next n
    End With
End Sub

Det kunne gøres på andre måder også…
Jeg har jo ikke set din kode, så jeg kan ikke vide, om der kan "rationeres" i det, der laves deri. Bemærk, at makroen ovenfor ikke på noget tidspunkt ændrer på Selection.
Avatar billede Fredeo Nybegynder
03. januar 2010 - 08:22 #4
Endnu en stor tak det virker fint :-)
Som du kan se nedenfor bruges der to kodesystemer. Det virker og er vel ikke noget problem? Send dit svar og de skal få dine velfortjente point.

Sub KlargørDokument()
    Dim n As Long
   
    With ActiveDocument
        For n = 2 To .Paragraphs.Count Step 3
            'Der slettes løbende afnit - stop når enden af dokument er overskredet
            If n > .Paragraphs.Count Then Exit For
            .Paragraphs(n).Range.Delete
        Next n
    End With
   
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "Plan:*; Snit:"
        .Replacement.Text = "Snit:"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "; "
        .Replacement.Text = "^p"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

End Sub
Avatar billede Lene Fredborg Ekspert
03. januar 2010 - 09:40 #5
Dejligt at det virker hos dig.
Når din kode virker, som den skal, så kan du fint lade den være.

Et tip, som du måske kan bruge på sigt: Generelt kan det være en god idé så vidt muligt at bruge "Range" i stedet for "Selection". Koden vil normalt køre hurtigere, og man undgår problemer med at holde styr på, at der hele tiden ændres på, hvad der er "selected" i dokumentet. Det kan dog tage noget tid at lære at forstå, hvordan man bruger Range.
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
Kurser inden for grundlæggende programmering

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