Moin Daniel,
ein bisschen spät vielleicht, aber besser als nie:
Mein Vorredner Ralph hat ja schon den Kern des Programms geliefert, nu’ kommt der Rest.
Mit den automatischen Dingen ist es unter Office nicht so ganz easy. Selbst die Pakete unterscheiden sich da.
Soviel zur Vorrede:
Meine beiden Module beziehen sich auf ein Dokument, damit Du dir die normal.dot nicht gleich zerstörst.
-
neues Dokument öffnen
…
-
VB Umgebung starten
… mit Alt-F11
-
Klassenmodul hinzufügen
Einfügen->Klassenmodul
im Eigenschaftsbrowser:
(Name) SpeicherKlasse
füge im Code-Fenster folgendes ein:
Option Explicit
Public WithEvents appWord As Word.Application
Private Sub appWord\_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
Dim verz As String
Dim muster As String
Dim prefix As String
Dim numformat As String
Dim datei As String
Dim postfix As String
Dim i As Integer
Dim rc As Integer
On Error GoTo keinProperty
If ActiveDocument.CustomDocumentProperties("Dokumentnummer") = 0 Then
verarbeiten:
verz = "D:\documents\correspondence\2003\" ' mit abschliessenden \ !!!
muster = "\*.doc"
prefix = "fd 03-" ' Dein Kürzel
numformat = "000#" ' max 3 führende Nullen
i = 0
datei = Dir(verz & muster)
Do While datei ""
i = i + 1
datei = Dir
Loop
postfix = Format$(i + 1, numformat)
' Dateinummer in Dokumenteigenschaft speichern
ActiveDocument.CustomDocumentProperties("Dokumentnummer") = i + 1
' den neuen Dateinamen (ohne Endung) festlegen
datei = prefix & postfix
' wenn der Dateiname ins Dokument soll, hier das Feld füllen
' und jetzt dir Datei speichern...
With Application.Dialogs(wdDialogFileSaveAs)
.Name = verz & datei
rc = .Show
End With
If rc = 0 Then ' Abbrechen wurde geklickt
' daher Eigenschaft wieder löschen
ActiveDocument.CustomDocumentProperties("Dokumentnummer").Delete
End If
Cancel = True ' Speichern unter... nicht nochmal aufrufen
GoTo schluss
Else
GoTo schluss
End If
keinProperty:
ActiveDocument.CustomDocumentProperties.Add \_
Name:="Dokumentnummer", LinkToContent:=False, \_
Value:=0, \_
Type:=msoPropertyTypeNumber
GoTo verarbeiten
schluss:
End Sub
-
Klasse beim Dokument-Start instanzieren
Klicke im Projekt-Explorer unter „Microsoft Word Objekte“ doppelt auf „ThisDocument“ und gebe dort im Code Fenster ein:
Option Explicit
Dim appWordKlasse As New SpeicherKlasse ’ der Name des Klassenmoduls!!!
Sub Document_Open()
Set appWordKlasse.appWord = Word.Application
End Sub
-
Ausprobieren
Visual Basic schließen und diese Datei z.B. als TestVorlage.doc speichern. Dann die Datei erneut öffnen und mal auf Speichern oder Speichern unter… klicken.
Jetzt bekommst Du immer einen Speichern unter… Dialog angezeigt.
-
die Technik
Das Klassenmodul ist ein Wrapper für das Speichern-Ereignis von Word.
Ich speichere deine Dok-Nr. in einer Dokumenteneigenschaft („Dokumentnummer“); siehe Datei->Eigenschaften->Anpassen
Ist die Eigenschaft noch nicht vorhanden (oder = 0), wird eine neue Nr. basierend auf der Anzahl der Dokumente vergeben.
Neue Dokumente erzeugst du ab jetzt aus der Datei TestVorlage.doc (Schritt 4)
-
Ausblick
Wenn Du an diesen Makros deinen Spaß gefunden hast und alle Dokumente so verwalten willst, musst du deine Standardvorlage normal.dot ändern:
- Rufe in TestVorlage.doc mit Alt-F8 die Makroverwaltung auf
- klicke auf Organisieren -> Makroprojektelemente
- kopiere „SpeicherKlasse“ nach normal.dot
- Rufe in TestVorlage.doc mit Alt-F8 die Makroverwaltung noch mal auf
- Makros in: Normal.dot (globale Vorlage)
- Makroname: AutoExec
- klicke auf "erstellen"
- kopiere jetzt aus Schritt 3 die Dim-Anweisung vor die Sub-Zeile und die Set-Anweisung zwischen Sub und End Sub
Ab jetzt werden alle neuen Dokumente nach deiner Vorgabe behandelt.
- finally{}
Anpassung von Kürzeln, Verzeichnissen, usw. bitte im KlassenModul „SpeicherKlasse“ vornehmen; sind alles einzelne Variable…
Ich weiß, dass die Verwendung von Sprungmarken keine eleganter Programmierstil ist. Da ich aber alles in einer Sub abhandeln wollte und damit auch auf ein VB-Ereignis reagieren muss (fehlendes DocumentProperty), geht es nun mal nicht anders.
Soll der Dateiname auch im Dokument angezeigt werden, kann man dass entweder auch in der Routine machen (s. Kommentar) oder man hat sowieso schon ein FileName-Feld im Text.
PS: hoffe auf viele Nützlichkeitspunkte 
Cheers!
Hawky