Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1568to1572
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

Ordner öffnen, der bestimmt Zeichenfolge enthält

Ordner öffnen, der bestimmt Zeichenfolge enthält
01.08.2017 09:07:59
Matze
Hallo liebes Herber-Forum.
Ich habe wieder mal ein Problem, bei dem mir schon der Ansatz einer Idee zur Umsetzung fehlt.
Folgende Aufgabenstellung:
Aus unserem Abrechnungssystem ziehen wir verschieden Daten heraus, die wir überprüfen und in einer großen Excel-Datei abbilden. Ein Großteil der Prüfungen wird automatisch umgesetzt, ein Teil muss manuell nachgeprüft werden.
Für die manuelle Prüfung wird eine separate Fehlerliste erzeugt und an den jeweiligen Sachbearbeiter zur Bearbeitung versendet. Der Bearbeit macht in der jeweiligen Liste eine Bearbeitungsvermerk.
Nach der Bearbeitung werden aktualisierte Daten aus dem System gezogen und die Prüfung erfolgt erneut.
Das Problem dabei ist, dass in vielen Konstellationen zwar ein Fehler bearbeitet wurde, es aber eventuell noch weitere Fehler gibt, die dazu führen, dass die Fehlerliste nicht leer ist.
Es soll also vermieden werden, dass bereits geprüfte Fehler noch einmal bearbeitet werden. Daher ist es nötig, die Bearbeitungsvermerke einzuspielen. Und genau hier liegt das Problem. Folgende einfach Ordnerstruktur zur Verdeutlichung:
Ordner 1. Prüflauf
- Stammdatei (zum erzeugen der Prüfliste)
- Fehlerliste 1
- Fehlerliste 2
- Fehlerliste n
Ordner 2. Prüflauf
- Stammdatei (zum erzeugen der Prüfliste)
Ich befinde mich als nun im Ordner 2. Prüflauf in der Stammdatei und möchte aus den jeweiligen Fehlerlisten die Bearbeitungsvermerke importieren.
Mein Problem ist aber jetzt: wie steuere ich den richtigen Ordner an?
Bisher ermittle ich von der aktuellen Datei ausgehend den Indexr des Ordner (also hier die 2). Ich muss also als nächstes den Ordner mit dem Index 2-1 (also 1. Prüflauf) ansteuern und dann die entsprechende Prüfliste öffnen.
Konkret will ich also eine Ordnerstruktur nach einem bestimmten Zeichen durchsuchen, den Ordnernamen auslesen, der dieses Zeichen enthält ermitteln und den kompletten Namen des gefunden Ordners in eine Variable übernehmen. Die weitere Verarbeitung sollte ich dann selbst hin bekommen.
Hat jemand ein Idee, wie ich das anstellen kann?
Mfg Matze

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
muss doch noch einmal Nachfragen...
01.08.2017 10:28:06
Tino
Hallo,
wie sieht deine Ordner Struktur aus?
Wie sind die Ordner benannt, wo steht der Index am Anfang, am Ende oder sonst irgendwo?
Beispiel:
C:\temp\Arbeitsordner
C:\temp\Arbeitsordner\Ordner 1-1
C:\temp\Arbeitsordner\Ordner 2-1
Und jetzt soll der Ordner „Ordner 2-1“ gefunden werden weil dieser den größten Index hat?
Gruß Tino
AW: muss doch noch einmal Nachfragen...
01.08.2017 10:50:49
Matze
Hallo Tino. Danke für Deine Antwort. Du hast es fast richtig erfasst.

wie sieht deine Ordner Struktur aus?
Wie sind die Ordner benannt, wo steht der Index am Anfang, am Ende oder sonst irgendwo?
Die Ordnerstruktur sieht wie folgt aus:
C:\temp\Arbeitsordner\1. Ordner
C:\temp\Arbeitsordner\2. Ordner
C:\temp\Arbeitsordner\3. Ordner
.
.
.
C:\temp\Arbeitsordner\Ordner n
Der zu suchende Index Steht dabei immer als 1. Zeichen im Ordner-Namen des letzten Unterordners.

Und jetzt soll der Ordner „Ordner 2-1“ gefunden werden weil dieser den größten Index hat?
Gruß Tino
Ich kopiere die Ausgangsdatei in den jeweilig letzten Ordner, es soll immer die Prüfliste aus dem Index - 1ten Ordner geöffnet werden. Also wenn ich im 10. Ordner stehe die Datei aus dem 9. usw. Die Anzahl der Ordner hängt von der Häufigkeit der Prüfläufe ab und kann daher variieren. Es können also mal 10 und mal nur 3 sein.
Ich hoffe, dass hilft dir weiter.
Mfg Matze
Anzeige
AW: muss doch noch einmal Nachfragen...
01.08.2017 11:05:16
Tino
Hallo,
ok. teste mal diese Variante.
Sub Beispiel()
Dim strArbeitsOrdner$, sMaxSubFolder$

'Pfad Arbeitsordner Ordner anpassen
strArbeitsOrdner = "C:\temp\Arbeitsordner1"
'Suche Unterordner mit max Index
sMaxSubFolder = FindSubFolderMaxIndex(strArbeitsOrdner)

If sMaxSubFolder = "" Then
'nichts gefunden
MsgBox "nix gefunden!"
Exit Sub
End If

'Ausgabe oder weitere Verwendung
MsgBox sMaxSubFolder
End Sub

Function FindSubFolderMaxIndex(ByVal strPath$) As String
Dim FSO As Object, FO As Object, FOSUB As Object
Dim sName$
Dim tmpIndex&, lngIndex&
Dim RegEx As Object

strPath = strPath & IIf(Right$(strPath, 1) <> "\", "\", "")

Set FSO = CreateObject("Scripting.FileSystemObject")
If Not FSO.folderexists(strPath) Then Exit Function
Set FO = FSO.GetFolder(strPath)

Set RegEx = CreateObject("Vbscript.Regexp")
With RegEx
.MultiLine = False
.Pattern = "^\d+"
.Global = False
End With

For Each FOSUB In FO.subfolders
If RegEx.test(FOSUB.Name) Then
tmpIndex = CLng(RegEx.Execute(FOSUB.Name)(0))
If sName = "" Then
sName = FOSUB.Name
lngIndex = tmpIndex
Else
If tmpIndex > lngIndex Then
sName = FOSUB.Name
lngIndex = tmpIndex
End If
End If
End If
Next


If sName <> "" Then
FindSubFolderMaxIndex = strPath & sName & "\"
End If

Set RegEx = Nothing
Set FSO = Nothing
End Function
Gruß Tino
Anzeige
AW: muss doch noch einmal Nachfragen...
01.08.2017 11:21:16
Matze
Hallo Fennek.

den Namen des letzten Unterordners kann man mit InstrRev(ThisWorkbook.Path, "\"). Die Val(Text)  _
Funktion liefert die Zahl am Beginn des Textes.
mfg
Das habe ich auch genau so umgesetzt, das funktioniert sehr gut.
Hallo Tino.
Hallo,
ok. teste mal diese Variante.
Es tut mir sehr leid, aber leider verstehe ich absolut nicht, was du hier zusammengeschrieben hast. Ich kann es daher leider auch nicht testen. Dennoch vielen Dank, dass du dir die Mühe gemacht hast. Nach dem, was ich gelesen und rudimentär verstanden habe, ist das auch viel zu komplex, was du hier zusammengebaut hast und geht weit über meine Fragestellung hinaus.
Ich hoffe, dass vielleicht jemand anderes noch eine einfachere und für mich verständlicherer Lösung hat...
Anzeige
AW: muss doch noch einmal Nachfragen...
01.08.2017 11:30:22
Tino
Hallo,
in strArbeitsOrdner musst Du nur den Pfad angeben wo die Unterordner enthalten sind.
In MsgBox sMaxSubFolder hast du dann den Ordner mit dem größten Index am Anfang.
Die Val() Funktion hat den Nachteil wenn keine Zahl wird 0 ausgegeben,
aber 0 kann auch ein Index sein!
Naja ist Egal, Hauptsache es funktioniert bei dir!
Gruß Tino
AW: muss doch noch einmal Nachfragen...
01.08.2017 12:04:05
Matze
Hallo Tino.
Ich habe den Code jetzt so weit eingebaut, dass er auch das tut was er soll.
Leider ist ein entscheidender Fehler in dem code erhalten:
Er ermittelt mir in der Variable "sMaxSubFolder" den höchsten Ordner, also der mit der Höchsten Startnummer.
Ich benötige aber die Höchste Nummer abzüglich 1.
Könntest du den Code noch dahingehend anpassen und die Änderungen markieren?
Mfg Matze
Anzeige
bin nicht am PC...
01.08.2017 12:24:23
Tino
Hallo,
komme erst später dazu.
Aber was heißt abzüglich 1.
Meinst du jetzt den vorletzten Ordner?
Gruß Tino
AW: bin nicht am PC...
01.08.2017 13:05:09
Matze
Hallo Tino.
Ja, genau das Meine ich.
Vielleicht noch mal zur Erklärung aus meinem Eingangspost, was ich damit plane:
Es sind immer mehrere Durchläufe der Prüfung notwendig.
Manche Fehler sind z.B. im 2. Prüflauf schon vom Mitarbeiter als plausibel gekennzeichnet worden, tauchen aber dennoch immernoch nach den Vorgegebenen Testkriterien als Fehler auf.
Damit sich niemand mehr hin setzen muss und die Prüfung erneut durchgeführt wird, soll die Bemerkung aus dem vorherigen Prüflauf mit übernommen werden.
Daher auch das öffnen der Tabelle quasi aus dem vorherigen Ordner.
Mfg Matze
Anzeige
AW: bin nicht am PC...
01.08.2017 20:42:09
Tino
Hallo,
sorry bin nicht früher an den PC gekommen!
Hier der angepasst Code.
Ersetze die alte Function durch diese!
Function FindSubFolderMaxIndex(ByVal strPath$) As String
Dim FSO As Object, FO As Object, FOSUB As Object
Dim sName$, sVorlName$
Dim tmpIndex&, lngIndex&
Dim RegEx As Object
strPath = strPath & IIf(Right$(strPath, 1)  "\", "\", "")
Set FSO = CreateObject("Scripting.FileSystemObject")
If Not FSO.folderexists(strPath) Then Exit Function
Set FO = FSO.GetFolder(strPath)
Set RegEx = CreateObject("Vbscript.Regexp")
With RegEx
.MultiLine = False
.Pattern = "^\d+"
.Global = False
End With
For Each FOSUB In FO.subfolders
If RegEx.test(FOSUB.Name) Then
tmpIndex = CLng(RegEx.Execute(FOSUB.Name)(0))
If sName = "" Then
sName = FOSUB.Name
lngIndex = tmpIndex
Else
If tmpIndex > lngIndex Then
sVorlName = sName
sName = FOSUB.Name
lngIndex = tmpIndex
End If
End If
End If
Next
If sName  "" Then
FindSubFolderMaxIndex = strPath & sVorlName & "\"
End If
Set RegEx = Nothing
Set FSO = Nothing
End Function

Gruß Tino
Anzeige
AW: bin nicht am PC...
02.08.2017 07:17:06
Matze
Hallo Tino.
Vielen Dank, funktioniert nach 1. Test einwandfrei.
Du hast mir damit sehr geholfen. Spitze!
Mfg Matze
AW: Val(Text)
01.08.2017 11:06:55
Fennek
Hallo,
den Namen des letzten Unterordners kann man mit InstrRev(ThisWorkbook.Path, "\"). Die Val(Text) Funktion liefert die Zahl am Beginn des Textes.
mfg

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige