ich hab' da mal 'ne kurze Frage:
In einer Vorlage möchte ich im "Speichern unter..."- und im
"Speichern"-Dialog den vorgegebenen Dateinamen anpassen.
Das mache ich wie unten gezeigt.
Einmal verwende ich "Sub FileSave()" und einmal "Sub FileSaveAs()".
Versuche ich, Word (oder das Dokument) ohne zu speichern zu schließen,
erscheint die Abfrage, ob ich speichern möchte. Beantworte ich diese Frage
mit "Ja", so erscheint zwar wie immer der "Speichern unter..."-Dialog
allerdings nicht mit dem angepassten vorgegebenen Dateinamen.
Wo liegt mein Fehler?
Ich habe auch schon versucht, in "Sum AutoClose()" auf "Sub FileSaveAs()" zu
verweisen. Dann geht er allerings statt der "Möchten Sie speichern"-Abfrage
direkt in den "Speichern unter..."-Dialog. Und anschließend erscheint dann
die Abfrage, ob ich speichern möchte.
Für jeden Hinweis sage ich besten Dank im Voraus und wünsche noch einen
schönen Tag.
Nils
Hier der Code, den ich in den beiden FileSave-Funktionen nutze.
dat = Mid$(Date$, 4, 2) + Left$(Date$, 2) + Right$(Date$, 2)
dateiname = ActiveDocument.Bookmarks("Name").Range.Text + " - " + dat
With Dialogs(wdDialogFileSaveAs)
.Name = dateiname
.Format = wdFormatDocument
.Show
End With
> Versuche ich, Word (oder das Dokument) ohne zu speichern zu schließen,
> erscheint die Abfrage, ob ich speichern möchte. Beantworte ich diese Frage
> mit "Ja", so erscheint zwar wie immer der "Speichern unter..."-Dialog
> allerdings nicht mit dem angepassten vorgegebenen Dateinamen.
prüfe im AutoClose-Makro, ob das Dokument gespeichert werden will
(Activedocument.Saved=False)und rufe nur dann dein SpeichernUnter-Makro
auf.
Nach der Code-Verarbeitung setze ggf. die Saved-Eigenschaft auf True.
Beispiel:
Sub AutoClose()
If ActiveDocument.Saved = False Then
Call DateiSpeichernUnter
End If
End Sub
Sub DateiSpeichernUnter()
MsgBox ActiveDocument.Name
ActiveDocument.Saved = True
End Sub
es wird der Dateiname angezeigt und das Dokument geschlossen (ohne weitere
Abfrage).
HTH
--
Gruß Christian
~~~~~~~~~~~~
Antworten / Rückmeldungen nur in die NG!
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)
besten Dank für deine Antwort.
Allerdings hab' ich da noch irgenwo einen kleinen Fehler.
Ich habe das jetzt mal so gemacht, wie du mir das empfohlen hast.
Sub AutoClose()
If ActiveDocument.Path = "" And ActiveDocument.Saved = False Then
Call FileSaveAs
End If
End Sub
Allerdings hab' ich jetzt das Problem, dass Word / das Dokument beendet
wird, wenn ich im Speichern-Dialog auf "Abbrechen" klicke. Das darf natürlich
nicht sein... ;-)
Ich prüfe im AutoClose auch den Pfad des Dokumentes, da ich beim Öffnen
eines neuen Dokumentes per Makro schon Eingaben tätige. Nach diesen Eingaben
setze ich "activedocument.saved=true", damit er beim Schließen ohne Eingaben
nicht nach Speicherung fragt.
Kannst du mir sagen, wie ich im Speichern-Dialog "abfragen" kann, welchen
Button der Anwender gedrückt hat?
Besten Dank nochmals und bis vielleicht nachher. ;-)
Viele Grüße,
Nils
"Christian Freßdorf" schrieb:
> [...] der "Speichern unter..."-Dialog
> allerdings nicht mit dem angepassten vorgegebenen Dateinamen.
Den kannst du so vorbelegen, dann ist es egal wann der Anwender und wie der
Anwender auf diesen Dialog kommt
- How to set the default suggested filename to be displayed by the Save As
dialog the first time a user saves a new document¨
http://word.mvps.org/faqs/macrosvba/SetDefFilename.htm
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)
- Windows XP (SP1), Office XP (SP3)
> Kannst du mir sagen, wie ich im Speichern-Dialog "abfragen" kann, welchen
> Button der Anwender gedrückt hat?
Auszug aus der Hilfe zur Show/Display-Methode:
-2 Die Schaltfläche Schließen.
-1 Die Schaltfläche OK.
0 (Null) Die Schaltfläche Abbrechen.
> 0 (Null) Eine Befehlsschaltfläche: 1 ist die erste Schaltfläche, 2 die zweite usw.
Beispiel:
Dim ret As Integer
With Dialogs(wdDialogFileSaveAs)
ret = .Show
Select Case ret
Case ret = -2
MsgBox "Schließen"
Case ret = -1
MsgBox "Speichern/Ok"
Case ret = 0
MsgBox "Abbruch"
Case Else
MsgBox "Button " & ret
End Select
End With
leider brauche ich doch noch mal kurz deine Hilfe:
Wie gelange ich zurück zu Word, wenn der Anwender auf "Abbrechen" geklickt
hat?
Im Augenblick wird Word dann immer ohne Nachfrage geschlossen. Und das ist
wohl nicht im Sinne des Erfinders... ;-)
Im Augenblick sieht der Code wie folgt aus:
With Dialogs(wdDialogFileSaveAs)
.Name = dateiname
.Format = wdFormatDocument
ret = .Show
End With
If ret = 0 Then
ActiveDocument.Saved = True
End If
Besten Dank nochmals für Deine Hilfe,
Nils
"Christian Freßdorf" schrieb:
danke für deine Antwort.
Ich dachte, dass ich mit einer "Sub FileSaveAs()" und einer "Sub FileSave()"
die Dialoge modifiziert hätte.
Aber dem scheint ja leider nicht so zu sein... :-( Warum auch immer...
(It's not a bug, it's a feature?)
Viele Grüße und noch einen schönen Tag,
Nils
"Thomas Gahler" schrieb:
> Ich dachte, dass ich mit einer "Sub FileSaveAs()" und einer "Sub
FileSave()"
> die Dialoge modifiziert hätte.
> Aber dem scheint ja leider nicht so zu sein...
Du hast nicht die Dialoge modifiziert sondern den internen Befehl selber
definiert.
Jetzt hast du aber drei Möglichkeiten gefunden wo der Dialog 'Speichern
unter' am Bildschirm auftaucht. Und mit dem einhängen mit dienen Befehlen
kannst du eben erst zwei Möglichkiten abfangen...
Mit diesem Hinweis hast du es aber auf sicher egal wie oft der Anwender
Abrechen drüct oder sonst wie zum Dokument hinaus kommt.
also wie Thomas schrieb gibt es verschiedene Möglichkeiten in diese
Abfragen einzugreifen.
Über
DateiSpeichern()
DateiSpeichernUnter()
greifst Du in die (Menü)Befehle ein.
Den Dialog beim Schließen von Word kannst Du über die Wordereignsse
abfangen.
Dazu benötigst Du ein Klassenmodul (z.B. cls_App) mit foglendem INhalt
Public WithEvents App As Word.Application
Private Sub App_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
Dim ret As Integer
If Doc.Saved = False Then
With Dialogs(wdDialogFileSaveAs)
.Format = wdFormatDocument
ret = .Show
End With
If ret = 0 Then
' Abbruch wurde angeklickt
' Dokument nicht schließen
Cancel = True
End If
End If
End Sub
Im Modul muss das KM dann initialisiert werden:
Dim c_App As New cls_App
Sub AutoExec()
Set c_App.App = Word.Application
End Sub
Das Wordereignis wird dann beim SChließen jedes Dokumentes aufgerufen und
dort wird der Speichern-Zustand des jeweiligen Dokumentes geprüft.
Mit Cancel=True wird ggf. das Ereignis ohne Aktion (hier Schließen)
beendet.
Du brauchst also eine Kombination aus den bisher Methoden und Ereignissen.
schade, dass man mit "FileSave" und "FileSaveAs" nicht die Dialoge anpassen
kann, so dass sie so aussehen, wie man es möchte, egal, von wo aus sie
aufgerufen werden...
Ich werde mich wohl doch für deine Lösung entscheiden.
Allerdings hab' ich da noch ein kleines Verständnisproblem:
von wo aus rufe ich "Sub ChangeProbs()" auf?
Die Schwierigkeit ist folgende:
Ein Dokument wird auf Basis meiner Vorlage erstellt.
In diesem Dokument sind Textformularfelder, damit der Anwender mit "F11" von
Eingabepunkt zu Eingabepunkt springen kann. (Wie bei einem Formular)
Allerdings handelt es sich nicht um ein (geschütztes) Formular, so dass die
Felder während der Eingabe überschrieben werden, da der Anwender teilweise
auch den Text der Vorlage modifizieren können muss.
Der Dateiname setzt sich aus dem Inhalt einer Textmarke zusammen, die den
Text von zwei Textformularfeldern enthält.
Und von wo aus rufe ich nun "Sub ChangeProbs()" auf? Die Möglichkeit beim
Verlassen der Textfelder ein Makro auszuführen kann ich ja leider nicht
nutzen...
Ich hoffe, du kannst mir da noch mal kurz auf die Sprünge helfen und sage
besten Dank im Voraus.
Viele Grüße und noch einen schönen Tag,
Nils
"Thomas Gahler" schrieb:
> Hallo Nils
> Und von wo aus rufe ich nun "Sub ChangeProbs()" auf? Die Möglichkeit beim
> Verlassen der Textfelder ein Makro auszuführen kann ich ja leider nicht
> nutzen...
So wie du beschrieben hasdt nur manuell ;-)
Nimm doch das Ereignis wie Christian beschrieben hat.
vielen Dank für eure unermüdliche Hilfe.
Auch auf die Gefahr hin, dass ihr mich langsam für doof haltet *g*, muss ich
mich noch mal melden, weil ich da noch ein paar Verständnisschwierigkeiten
habe.
1.) Wo ist der Unterschied zwischen einem Klassenmodul und einem "normalen"
Modul?
2.) Ich habe jetzt ein Klassenmodul (cls_App) mit dem Inhalt aus Christians
Antwort erstellt.
In meinem AutoNew()-Modul habe ich dann auch
"Dim c_App As New cls_App
Set c_App.App = Word.Application"
eingetragen.
O.k., ich habe das Klassenmodul noch etwas erweitert, damit der gewünschte
Dateiname im Dialog vorgegeben ist.
Aber er ruft das Klassenmodul gar nicht auf. Habe ich es an einer falschen
Stelle (AutoNew()) "bekannt" gemacht?
Ich hoffe, ihr helft einem leicht Verzweifelten noch etwas weiter und
bedanke mich nochmals ganz herzlich bei euch,
Nils
"Christian Freßdorf" schrieb:
> In meinem AutoNew()-Modul habe ich dann auch
> "Dim c_App As New cls_App
> Set c_App.App = Word.Application"
> eingetragen.
das Klassenmodul muss nur einmal initialisiert werden und steht dann zur
Verfügung solange Word läuft.
Und wenn, dann müsste es
'Modul der Normal.dot oder eines AddIns
Dim c_App As New cls_App
Sub AutoNew()
Set c_App.App = Word.Application
End Sub
Die Dimensionierung erfolgt vor dem Makro, falls es in verschiedenen Makros
initialisiert werden soll.
Aber 1x im AutoExec reicht vollkommen aus.
vielen Dank für Eure Hilfe.
Jetzt funktioniert das so, wie ich es haben wollte! :-))) Super!
Es ist doch immer wieder klasse, was man mit VBA so alles anstellen kann.
Viele Grüße und noch einen schönen Tag
Nils
"Christian Freßdorf" schrieb: