Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

VBA Dateiname auslesen, bearbeiten und wieder abspeichern

Frage Entwicklung VB for Applications

Mitglied: PatRixx

PatRixx (Level 1) - Jetzt verbinden

11.02.2013, aktualisiert 12:03 Uhr, 6837 Aufrufe, 10 Kommentare

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

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

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
Mitglied: bastla
11.02.2013 um 12:32 Uhr
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
Bitte warten ..
Mitglied: PatRixx
11.02.2013 um 13:01 Uhr
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.
Bitte warten ..
Mitglied: bastla
11.02.2013 um 14:25 Uhr
Hallo PatRixx!

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

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

Super!
Erstmal vielen Dank.

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

Magst du vielleicht auch selber etwas tun?

Grüße
bastla
Bitte warten ..
Mitglied: PatRixx
11.02.2013 um 14:55 Uhr
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!
Bitte warten ..
Mitglied: PatRixx
12.02.2013 um 14:03 Uhr
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?
Bitte warten ..
Mitglied: bastla
12.02.2013 um 21:00 Uhr
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
Bitte warten ..
Mitglied: PatRixx
13.02.2013 um 09:57 Uhr
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

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?
Bitte warten ..
Mitglied: bastla
13.02.2013 um 12:48 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...