patrixx
Goto Top

VBA Dateiname auslesen, bearbeiten und wieder abspeichern

Hallo zusammen,

bin neu hier und ich hoffe ihr könnt mir gleich helfen.

Ich habe eine definierte Formatvorlage in Word 2010. (Reparaturaufträge)
Wenn ich die Vorlage zum ausfüllen öffne, soll mir ein Makro gleich die Datei mit einer Laufnummer versehen.
Wenn ich dann die Datei speicher, soll der Name wie folgt lauten: "Reparaturaufträge_6-stellige Laufnummer_Datum"
Soweit so gut.
So nun zu meinem Problem mit der Laufnummer:
Bis jetzt habe ich das mit einer externen INI-Datei gelöst, in welche einfach die aktuelle Nummer geschrieben wird und beim erneuten öffnen der Vorlage wird einfach +1 hochgezählt.

Ich möchte das aber etwas anders lösen.
Und zwar soll mir das Makro die LETZTE abgespeicherte Laufnummer auslesen, +1 addieren und die neue Datei abspeichern.
Ich möchte einfach keine externe INI-Datei verwenden.

Leider hab ich keine Ahnung wie ich Dateinamen aus bestehenden Dokumenten auslesen und bearbeiten kann.

Ich hoffe ihr versteht mein Problem und könnt mir helfen.

Danke schon mal und viele Grüße face-smile

Bitte entschuldigt wenn ein ähnliches Thema bereits irgendwo behandelt wurde.
Wenn jemand eine Lösung hat, bitte idiotensicher erklären. Bin absoluter VBA-Neuling face-smile

Anbei noch mein jetziges Makro

Private Const Präfix = "Reperaturauftrag_"
Private Const INIDatei = "C:\Users\Test\Documents\laufnummer.txt"

Sub AutoNew()
Dim oDoc As Document, oV As Template

Set oDoc = ActiveDocument
Set oV = oDoc.AttachedTemplate
aSec = aSec & Left(oV.Name, InStr(oV.Name, ".") - 1)
Num = System.PrivateProfileString(INIDatei, aSec, "Laufnummer")
Num = Val(Num) + 1
Num = Format(Num, "000000")
Monat = Format(Date, "mm")
Tag = Format(Date, "dd")
Jahr = Format(Date, "yyyy")
System.PrivateProfileString(INIDatei, aSec, "Laufnummer") = Num
On Error Resume Next
oDoc.CustomDocumentProperties.Add Name:="Laufnummer", _
LinkToContent:=False, Value:=Num, Type:=msoPropertyTypeString
On Error GoTo 0
For Each Teil In oDoc.StoryRanges
Teil.Fields.Update
While Not (Teil.NextStoryRange Is Nothing)
Set Teil = Teil.NextStoryRange
Teil.Fields.Update
Wend
Next
With Dialogs(wdDialogFileSummaryInfo)
.Title = Präfix & Num
.Execute
End With
oDoc.Windows(1).Caption = Präfix & Num & "_" & Jahr & "." & Monat & "." & Tag
End Sub

Content-ID: 201555

Url: https://administrator.de/contentid/201555

Ausgedruckt am: 25.11.2024 um 17:11 Uhr

bastla
bastla 11.02.2013 um 12:32:15 Uhr
Goto Top
Hallo PatRixx und willkommen im Forum!
die LETZTE abgespeicherte Laufnummer auslesen
Demnach soll das Makro also in einem (noch nicht genannten) Ordner die gespeicherten Dateien (haben welches Dateiformat?) durchgehen, um jene mit der höchsten Laufnummer entsprechend dem Schema "Reparaturaufträge_6-stellige Laufnummer_Datum" zu finden und daraus die nächste Nummer berechnen zu können?

Grüße
bastla
PatRixx
PatRixx 11.02.2013 um 13:01:29 Uhr
Goto Top
Zitat von @bastla:
Hallo PatRixx und willkommen im Forum!
> die LETZTE abgespeicherte Laufnummer auslesen
Demnach soll das Makro also in einem (noch nicht genannten) Ordner die gespeicherten Dateien (haben welches Dateiformat?)
durchgehen, um jene mit der höchsten Laufnummer entsprechend dem Schema "Reparaturaufträge_6-stellige
Laufnummer
_Datum" zu finden und daraus die nächste Nummer berechnen zu können?

Grüße
bastla


Ganz genau!
Es handelt sich um herkörmmliche doc-Dateien.

Beispiel:

Reparaturaufträge_000001_20130211.doc
Reparaturaufträge_000002_20130212.doc

Wenn ich jetzt das nächste Dokument speichern möchte soll es so heißen:
Reparaturaufträge_000003_20130212

Das Makro soll NUR die Laufnummer auslesen.
Das Datum soll automatisch generiert werden.
bastla
bastla 11.02.2013 um 14:25:03 Uhr
Goto Top
Hallo PatRixx!

