13. august 2009 - 14:43
Der er
3 kommentarer og
1 løsning
VBA styrring af Word fra Excel
Jeg skal have udskrevet noget tekst fra Excel, og åbner derfor Word og indsætter min tekst, og udskriver.
Alt dette virker fint - men når jeg så beder Word om at lukke, så spørger Word flere gange, om jeg vil gemme mine ændringer. Jeg er kommet af med det første spørgsmål - men jeg bliver stadig spurgt om jeg vil gemme ændringerne i Normal.Dot (hvordan Normal.dot er blevet blandet ind i det, aner jeg ikke). Hvordan får jeg Word til at lukke uden at spørge brugeren om noget ?
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
Set wrdApp = CreateObject("Word.Application")
Set wrdDoc = wrdApp.Documents.Add
wrdDoc.Content.Font.Name = "Courier"
wrdDoc.Content.InsertAfter myBody
wrdDoc.PrintOut
wrdApp.Quit SaveChanges = wdDoNotSaveChanges
Set wrdApp = Nothing
Set wrdDoc = Nothing
13. august 2009 - 17:06
#1
Først et par bemærkninger:
Når Word spørger, om Normal.dot skal gemmes, er det fordi Word har registreret, at der er sket ændringer i Normal.dot. Det kan være fordi Word var kørende i forvejen og brugeren f.eks. har oprettet en tastaturgenvej eller en autotekst - og så går det det ikke godt, at du bare lukker uden at gemme. Det kan også skyldes en ikke så heldigt lavet Word-add-in, som laver ændringer i Normal.dot under opstart (ikke en god skik).
Jeg mener, du bør undersøge, om Word allerede kører. Hvis det er tilfældet, så brug den kørende Word, ellers start Word. Makroen nedenfor virker hos mig. Af praktiske grunde ændrede jeg makroen, så der ikke er behov for at sætte reference til Word i VBE.
Makroen er lavet, så Word kun lukkes, hvis det er makroen, der har startet Word. Bemærk, at jeg har indsat en linje, som sørger for, at Word ikke spørger, om den skal gemme Normal.dot - det kan kompensere for evt. dårligdomme i den sammenhæng.
Sub TestWord()
Dim wrdApp As Object 'Word.Application
Dim wrdDoc As Object 'Word.Document
Dim bRunning As Boolean
' 'Følgende tekst lavet for at kunne teste - slet igen
' Dim myBody As String
' myBody = "dette er en test"
bRunning = True
'Undersøg om Word allerede kører
On Error Resume Next
Set wrdApp = GetObject(, "Word.Application")
If Err.Number = 429 Then
'Word kører ikke - start Word
Set wrdApp = CreateObject("Word.Application")
Err.Clear
bRunning = False
End If
Set wrdDoc = wrdApp.Documents.Add
With wrdDoc
.Content.Font.Name = "Courier"
.Content.InsertAfter myBody
.PrintOut
End With
wrdDoc.Close savechanges:=False 'wddonotsavechanges
'Luk Word hvis det blev startet af makroen
If bRunning = False Then
'Undgå at få Word til at spørge om at gemme ændringer til Normal.dot
wrdApp.normaltemplate.Saved = True
'Luk Word
wrdApp.Quit
End If
Set wrdApp = Nothing
Set wrdDoc = Nothing
End Sub
14. august 2009 - 08:37
#3
Havde slet ikke tænkt på, at brugeren kunne have word åbent i forvejen - godt fanget.
Perfekt løsning, præcis hvad jeg skulle bruge - smid et svar og jeg godkender :-)