Teilstring aus Dateinamen auslesen?
Hallo beisammen,
ich versuche zwei Makros zu programmieren, die folgende Informationen aus dem jeweils aktuellen Dateinamen herauslesen und in ein Word-Dokument einfügen:
nämlich „Aktenzeichen“ und „Dokumentennummer“.
Die Dateinamen sind dabei wie folgt aufgebaut:
10-24743-06_XYZMuc_58495.DOCX
Die Dokumentennummer ist: 58495
Das Aktenzeichen ist: 24743
Alternativ könnte es auch so sein:
Der Dateinamen ist wie folgt aufgebaut:
10-A III 24743-06_XYZMuc_58495.DOCX
Die Dokumentennummer ist: 58495
Das Aktenzeichen ist: A III 24743
In beiden Fällen steht die Dokumentennummer immer hinter dem zweiten Unterstrich und vor dem Punkt (wenn die Dateiendung überhaupt "vorhanden" ist)
In beiden Fällen steht also steht das Aktenzeichen immer zwischen den zwei Bindestrichen.
Folgenden Eigenheiten sind zu beachten:
in Abhängigkeit davon, welche Einstellungen der jeweilige Benutzer vorgenommen hat (bekannte Dateiendungen anzeigen. j/n) wird das DCOX als Dateiendung in der Variable Dateiname (Schnellbausteine – Feld) mit übergeben oder auch nicht. Es gibt auch einzelne Dokumente, die noch im Doc-Format vorliegen.
Die Länge (Anzahl der Zeichen) von Aktenzeichen und Dokumentennummer sind von Dokument zu Dokument unterschiedlich, wird aber mindestens 5 Zeichen umfassen, mit zunehmender Tendenz. Die mit einem „–“ von dem Aktenzeichen getrennten Ziffern (hier: 10 und 06) werden wohl zweistellig bleiben (könnten höchstens dreistellig werden; wenn das zu höherer Komplexität führen würde, können wir das auch so festlegen, dass die immer zweistellig bleiben) , wie auch die Bindestriche vor und dahinter wie auch das „_XYZMuc_“ sind irrelevant.
Im Alternativfall könnten anstelle von „A III“ auch stehen: A I, A II, A IV, A V oder WZ. Es ist aber sicher, dass das Aktenzeichen von zwei „–“ „umrahmt“ ist.
Ich denke an folgende Lösung, jedoch fehlen mir als VBA-Laie die richtigen Befehle/Operatoren
Nun meine ich schon zu wissen, das anstelle von instr zu verwenden ist:
Wie aber "gewinne" und belege ich die Variablen ersterBindestrich, zweiterBindestrich?
Für Hilfe jeder Art wäre ich sehr dankbar!
ich versuche zwei Makros zu programmieren, die folgende Informationen aus dem jeweils aktuellen Dateinamen herauslesen und in ein Word-Dokument einfügen:
nämlich „Aktenzeichen“ und „Dokumentennummer“.
Die Dateinamen sind dabei wie folgt aufgebaut:
10-24743-06_XYZMuc_58495.DOCX
Die Dokumentennummer ist: 58495
Das Aktenzeichen ist: 24743
Alternativ könnte es auch so sein:
Der Dateinamen ist wie folgt aufgebaut:
10-A III 24743-06_XYZMuc_58495.DOCX
Die Dokumentennummer ist: 58495
Das Aktenzeichen ist: A III 24743
In beiden Fällen steht die Dokumentennummer immer hinter dem zweiten Unterstrich und vor dem Punkt (wenn die Dateiendung überhaupt "vorhanden" ist)
In beiden Fällen steht also steht das Aktenzeichen immer zwischen den zwei Bindestrichen.
Folgenden Eigenheiten sind zu beachten:
in Abhängigkeit davon, welche Einstellungen der jeweilige Benutzer vorgenommen hat (bekannte Dateiendungen anzeigen. j/n) wird das DCOX als Dateiendung in der Variable Dateiname (Schnellbausteine – Feld) mit übergeben oder auch nicht. Es gibt auch einzelne Dokumente, die noch im Doc-Format vorliegen.
Die Länge (Anzahl der Zeichen) von Aktenzeichen und Dokumentennummer sind von Dokument zu Dokument unterschiedlich, wird aber mindestens 5 Zeichen umfassen, mit zunehmender Tendenz. Die mit einem „–“ von dem Aktenzeichen getrennten Ziffern (hier: 10 und 06) werden wohl zweistellig bleiben (könnten höchstens dreistellig werden; wenn das zu höherer Komplexität führen würde, können wir das auch so festlegen, dass die immer zweistellig bleiben) , wie auch die Bindestriche vor und dahinter wie auch das „_XYZMuc_“ sind irrelevant.
Im Alternativfall könnten anstelle von „A III“ auch stehen: A I, A II, A IV, A V oder WZ. Es ist aber sicher, dass das Aktenzeichen von zwei „–“ „umrahmt“ ist.
Ich denke an folgende Lösung, jedoch fehlen mir als VBA-Laie die richtigen Befehle/Operatoren
dateiname = Dateiname
gesamtlaenge = Laenge(dateiname)
For x = 1 to gesamtlaenge
buchstabe = instr(dateiname, x, 1)
if buchstabe = "-"
if ersterBindestrich = 0
ersterBindestrich = x
else zweiterBindstrich = x
endif
endif
if buchstabe = "_"
if ersterUnterstrich = 0
ersterUnterstrich = x
else zweiterUnterstrich = x
endif
endif
next x
endfor
aktenzeichen = instr(dateiname, ersterBindestrich, zweiterBindestrich)
dokumentenummer = instr(dateiname, ersterUnterstrich, zweiterUnterstrich)
gesamtlaenge = Laenge(dateiname)
For x = 1 to gesamtlaenge
buchstabe = instr(dateiname, x, 1)
if buchstabe = "-"
if ersterBindestrich = 0
ersterBindestrich = x
else zweiterBindstrich = x
endif
endif
if buchstabe = "_"
if ersterUnterstrich = 0
ersterUnterstrich = x
else zweiterUnterstrich = x
endif
endif
next x
endfor
aktenzeichen = instr(dateiname, ersterBindestrich, zweiterBindestrich)
dokumentenummer = instr(dateiname, ersterUnterstrich, zweiterUnterstrich)
Nun meine ich schon zu wissen, das anstelle von instr zu verwenden ist:
Selection.TypeText (Mid(ActiveDocument.Name, ersterBindestrich, zweiterBindestrich))
Wie aber "gewinne" und belege ich die Variablen ersterBindestrich, zweiterBindestrich?
Für Hilfe jeder Art wäre ich sehr dankbar!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 223214
Url: https://administrator.de/contentid/223214
Ausgedruckt am: 14.11.2024 um 09:11 Uhr
3 Kommentare
Neuester Kommentar
Hallo dodyou,
mach das ganze am besten mit Regular Expressions das ist zuverlässiger
Grüße Uwe
mach das ganze am besten mit Regular Expressions das ist zuverlässiger
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True
regex.Pattern = "-([^\-]+)-.*_(\d{5,})"
Set matches = regex.Execute(dateiname)
if matches.count > 0 then
aktenzeichen = matches(0).Submatches(0)
dokumentennummer = matches(0).Submatches(1)
End if
Hallo dodyou!
Ich würde das mit "
Um den Dateinamen ohne Typ zu erhalten (dann würde
genügen) könntest Du
verwenden.
Grüße
bastla
Ich würde das mit "
Split()
" versuchen - etwa:Aktenzeichen = Split(Dateiname, "-")(1)
Dokumentennummer = Split(Split(Dateiname, "_")(2), ".")(0)
Dokumentennummer = Split(DateinameOhneTyp, "_")(2)
DateinameOhneTyp = CreateObject("Scripting.FileSystemObject").GetBaseName(Dateiname)
Grüße
bastla