Etwa so:
Set fso = CreateObject("Scripting.FileSystemObject")  
HNr = "000000" 'Startwert für "höchste Nummer"  
Pre = "Reparaturaufträge_" 'Präfix des Dateinamens  
For Each File In fso.GetFolder("D:\Ordner mit Reparaturaufträgen").Files 'alle Dateien durchgehen  
    'nur doc-Dateien, die mit "Reparaturaufträge_" beginnen, verarbeiten  
    If Left(File.Name, Len(Pre)) = Pre And LCase(fso.GetExtensionName(File.Name)) = "doc" Then  
        LNr = Split(File.Name, "_")(1) 'Nummer ist Teil zwischen erstem und zweitem "_"  
        If LNr > HNr Then HNr = LNr 'merken, wenn höher, als bisher höchste Nummer  
    End If
Next
Num = Format(CLng(HNr) + 1, "000000") 'neue Nummer berechnen  
Grüße
bastla
PatRixx
PatRixx 11.02.2013 um 14:37:35 Uhr
Goto Top
Zitat von @bastla:
Hallo PatRixx!

Etwa so:
Set fso = CreateObject("Scripting.FileSystemObject")  
> HNr = "000000" 'Startwert für "höchste Nummer"  
> Pre = "Reparaturaufträge_" 'Präfix des Dateinamens  
> For Each File In fso.GetFolder("D:\Ordner mit Reparaturaufträgen").Files 'alle Dateien durchgehen  
>     'nur doc-Dateien, die mit "Reparaturaufträge_" beginnen, verarbeiten  
>     If Left(File.Name, Len(Pre)) = Pre And LCase(fso.GetExtensionName(File.Name)) = "doc" Then  
>         LNr = Split(File.Name, "_")(1) 'Nummer ist Teil zwischen erstem und zweitem "_"  
>         If LNr > HNr Then HNr = LNr 'merken, wenn höher, als bisher höchste Nummer  
>     End If
> Next
> Num = Format(CLng(HNr) + 1, "000000") 'neue Nummer berechnen  
> 
Grüße
bastla

Super!
Erstmal vielen Dank.

Wie viel soll ich von meinem ursprünglichen Makro behalten?
Und wo kommt dein Code rein?
bastla
bastla 11.02.2013 um 14:39:40 Uhr
Goto Top
Hallo PatRixx!

Magst du vielleicht auch selber etwas tun?

Grüße
bastla
PatRixx
PatRixx 11.02.2013 um 14:55:36 Uhr
Goto Top
Du hast recht.

Nur bin ich wie gesagt absoluter VBA-Neuling.

Aber gut, ich werde mich selbst mal dran versuchen.

Trotzdem vielen Dank für deine Hilfe!
PatRixx
PatRixx 12.02.2013 um 14:03:18 Uhr
Goto Top
Nach etwar rumbasteln und anpassen, funktioniert es jetzt ganz gut.
DANKE DAFÜR!

Jetzt habe ich noch eine Frage.

Die Variable "Num" nimmt ja beim erzeugen der Datei einen Wert an.
Dieser Wert ist ja meine Reparaturauftragsnummer.
Ich möchte, dass mir beim Öffnen der Vorlage, die neu generierte Nummer "Num" in einem definierten Feld in dem Dokument anzeigt.

Wie bekomme ich das hin?
bastla
bastla 12.02.2013 um 21:00:44 Uhr
Goto Top
Hallo PatRixx!

Falls es sich bei Deinem "definierten Feld" um eine Textmarke handelt, sollte das etwa so gehen:
ActiveDocument.Bookmarks("NameDerTextMarke").Range = Num
Grüße
bastla
PatRixx
PatRixx 13.02.2013 um 09:57:21 Uhr
Goto Top
Zitat von @bastla:
Hallo PatRixx!

Falls es sich bei Deinem "definierten Feld" um eine Textmarke handelt, sollte das etwa so gehen:
ActiveDocument.Bookmarks("NameDerTextMarke").Range = Num
> 
Grüße
bastla

Danke für den Befehl aber bei mir funktioniert das natürlich mal wieder nicht face-smile

Ich hab "ActiveDocument.Bookmarks("NameDerTextMarke").Range = Num" in VBA direkt unter die Anweisung geschrieben, wo die Variable "Num" ihren Wert bekommt. (siehe dein Code Zeile 11)

Müsste doch eigentlich funktionieren oder?
bastla
bastla 13.02.2013 um 12:48:20 Uhr
Goto Top
Hallo PatRixx!
Müsste doch eigentlich funktionieren oder?
Kann ich nicht beantworten - bisher weiß ich noch nicht einmal, ob Du tatsächlich eine Textmarke gemeint (und auch schon erstellt) hast ...

Grüße
bastla