Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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

Anzeige

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

Anzeige
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

Anzeige
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
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Ordnernamen als Variable im Excel-Makro nutzen


Schritt-für-Schritt-Anleitung

Um den Ordnernamen als Variable in deinem Excel-Makro zu verwenden, kannst du die folgende Vorgehensweise nutzen:

  1. Erstelle die Funktion JahrImPfad: Diese Funktion ermittelt das Jahr aus dem Dateipfad.

    Function JahrImPfad(intUnter As Integer) As Integer
       Dim strT As String
       If ThisWorkbook.Path <> "" Then
           strT = Split(ThisWorkbook.Path, "\")(intUnter)
           If Len(strT) = 4 And IsNumeric(strT) Then
               JahrImPfad = Val(strT)
           Else
               JahrImPfad = 0
           End If
       End If
    End Function
  2. Verwende die Funktion in deinem Makro: Du kannst dann das Jahr in deinem Makro verwenden, um beispielsweise eine Datei zu öffnen.

    Sub aTest()
       Dim iJahr As Integer
       iJahr = JahrImPfad(2) ' Ermittelt das Jahr aus dem zweiten Unterordner
       Workbooks.Open Filename:="K:\Jahr" & iJahr & "\Monat01\FRANKFURT-" & iJahr & "01.XLT"
    End Sub
  3. Pfade anpassen: Achte darauf, dass die Pfade korrekt sind und die Struktur deiner Ordner den Annahmen der Funktion entspricht.


Häufige Fehler und Lösungen

  • Fehler: "Kein gültiges Jahr im Pfad gefunden."

    • Lösung: Überprüfe den Pfad. Stelle sicher, dass der Ordnername tatsächlich eine vierstellige Jahreszahl enthält.
  • Fehler: "Typenkonflikt."

    • Lösung: Achte darauf, dass die Variablen korrekt deklariert sind. Verwende Integer für Jahre und String für Dateinamen.
  • Fehler: "Datei konnte nicht gefunden werden."

    • Lösung: Vergewissere dich, dass der vollständige Dateipfad korrekt ist und die Datei existiert.

Alternative Methoden

Eine alternative Methode zur Ermittlung des Jahres aus dem Dateipfad besteht darin, den gesamten Pfad nach der Jahreszahl zu durchsuchen. Hier ist ein Beispiel:

Function JahrImPfad() As Integer
    Dim arrT() As String
    Dim i As Integer
    arrT = Split(ThisWorkbook.Path, "\")
    For i = 0 To UBound(arrT)
        If IsNumeric(arrT(i)) And Len(arrT(i)) = 4 Then
            JahrImPfad = CInt(arrT(i))
            Exit Function
        End If
    Next i
    JahrImPfad = 0 ' Kein Jahr gefunden
End Function

Diese Funktion sucht nach einer vierstelligen Zahl im gesamten Pfad.


Praktische Beispiele

Hier sind einige praktische Beispiele zur Verwendung der Funktion JahrImPfad:

Sub Beispiel1()
    Dim iJahr As Integer
    iJahr = JahrImPfad(1) ' Ermittelt das Jahr aus dem ersten Unterordner
    MsgBox "Das Jahr ist: " & iJahr
End Sub

Sub Beispiel2()
    Dim strDatName As String
    strDatName = "20" & JahrImPfad(2) & "01.XLT"
    MsgBox "Der Dateiname ist: " & strDatName
End Sub

Diese Beispiele zeigen, wie du das Jahr in verschiedenen Kontexten nutzen kannst.


Tipps für Profis

  • Globale Variablen: Du kannst das Jahr in einer globalen Variablen speichern, um die Anzahl der Funktionsaufrufe zu minimieren. Dies kann die Leistung deines Makros verbessern.

  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung in deinen Makros, um unerwartete Situationen abzufangen.

  • Dokumentation: Kommentiere deinen Code ausführlich, damit du oder andere ihn später leichter verstehen können.


FAQ: Häufige Fragen

1. Wie kann ich die Funktion für andere Jahre anpassen? Du kannst die Funktion JahrImPfad so anpassen, dass sie auch Jahre außerhalb des Bereichs von 1945 bis 2032 akzeptiert, indem du die Bedingungen in der Funktion änderst.

2. Was mache ich, wenn ich mehrere Jahre im Pfad habe? Du kannst die Funktion so anpassen, dass sie das erste oder letzte gefundene Jahr zurückgibt, je nach deinen Anforderungen.

3. Kann ich die Funktion in anderen Modulen verwenden? Ja, du kannst die Funktion JahrImPfad in jedem Modul verwenden, in dem du sie benötigst. Stelle sicher, dass sie sich im gleichen Arbeitsbuch oder in einem globalen Modul befindet.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige