Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1308to1312
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Ordnername als Variable im Makro

Ordnername als Variable im Makro
16.04.2013 00:13:02
Luca-Darius
Hallo,
ich habe viele Excel-Dateien mit Makros, die im Dateinamen und an verschiedenen anderen Stellen innerhalb des Makros eine bestimmte Jahreszahl aufweisen (z.B. 1972).
Die Datei selbst liegt in einem Unterordner. Ein übergeordneter Ordner hat immer genau diese Jahreszahl die ich als Variable an den verschiedenen Stellen in meinem Makro verwenden möchte - geht das und wenn ja wie?
Beispiel: S:\Ordnername\Unterordner1\1972\Unterordner2\Unterordner3\Unterordner4\Dateiname.xls
In einer Datei müsste auch der Orndername 1972 mit -1 (für das Jahr 1971) als Variable verwendet werden. Wie könnte der Code hierbei aussehen

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Jahr im Ordnernamen
16.04.2013 01:24:50
Erich
Hi,
probier mal

Option Explicit
Sub aTest()
Dim iJahr As Integer
iJahr = JahrImPfad()
If iJahr > 0 Then
MsgBox "Jahr: " & iJahr
Else
MsgBox "Kein gültiges Jahr im Pfad gefunden.", vbCritical
End If
End Sub
Function JahrImPfad()
Dim arrT, ii As Integer, dblW As Double
arrT = Split(ThisWorkbook.Path, "\")
For ii = 0 To UBound(arrT)
If IsNumeric(arrT(ii)) Then
dblW = arrT(ii)
' Jahr von 1945 bis 2032 sind gültig
If dblW = Int(dblW) And dblW > 1944 And dblW 
Die Fkt. JahrImPfad() gibt das erste im Pfad auftauchende Jahr zurück. Wird kein Jahr gefunden, ist der Wert 0.
Hier werden mal die Jahre 1945 bis 2032 als gültig angesehen. Das kannst du leicht anpassen.
Frage: Wenn mehrere Jahre im Pfad auftauchen - was soll dann geschehen?
Soll wie hier im Code das erste ausgegeben werden?
Wenn im Pfad ...\1972\... vorkommt und du 1971 brauchst, nimmst du einfach
iJahr = JahrImPfad() - 1
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Ordnername als Variable im Makro
16.04.2013 09:32:56
Luca-Darius
Vielen Dank schon mal für die Hilfe, die der Sache schon sehr nahe kommt.
In meinen Makros ist die vierstellige Jahreszahl aber oft auch in einem Dateinamen mit weiteren Zahlen "versteckt".
Beispiel : 20197201.XLT
Die Jahreszahl 1972 steht ja hierbei in der Mitte des Dateinamens. Dieser soll aber auch aus dem mit 1972 benannten Unterordner in der sich die Excel-Datei befindet mittels einer Variablen herausgelesen werden.
Danke fürs helfen - Gruß Luca-Darius

Verwendungsbeispiele
16.04.2013 09:51:04
Erich
Hi Luca (vermute ich mal :-)),
hier nopch eine paar Beispiele, wie du die Fkt. "JahrImPfad()" verwenden kannst:

Sub aTest()
Dim iJahr As Integer, iJahrV As Integer, strDatName As String
iJahr = JahrImPfad()
iJahrV = JahrImPfad() - 1
strDatName = "20" & JahrImPfad() & "01.XLT"
strDatName = "20" & CStr(JahrImPfad()) & "01.XLT"
End Sub
strDatName wird z. B. zu "20197201.XLT".
Hilft dir das weiter?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Ordnername als Variable im Makro
17.04.2013 08:00:30
Luca-Darius
Hallo Erich,
ich konnte die Umsetzung noch nicht erfolgreich testen, da mir nicht klar ist, was ich im Bereich der Pfade an der Stelle wo die Jahreszahl 1972 auftaucht einsetzen müsste. Mein Makro habe ich mal nur auf das Öffnen der Datei aus einem bestimmten Pfad reduziert:
Sub aTest()
Dim iJahr As Integer, iJahrV As Integer, strDatName As String
iJahr = JahrImPfad()
iJahrV = JahrImPfad() - 1
strDatName = "K:\Jahr" & JahrImPfad() & "\Monat01"
strDatName = "K:\Jahr" & CStr(JahrImPfad()) & "\Monat01"
ChDir "K:\Jahr1972\Monat01"
Workbooks.Open Filename:= _
"K:\Jahr1972\Monat01\FRANKFURT-197201.XLT", Editable:=True
End Sub
Klar - die 1972 (die bei Workbooks.Open gleich 2mal vorkommt) muss ja noch an dieser Stelle ersetzt werden - aber wie? Wie würde nun der Code für das Öffnen der Datei aussehen, wenn die Jahreszahl aus dem Pfad genommen werden soll?
Danke für die Unterstützung eines absoluten Anfängers!
Gruß - Luca

