Vba

ich suche seit langem ein VBA Script das folgendes macht:
das script soll in dem ordner (D:\documents\correspondence\2003) die
„.doc“ dateien zählen und im Brief die Zahl der Dokumente +1
ausgeben.
Beim speichern soll mein kürzel (fd 03-) und die Zahl (bsp. 0001)
automatisch als Speichername vergeben werden.

vielen Dank für die Hilfe
Daniel

Die Dateianzahl bekommst du raus mit

dim fn as string
dim Count as integer
Count=0
fn=Dir("C:\Irgendwo\*.doc",vbNormal)
while fn""
 Count=Count+1
 fn=dir
wend

Dann einfach die Zahl im Dokument ausgeben und in der Dateiname-Eigenschaft des Dokumentobjekts den Namen eingeben…

Ralph

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.

  1. neues Dokument öffnen

  2. VB Umgebung starten
    … mit Alt-F11

  3. 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
  1. 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

  2. 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.

  3. 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)

  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.

  1. 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 :wink:

Cheers!
Hawky