ahstax
Goto Top

VBA in Word 2010 bzw 2013(16)

Hallo,

wir haben hier folgendes Word-Makro:

Public Sub PrintDeadline()
    ActiveDocument.PrintOut Background:=False
    ActiveDocument.Save
    ActiveDocument.Saved = True
End Sub

Es wird bei der Abarbeitung eines Dokuments durch eine Bürosoftware ausgeführt (überprüft!). Anschließend sollte sich das Dokument schließen.

Die Beobachtung ist, dass das Makro in Word 2013/2016 läuft, nicht aber in Word 2010, hier kommt eine Nachfrage, ob gespeichert werden soll.
Ist es vorstellbar, dass man zwischen der Verwendung in Word 2010 und Word 2013/2016 unterscheiden muss?

Gibt es eine andere, sauberere Möglichkeit, mit einem Makro in Word
a) bei einem Dokument X alle Felder zu aktualisieren
b) das Dokument X zu drucken
c) das Dokument X zu schließen ohne der Nachfrage, ob gespeichert werden soll.

Neugierige Grüße,
Andreas

Content-ID: 360593

Url: https://administrator.de/forum/vba-in-word-2010-bzw-201316-360593.html

Ausgedruckt am: 23.12.2024 um 11:12 Uhr

colinardo
Lösung colinardo 10.01.2018 aktualisiert um 17:02:36 Uhr
Goto Top
Servus Andreas.
Zitat von @ahstax:
Gibt es eine andere, sauberere Möglichkeit, mit einem Makro in Word
a) bei einem Dokument X alle Felder zu aktualisieren
Ja. Kleine Methode:
Sub UpdateAllFields()
    Dim oStory As Range
    For Each oStory In ActiveDocument.StoryRanges
        oStory.Fields.Update
        If oStory.StoryType <> wdMainTextStory Then
            While Not (oStory.NextStoryRange Is Nothing)
                Set oStory = oStory.NextStoryRange
                oStory.Fields.Update
            Wend
        End If
    Next oStory
    Set oStory = Nothing
End Sub
b) das Dokument X zu drucken
Wie gehabt mit der entsprechenden Print Methode oben.
c) das Dokument X zu schließen ohne der Nachfrage, ob gespeichert werden soll.
Dafür hat man folgende Eigenschaft geschaffen die man vor dem Batch-Vorgang auf False festlegt und danach wieder auf True.
Application.DisplayAlerts = False
' Dinge hier erledigen die einen Dialog triggern könnten.  
Application.DisplayAlerts = True
(Die letzte Zeile nicht vergessen, sonst sieht der User keine Nachfragedialoge mehr)

Grüße Uwe
ahstax
ahstax 10.01.2018 um 17:03:22 Uhr
Goto Top
Wie cool ist das denn! Probiere ich aus, Danke schon mal!
Das Zurücksetzen von
Application.DisplayAlerts = False
könnte allerdings ein Problem werden...
colinardo
colinardo 10.01.2018 aktualisiert um 17:10:42 Uhr
Goto Top
Zitat von @ahstax:
Das Zurücksetzen von
Application.DisplayAlerts = False
könnte allerdings ein Problem werden...
Kein Problem, kannst du im DocumentClose oder ApplicationExit Event zurücksetzen.
ahstax
ahstax 11.01.2018 um 15:07:15 Uhr
Goto Top
Oh je.... das hat leider (im Rahmen meiner Fähigkeiten) noch nichts gebracht...
Vielleicht liegts auch an meiner Beschreibung...?

Das Büroprogramm arbeitet einen Workflow ab. Dabei sammelt es Daten in Variablen, erstellt ein Word-Dokument (DOCX) und setzt Inhalt aus den Variablen in das Word-Dokument ein. Dann wird das Dokument erstmals sichtbar geöffnet.
An dieser Stelle soll dann das o.g. Makro laufen. Die Info, welches Makro verwendet werden soll, kann man dem Büroprogramm sagen. Dazu liegt eine DOTM-Datei im Verzeichnis %appdata%\Microsoft\Word\STARTUP, die das Makro enthält.
Die Datei wird gedruckt. Davor werden die Felder aktualisiert, unter anderem die Seitenzahlen. Und ich nehme an, dass da das Problem liegt. Das erkennt Word als Änderung, die beim schließen zu speichern ist.....
colinardo
colinardo 11.01.2018 aktualisiert um 15:16:28 Uhr
Goto Top
Die Datei wird gedruckt. Davor werden die Felder aktualisiert, unter anderem die Seitenzahlen. Und ich nehme an, dass da das Problem liegt.
Das ist normal vor dem Drücken werden die Felder immer aktualisiert.
Das erkennt Word als Änderung, die beim schließen zu speichern ist.....
Klar, aber das ist ja kein Problem wenn du DisplayAlerts = False vor der Save-Methode Methode setzt oder noch früher, je nachdem und danach wieder zurücksetzt.
Ich sehe hier absolut kein Problem, sorry. Entweder du verstehst es noch nicht ganz oder dein Workflow lässt mich noch im Dunkeln.
ahstax
ahstax 11.01.2018 um 15:27:14 Uhr
Goto Top
Vermutlich eine Mischung aus beidem... face-wink
colinardo
colinardo 11.01.2018 um 15:32:56 Uhr
Goto Top
Dann schlaf mal drüber, dann kommt oft die Erleuchtung face-smile.
ahstax
ahstax 11.01.2018 um 15:37:15 Uhr
Goto Top
Hmmm... also... folgendes Szenario:

Das Dokument, das geschlossen werden soll, basiert hier nicht auf der DOTM-Datei.

Wenn ich es richtig verstehe, müsste
Application.DisplayAlerts = False
ja etwa so verwendet werden:
Public Sub Document_Close() 
 Application.DisplayAlerts = True
End Sub
Das Dokument, das diesen Handler auslöst, muss ja, wenn ich es nochmals richtig verstehe, auf der DOTM-Datei basieren, in der Public Sub Document_Close() hinterlegt ist.

Wie wäre denn das:
Mein Büroprogramm öffnet das "unwillige" Dokument und druckt es. Das Makro dazu setzt auch
Application.DisplayAlerts = False
Wenn ich nach dem Drucken von dem Makro eine leere, neue Datei erstellen lasse, die auf der gerade beschriebenen DOTM-Datei beruht und die dann erst das ursprüngliche Dokument schließt und dann sich selbst...?
colinardo
colinardo 11.01.2018 aktualisiert um 15:55:36 Uhr
Goto Top
Zitat von @ahstax:
Das Dokument, das geschlossen werden soll, basiert hier nicht auf der DOTM-Datei.
?? und was dann ist es ein einfaches XLSX?
Wenn ich es richtig verstehe, müsste
Application.DisplayAlerts = False
ja etwa so verwendet werden:
> Public Sub Document_Close() 
>  Application.DisplayAlerts = True
> End Sub
> 
Das Dokument, das diesen Handler auslöst, muss ja, wenn ich es nochmals richtig verstehe, auf der DOTM-Datei basieren, in der Public Sub Document_Close() hinterlegt ist.

Ein Dokument in dem Makros liegen muss zwingend eins mit Makroextension (*m) sein.
Wie wäre denn das:
Mein Büroprogramm öffnet das "unwillige" Dokument und druckt es. Das Makro dazu setzt auch
Application.DisplayAlerts = False
Wenn ich nach dem Drucken von dem Makro eine leere, neue Datei erstellen lasse, die auf der gerade beschriebenen DOTM-Datei beruht und die dann erst das ursprüngliche Dokument schließt und dann sich selbst...?
Application.DisplayAlerts ist eine Applikationseinstellung keine Dokumenteneinstellung.
colinardo
colinardo 11.01.2018 aktualisiert um 16:17:03 Uhr
Goto Top
Ich denke das was du suchst ist das Private Sub Document_New() Event in der Vorlage. Das wird ausgeführt wenn von der Vorlage ein neues Dokument erstellt wird, dort packst du alles rein bspw. so
Private Sub Document_New()
On Error Resume Next
    With ActiveDocument
        Application.DisplayAlerts = False
        .PrintOut Background:=False
        .SaveAs "C:\Pfad\datei.xlsx"  
        Application.DisplayAlerts = True
        .Close
    End With
End Sub
Hierbei wird sobald man ein Dokument von der Vorlage erstellt, dieses gedruckt gespeichert und wieder geschlossen.
Kenne leider deinen exakt gewünschten Ablauf nicht, deswegen tappe ich hier völlig im Dunkeln was das betrifft, sorry.
Halte dich hier an die richtige Reihenfolge und und du wirst Erfolg haben.
ahstax
ahstax 17.01.2018 um 13:24:07 Uhr
Goto Top
Hallo,

das Problem hat sich leider via VBA nicht lösen lassen, sodass wir einen anderen Weg finden mussten.

Ich weiß nicht, ob das für andere hilfreich ist, aber das Büroprogramm erzeugt jetzt das Word-Dokument und konvertiert es, ohne das Word-Dokument sichtbar zu öffnen, in ein PDF, das dann gedruckt wird.

Danke für Deine Hilfe @colinardo.

Herzliche Grüße,
Andreas