Anzeige
noch offene Frage...
17.04.2013 09:01:17
Luca-Darius
sorry - ich hatte das Kontrollkästchen für noch offene Fragen nicht aktiviert...

AW: noch offene Frage...
17.04.2013 09:22:24
Luca-Darius
... wie kann man den Code auch gleich auf das ganze Modul anwenden, da in verschiedenen Makros innerhalb des Modul die Jahreszahl im Pfad ständig vorkommt?

Mehrfachverwendung
17.04.2013 10:43:06
Erich
Hi Luca, (Das ist ein Gruß. :-))
ohne Kenntnis deiner Programm- bzw. Makrostruktur kann ich da kaum vernünftig antworten.
Ein paar Gedanken:
Die Fkt. JahrImPfad() kannst du überall aufrufen, wo das Jahr gebraucht wird. Auch mehrfach.
Wenn das zu viel Laufzeit kostet (bei mehr als 1000 Aufrufen direkt hintereinander vielleicht),
lässt sich das vermutlich beschleunigen.
Rufen sich die Makros gegenseitig auf? Gibt es ein "Start"-Makro, in dem das Jahr einmalig ermittelt werden könnte
und das das Jahr an alle anderen Makros weitergeben könnte? (Etwa per Parameterübergabe oder in einer globalen Variablen)
Aber noch ist ja nicht klar, wie das Jahr überhaupt zu ermitteln ist... (siehe Beitrag von 09:48:19)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
P.S.: "noch offen" brauchst du nicht zu aktivieren - ich sehe ohnehin nach. :-)

Anzeige
Aufgabe nicht ganz klar
17.04.2013 09:48:19
Erich
Hi Luca,
im Moment ist mir nicht recht klar, was du eigentlich brauchst. Ich versuchs mal zu klären.
Du hast eine Mappe A, in der der Code steht. Mappe A ist gespeichert in einem Ordner Ordner B.
Der Name der Mappe A kann z. B. sein:
'abcdefg.xls' oder oder 'abc2007efg.xlsm'
der Name des Ordners B z. B.
'K:\Jahr1972\Monat01\FRANKFURT-197201'
Nun möchtest du aus den Namen des Ordners B und der Mappe A eine Jahreszahl 'iJahr' ermitteln, die du dann im Code
weiter verwenden kannst.
Ein Beispiel für eine Verwendung ist das Öffnen einer weiteren Mappe, z. B.
Workbooks.Open Filename:="K:\Jahr1972\Monat01\FRANKFURT-197201.XLT"
Wenn man iJahr hat und iJahr = 1972 ist, kann man schreiben:
Workbooks.Open Filename:="K:\Jahr" & iJahr & "\Monat01\FRANKFURT-" & iJahr & "01.XLT"
Man baut sich also den Namen aus Texten und der Jahreszahl zusammen.
Habe ich das soweit verstanden?
Nun zum Ermitteln der Jahreszahl:
In deinem Beispiel 20197201.XLT siehst du 1972 als Jahr. Warum nicht 2019? Das wäre doch auch gültig.
Was sollte hier die Jahreszahl werden?
K:\KD020117\A19985\110420132\xy201989.xls
Mögliche Lösungen: 2011, 1998, 2013, 2019, 1989
Das hat noch gar nichts mit einem Programm oder mit VBA zu tun.
Es muss erst mal fachlich klar sein, wie die Lösung ermittelt werden soll.
Dazu muss vielleicht festgelegt sein, welche Struktur die Ordner- bz. Dateinamen haben.
Im Beispiel könnte das z. B. so aussehen. Die Jahreszahl steht immer an der mit '####' bezeichneten Stelle:
K:\KD020117\A19985\1104####2\xy201989.xls
Die anderen Ziffern (gleich mit ? bezeichnet) gehören z. B. zu Kunden- oder Auftragsnummern oder sind fest.
K:\KD?\A?\?####?\xy?.xls
Dann hat man ein Muster und kann eine Regel formulieren, z. B.
"Suche das Jahr im untersten Unterordner an der fünft- bis zur vorletzten Stelle."
Dann würde das Jahr gefunden, das anstelle der #### im Ordnernamen steht. Z. B. ergäbe sich aus
'C:\182019912\abc.xls' das Jahr 1991.
Alle anderen Ziffern bleiben ungesehen.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
....fast am Ziel...
17.04.2013 11:18:44
Luca-Darius
Hallo Erich,
vielen Dank für die Mühe die du dir mit mir machst.
du hast es richtig verstanden, ich möchte in der Mappe A aus einem Code eines ganzen Moduls mit vielen Makros immer wieder eine vierstellige Jahreszahl einsetzen, die sich aus dem Ordner B ergibt.
Im vierten Unterordnern liegt die Mappe A. Im zweiten Unterordner (also 2 Ordner-Ebenen weiter oben) steht die benötigte Jahreszahl im vierstelligen Ordnernamen (1972). Diese Ordner-Struktur ist immer so gegeben.
Im Code der Mappe A werden auch Daten aus anderen Laufwerken eingelesen, die aber ebenfalls die Zahl 1972 im Pfad haben. Der Code für das ganze Modul meiner Mappe A könnte nun von mir so angepasst werden, dass ich überall wo im Moment die Zahl 1972 auftaucht viermal #### einsetze.
Ziel des Ganzen ist es die fertige Mappe A, die zum einlesen von Daten aus dem Jahr 1972 dient (weil sie im Ordner 1972 liegt), später in einen neu erstellten Ordner mit dem Namen 1973 kopiert wird um hier nun die Daten aus dem Jahr 1973 einzulesen ohne das in der Mappe etwas angepasst werden muss.
Wie müsste der Code aussehen, der dem Modul vorangestellt wird, um die Jahreszahl aus dem Odner 1972 oder 1973 usw. auszulesen und für die #### eingesetzt zu werden?
Danke und Gruß - Luca

