28. januar 2010 - 09:48Der er
3 kommentarer og 1 løsning
Slette indhold i bogmærke, samt bogmærke
Indsætter "tekstsæt" i et dokument. Disse består af en tekstlinje (punktopstilling) et sted i dok. samt 2 rækker i en eksisterende tabel (i dok.) et andet sted. Der er flere forskellige "tekstsæt". Kan man mærke de enkelte tekstsæt, så man senere kan fortryde og slette et givent "tekstsæt". Indsættelse af "tekstsættene" "foregår" med VBA
Det kan jo være lidt svært at råde dig uden at kende mere til dit projekt.
Kodelinjen ActiveDocument.Bookmarks("Test").Delete sletter bogmærket "Test", men bevarer indholdet
Kodelinjen ActiveDocument.Bookmarks("Test").Range.Delete sletter bogmærket "Test" OG indholdet i bogmærket (det, du ønsker at opnå)
Der vil være flere muligheder for at gøre det, du gerne vil. En mulighed er, at du under indsættelse af "tekstsættene" også opretter 2 bogmærker, som "omkranser" det indsatte. Så kan det lade sig gøre at slette indholdet ved at bruge princippet fra 2. kodelinje ovenfor. Men du skal jo selv have styr på bogmærkenavnene.
Princippet i kode, der kan slette indhold i bogmærker i det aktive dokument, kunne være:
Dim strBName As String
'Bogmærkets navn strBName = "MitBogmærke"
With ActiveDocument 'Tjek om bogmærket findes If .Bookmarks.Exists(strBName) Then .Bookmarks(strBName).Range.Delete Else 'Bogmærket findes ikke - vis en meddelelse MsgBox "Teksten kunne ikke slettes, da et bogmærke med navnet """ & _ strBName & """ mangler.", _ vbOKOnly + vbInformation, "Tekst kunne ikke slettes" End If End With
Du kunne bygge koden ind i en Function eller Private Sub, som kan kaldes, hver gang et bogmærke med indhold skal slettes. Du kan sende bogmærkenavnet med som parameter. Du skal så håndtere det på passende vis, hvis der er problemer - hvis f.eks. det ene bogmærke var der, men det andet ikke.
Generelt: bogmærker er sårbare. En bruger kan slette et bogmærke uden at vide det.
Jeg sætter 2 bogmærker ind ved hver tekstsæt - et ved den tekst, som er punktopstillet(a) og et ved den, der er i tabel (b). Da der er en tabel, kører jeg koden "2 gange":
Sub FjernTekstsæt()
' ' Hvis bogmærke eksisterer for tekst ' If ActiveDocument.Bookmarks.Exists("a") = True Then ' ' Slet ' ActiveDocument.Bookmarks("a").Select Selection.Delete End If
' ' Hvis bogmærke eksisterer for tabel ' If ActiveDocument.Bookmarks.Exists("b") = True Then ' ' Slet ' ActiveDocument.Bookmarks("b").Select Selection.Rows.Delete End If End Sub
De tekstsæt, der sættes ind skal selvfølgelig have unikke bogmærkenavne, som bliver indsat, når teksten sættes ind. De omkranser tekstsættene. Når tekstsættene sættes ind afspilles koden først for at sikre mod dubletter.De enkelte tekstsæt kan evt slettes via en knap for hvert sæt. Der er rigtigt, at bogmærkerne er sårbare, men de dokumenter, der er tale om, sættes der kun tekst ind i via makroer.
Lige et tip: Hvis du bruger min version, hvor der er brugt Range i stedet for Selection, har du den fordel, at du overhovedet ikke behøver at ændre på, hvad der er markeret i dokumentet (Selection). Så skal du ikke holde styr på at finde tilbage igen. Der er også andre fordele ved at bruge Range i stedet for Selection - f.eks. vil koden typisk være hurtigere, og der er ingen flimren på skærmen.
For at få koden til at slette tabelindhold inkl. selve rækkerne kan du bruge: ActiveDocument.Bookmarks("b").Range.Rows.Delete
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.