Avatar billede nph12 Nybegynder
15. marts 2009 - 11:10 Der er 18 kommentarer og
1 løsning

VBA: Manipulation af bogmærke

Hej
Er det muligt, at manipulerer med et bogmærke? Hvis ja, hvordan kan jeg manipulerer med et bogmærke som indeholder et tidsformat?
Avatar billede Lene Fredborg Ekspert
15. marts 2009 - 16:37 #1
Ja det er muligt, men du skriver ikke, hvilken form for manipulation, du vil lave. Vil du udskifte indholdet i bogmærket, vil du flytte eller slette bogmærket eller noget helt tredje?

Hvis du via VBA ændrer indholdet i et bogmærke, bliver bogmærket slettet. Du er derfor nødt til via VBA-koden at oprette bogmærket igen, hvis du skal bruge det. Se denne (engelske) artikel, hvor du finder kode, der viser principperne:
http://www.word.mvps.org/FAQs/MacrosVBA/InsertingTextAtBookmark.htm
Avatar billede nph12 Nybegynder
15. marts 2009 - 17:11 #2
Jeg har et bogmærke som hedder "dagsdato" som altid brevfletter i følgende format 15. marts 2009. Desværre jeg ikke ændre bogmærket "dagsdato" og derfor vil jeg godt manipulerer bogmærket, så det kommer til at se sådan ud 15.03.2009. Hvordan gør jeg dette?
Avatar billede Lene Fredborg Ekspert
15. marts 2009 - 22:28 #3
Bliver datoen indsat _før_ brevfletningen? Hvis datoen først bliver indsat som led i selve brevfletningen, nytter det ikke at gøre noget i forhold til bogmærket. Bogmærket eksisterer nemlig ikke i det flettede dokument.
Avatar billede nph12 Nybegynder
16. marts 2009 - 08:24 #4
Det dokument jeg fletter til indeholder forskellige bogmærker (også dagsdato) som bliver udfyldt, når vi brevfletter med vores journaliseringssystem.

Hvis jeg skal prøve, at manipulerer med dagsdato, hvad skal jeg så gøre?
Avatar billede Lene Fredborg Ekspert
16. marts 2009 - 12:09 #5
F.eks. sådan:

Sub UdskiftDagsDato()
   
    Dim oRange As Range
   
    With ActiveDocument
        If .Bookmarks.Exists("dagsdato") = True Then
            Set oRange = .Bookmarks("dagsdato").Range
            'Antag at bogmærket altid skal indeholde dags dato
            oRange.Text = Format(Date, "dd.mm.yyyy")
            'Opret bogmærke igen
            .Bookmarks.Add "dagsdato", oRange
        End If
    End With
   
    'Ryd op
    Set oRange = Nothing
End Sub
Avatar billede nph12 Nybegynder
16. marts 2009 - 14:44 #6
Hvordan virker koden? Hvor skal jeg sætte koden ind henne?
Avatar billede Lene Fredborg Ekspert
16. marts 2009 - 15:17 #7
Har du set på, hvad jeg har skrevet i koden?
Koden finder bogmærket "dagsdato" (hvis det findes) og udskifter indholdet i det med dags dato skrevet i det format, du bad om.

Ud fra dit oprindelige spørgsmål går jeg ud fra, at du i forvejen har noget VBA-kode, som du bruger i denne sammenhæng. Koden er skrevet som er hel makro, som du evt. kan kalde fra en anden makro på det sted i din kode, hvor datoen skal udskiftes. Hvis du udelader Sub.../End Sub-linjerne, kan du også indsætte koden midt i en anden makro på det sted, hvor udskiftningen af datoen skal finde sted.
Avatar billede nph12 Nybegynder
16. marts 2009 - 15:51 #8
Desværre kender jeg ikke det store til vba. Jeg har kun indsæt de bogmærker som jeg skal bruge i mit word-dokument. Bogmærkerne er defineret fra det system, hvor jeg skal brevflette mine oplysninger fra.

Hvordan kalder jeg en makro?
Avatar billede Lene Fredborg Ekspert
16. marts 2009 - 17:02 #9
Det var jo en anden sag. Du har skrevet spørgsmålet i VBA-gruppen, og jeg gik derfor ud fra, at du i forvejen brugte VBA i forbindelse med opgaven.

Da der er et andet system involveret i denne forbindelse - (du skrev om et journaliseringssystem), et system, som jeg af gode grunde ikke kender noget til - vil jeg ikke forsøge at forklare dig, hvad du skal gøre. Tingene skal jo foregå i den rigtige rækkefølge/på den rigtige måde.

For generel information om installation af makroer kan du f.eks. se denne (engelske) artikel:
http://www.gmayor.com/installing_macro.htm

Du kan også prøve at "Running a macro automatically when a document is created, opened or closed":
http://word.mvps.org/faqs/macrosvba/DocumentEvents.htm
Avatar billede nph12 Nybegynder
16. marts 2009 - 20:07 #10
Ja, jeg har læst koden, men det jeg ikke forstod var oRange (hvad betyder o?)

Måske kan der bruges noget fra denne tråd:

http://www.eksperten.dk/spm/612744

Jeg prøver lige din kode i morgen på arbejdet
Avatar billede Lene Fredborg Ekspert
16. marts 2009 - 20:42 #11
I koden stod der:
Dim oRange As Range

oRange har jeg således brugt som navn på en variabel af typen Range. Jeg bruger "o" foran i navnet i dette tilfælde, fordi Range er et objekt. Som ved andre variable kan man bruge de navne, man vil. Hvis det var navnet på en variabel af typen String, ville jeg bruge "str" foran.

Om Range:
Når du har markeret noget i et dokument, kan du referere til det via VBA vha. "Selection". Hvis du bare har et indsætningsmærke, indeholder Selection første tegn til højre for indsætningsmærke.

Range kan bruges lidt i samme retning som Selection, nemlig til at referere til noget bestemt, som man så kan manipulere på den ene eller den anden måde. Du kan gøre noget med Range _uden_ at ændre på, hvad der er markeret i dokumentet. Det har diverse fordele, f.eks. at det typisk er hurtigere end at bruge Selection, hvis koden skal lave mange operationer.

Mht. til det link, du sendte med:
Det er muligt, at du kan bruge et datofelt. Men da jeg som nævnt ikke ved noget om journaliseringssystemet og for så vidt heller ikke noget om dit dokument, kan jeg ikke vide det.

I givet fald kunne feltkoden se sådan ud:
{ CreateDate \@ "dd.MM.yyyy" }

Bemærk: Feltet vil vise den dato, det aktuelle dokument er oprettet. Feltklammerne skal laves med Ctrl+F9 - de kan ikke skrives med almindelige tegn.
Avatar billede nph12 Nybegynder
17. marts 2009 - 20:02 #12
Din kode virker fint, når jeg kører makroen, men er stødt ind i nogle andre problemer. Jeg prøver lige, at lege lidt mere med din kode og vender tilbage senere.

Et alternativ kunne være, at køre en makro som sætter dagsdato ind i dokumentet med det rigtige format (nedenstående kode er taget fra den tråd som jeg henviste til tidligere i denne tråd).

Sub Dato()
ActiveDocument.Bookmarks("Dato").Range.InsertDateTime DateTimeFormat:="dd.mm.yyyy", InsertAsField:= _
        False, DateLanguage:=wdDanish, CalendarType:=wdCalendarWestern, _
        InsertAsFullWidth:=False

End Sub

men hvorfor skriver den datoen som 17.52.2009?
Avatar billede nph12 Nybegynder
17. marts 2009 - 20:03 #13
Din kode virker fint, når jeg kører makroen, men er stødt ind i nogle andre problemer. Jeg prøver lige, at lege lidt mere med din kode og vender tilbage senere.

Et alternativ kunne være, at køre en makro som sætter dagsdato ind i dokumentet med det rigtige format (nedenstående kode er taget fra den tråd som jeg henviste til tidligere i denne tråd).

Sub Dato()
ActiveDocument.Bookmarks("Dato").Range.InsertDateTime DateTimeFormat:="dd.mm.yyyy", InsertAsField:= _
        False, DateLanguage:=wdDanish, CalendarType:=wdCalendarWestern, _
        InsertAsFullWidth:=False

End Sub

men hvorfor skriver den datoen som 17.52.2009?
Avatar billede Lene Fredborg Ekspert
17. marts 2009 - 22:39 #14
Udskift "mm" med "MM" i datoformatet i makroen.
Avatar billede nph12 Nybegynder
19. marts 2009 - 18:02 #15
OK, men hvor skal jeg bruge MM, når det virker med mm i UdskiftDagsDato makroen?

Jeg arbejder videre med både makroer (Dato & UdskiftDagsDato), men jeg forstår kun det første af Dato makro. Hvad betyder resten af koden efter DateTimeFormat? Er det nødvendigt, at skrive resten af koden? Hvis jeg skal lave dagsdato på engelsk, hvordan skal jeg så skrive koden?

Sub Dato()
ActiveDocument.Bookmarks("Dato").Range.InsertDateTime DateTimeFormat:="dd.MM.yyyy", InsertAsField:= _
        False, DateLanguage:=wdDanish, CalendarType:=wdCalendarWestern, _
        InsertAsFullWidth:=False

End Sub
Avatar billede Lene Fredborg Ekspert
19. marts 2009 - 19:30 #16
Det er da vist ved at udarte sig til et af de længste spørgsmål, der startede med, at svaret på det oprindelige spørgsmål var "Ja" ;-).

Vedr. mm og MM. De bliver brugt i to forskellige sammenhænge. I datofeltet vil mm give minuttallet, mens MM giver månedsnavn som tocifret tal.

Nu var det jo ikke mig, der leverede Dato-makroen. Den er sikkert oprindeligt lavet ved at optage en makro af indsættelse af "Dato og klokkeslæt". Brug VBA-hjælpen til at finde information om de parametre, der er med - hjælpen er glimrende. Da datoen indsættes med tal, kan du uden problem udelade noget, så der står:

Sub Dato()
ActiveDocument.Bookmarks("Dato").Range.InsertDateTime DateTimeFormat:="dd.MM.yyyy", InsertAsField:=False

End Sub

Koden kan i dette tilfælde være ens til dansk og engelsk.

Hvis du skulle bruge et datoformat, hvor månedsnavnet skulle indgå med bogstaver (marts / March), ville du også have brug for sprogindstillingen (DateLanguage:=wdDanish for dansk og evt. DateLanguage:=wdEnglishUK for engelsk - der er mange slags engelsk) - og selve datoformatet skulle være forskelligt på dansk og engelsk, da man ikke skriver datoer efter samme principper på de to sprog.
Avatar billede nph12 Nybegynder
23. marts 2009 - 21:27 #17
Jeg tester lige de forskellige makroer på vores skabelon i morgen
Avatar billede nph12 Nybegynder
04. april 2009 - 11:31 #18
Takker mange gange for hjælpen. God weekend og god påske
Avatar billede Lene Fredborg Ekspert
04. april 2009 - 11:43 #19
Velbekom. God påske.
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