Anzeige
AW: ....fast am Ziel...
17.04.2013 12:13:15
Erich
Hi Luca,
so kann das jetzt gehen. Die Ordnerstruktur ist also:
X:\2014\2015\2016\2017\DATEI2018.xlsm
Darin ist 2015 die Jahreszahl (2. Unterordner).
Wie die Über- und Unterordner heißen, ist egal. Damit ergäbe sich aus
X:\abc\1999\2013\DATEI2018.xlsm
oder
X:\abc\1999\DATEI2018.xlsm
die Jahreszahl 1999.
Da es ja nicht immer der 2. Unterordner sein muss - vielleicht soll es ja auch mal der 1. oder 4. sein -
erwartet die Fkt. die Nummer des Unterordners als Parameter.
Hier die VBA-Funktion, die irgendwo im Modul stehen sollte:

Function JahrImPfad(intUnter As Integer)
' bestimmt das Jahr aus dem vorgegebenen Unterordner
'    JahrImPfad(2) liefert das Jahr 2015 aus
'    X:\2014\2015\2016\2017\DATEI2018.xlsm
'    JahrImPfad(4) liefert das Jahr 2017.
Dim strT As String, dblW As Double
If ThisWorkbook.Path > "" Then
strT = Split(ThisWorkbook.Path, "\")(intUnter)
If Len(strT) = 4 And IsNumeric(strT) Then
dblW = strT
' Jahre von 1945 bis 2032 sind gültig
If dblW > 1944 And dblW 
Uns so kannst du das anwenden, an einem Beispiel. Statt
Workbooks.Open Filename:="K:\Jahr1977\Monat01\FRANKFURT-197701.XLT"
schreibst du
Workbooks.Open Filename:="K:\Jahr" & JahrImPfad(2) & "\Monat01\FRANKFURT-" & JahrImPfad(2) & "01.XLT"
Dann wird da wo die Fkt. steht das jeweils ermittelte Jahr eingesetzt.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Am Ziel !!!
17.04.2013 13:10:42
Luca-Darius
Hallo Erich,
dein Ergebnis ist einfach Klasse. Vielen herzlichen Dank - es funktioniert nun so wie gewünscht.
Die Funktion war ja von dir in einer Zeitspanne bis zum Jahr 2032 vorgesehen. So wie ich dich in deiner ersten Rückmeldung verstanden habe, kann ich aus 2032 auch das Jahr 2045 einbauen. Würde es - was die Zukunkt anbetrifft - eine Grenze geben?
Vielen Dank für eine letzte Rückmeldung zu diesem Thema von dir!
Schöne Grüße nach Kamp-Lintfort - Luca

Grenzerfahrung
17.04.2013 13:31:51
Erich
Hi Luca,
ja - es wird eine Grenze geben. Ich sehe sie - jedenfalls innerhalb VBA - beim Jahr 9999... :-)
Ob Windows da noch mitspielt? ;-)
Grüße aus Kamp-Lintfort von Erich
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige