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

VBA/Daten lesen aus xlsm in Unterordnern

VBA/Daten lesen aus xlsm in Unterordnern
23.05.2023 12:10:32
Chuck

Moin,
folgendes Grundproblem:
Ich habe ein Hauptverzeichnis, in dem ca 100 Unterordner mit einem Ordnernamen
"YYYY-MM-DD" existieren.
In jedem dieser Unterordner liegt u.a. eine bestimmte (immer gleich benannte XLSM) Datei.

Ich möchte nun aus jedem dieser Unterordner diese Exceldatei mit dem Namen "xxxxxx-00-en.xlsm" öffnen und ein oder mehrere Werte aus einem bestimmten Registerblatt auslesen und mit dem Datum es Unterordners (also dem Namen des Unterordners) in der Auslesedatei auflisten.

Ich hoffe, dass das einigermasßten verständlich beschrieben ist.
Kann mir jemand eventuell einen Hinweis geben, ob ein ähnliches Skript evenuell bereits existiert, auf dem ich aufbauen kann oder hat evenuell sogar direkt eine Lösung?

Gruss
Chuck

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA/Daten lesen aus xlsm in Unterordnern
23.05.2023 17:50:24
Oberschlumpf
Hi,

"dein Problem" ist eigtl keins mehr, denn wenn du in Google nach diesem Text suchen würdest...

vba datei in unterordner suchen

...dann würdest du ungefähr 57.000 Ergebnisse finden - und ich finde - schon mit dem ersten Treffer könntest du mit einigen, wenigen Änderungen im Code dein Problem als solches nicht mehr bezeichnen dürfen, da es erledigt wäre.

Ciao
Thorsten


AW: VBA/Daten lesen aus xlsm in Unterordnern
23.05.2023 20:50:48
Pappawinni
Ähm, ich hab da was....
Sammelt Pfade zu Dateien mit einem bestimmten Namen in einem Array
Kannst du ja mal probieren...., das ist halt relativ ungetestet.


Public Sub StartCollectingFilePaths()
   
    Dim arrPaths() As Variant
    Dim i As Long
    
    'Hier Pfad und Dateiname einsetzen, Beispiel:
    'arrPath = findFileInFolders("C:\Users", "Test.xlsm")
    
    arrPaths = findFileInFolders("C:\Users", "Test.xlsx")
    
    If isEmptyArray(arrPaths) Then
        MsgBox "no item found"
        Exit Sub
    End If
    
    MsgBox UBound(arrPaths) + 1 & " item(s) found"
    
    For i = LBound(arrPaths) To UBound(arrPaths)
       Debug.Print arrPaths(i)
    Next
   
End Sub

Private Function findFileInFolders(ByVal SourceFolderName As String, ByVal fileName As String) As Variant()
  
  'Erzeugt ein Array für Pfade in denen die Datei fileName zu finden ist
  'Die Suche erfolgt rekursiv in SourceFolderName und dessen Subfolder, ausgenommen System und Hidden Folders
  
  Dim FSO As Object, SourceFolder As Object, SubFolder As Object
  Dim FileItem
  Dim Result() As Variant
  Dim SubResult() As Variant
  Dim i As Long, j As Long
  
  Set FSO = CreateObject("Scripting.FileSystemObject")
  
  If FSO.GetDrive(FSO.GetDriveName(SourceFolderName)).Path = SourceFolderName Then
    Set SourceFolder = FSO.GetDrive(FSO.GetDriveName(SourceFolderName)).RootFolder
  Else
    Set SourceFolder = FSO.GetFolder(SourceFolderName)
  End If

  For Each FileItem In SourceFolder.Files
    Debug.Print FileItem.Name
    If UCase(FileItem.Name) = UCase(fileName) Then
       ReDim Result(0)
       Result(0) = FileItem.Path
       Exit For
    End If
  Next FileItem
    
  For Each SubFolder In SourceFolder.SubFolders
    If Not ((SubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
      SubResult = findFileInFolders(SubFolder.Path, fileName)
      On Error Resume Next
      If Not (isEmptyArray(SubResult)) Then
          If isEmptyArray(Result) Then
              i = 0
          Else
              i = UBound(Result) + 1
          End If
          ReDim Preserve Result(i + UBound(SubResult))
          For j = 0 To UBound(SubResult)
             Result(i) = SubResult(j)
             i = i + 1
          Next
      End If
      On Error GoTo 0
    End If
  Next SubFolder
  
  findFileInFolders = Result

End Function


Private Function isEmptyArray(myArray() As Variant) As Boolean
On Error Resume Next
If UBound(myArray)  0 Then
    isEmptyArray = True
Else
    isEmptyArray = False
End If

End Function





Anzeige
AW: VBA/Daten lesen aus xlsm in Unterordnern
23.05.2023 21:28:40
Pappawinni
Mit Collection ist es wahrscheinlich schöner...


Option Explicit

Public Sub StartCollectingFilePaths()
   
    Dim colPaths As Collection
    Dim path
    Dim i As Long
    
    'Hier Pfad und Dateiname einsetzen, Beispiel:
    'arrPath = findFileInFolders("C:\Users", "Test.xlsm")
    
    Set colPaths = findFileInFolders("C:\Users", "Quat_Test.xlsx")
    
    If colPaths.Count = 0 Then
        MsgBox "no item found"
        Exit Sub
    End If
    
    MsgBox colPaths.Count & " item(s) found"
    

    For Each path In colPaths
       ' Hier kannst du dann deine Files nacheinander abarbeiten....
       Debug.Print path
    Next
   
End Sub

Function findFileInFolders(ByVal SourceFolderName As String, ByVal fileName As String) As Collection
  
  'Erzeugt ein Array für Pfade in denen die Datei fileName zu finden ist
  'Die Suche erfolgt rekursiv in SourceFolderName und dessen Subfolder, ausgenommen System und Hidden Folders
  
  Dim FSO As Object, SourceFolder As Object, SubFolder As Object
  Dim FileItem
  Dim Result As New Collection
  Dim SubResult As Collection
  Dim i As Long, j As Long, x
  
  DoEvents
  
  Set FSO = CreateObject("Scripting.FileSystemObject")
  
  If FSO.GetDrive(FSO.GetDriveName(SourceFolderName)).path = SourceFolderName Then
    Set SourceFolder = FSO.GetDrive(FSO.GetDriveName(SourceFolderName)).RootFolder
  Else
    Set SourceFolder = FSO.GetFolder(SourceFolderName)
  End If

  For Each FileItem In SourceFolder.Files
    If UCase(FileItem.Name) = UCase(fileName) Then
       Result.Add FileItem.path
       Exit For
    End If
  Next FileItem
    
  For Each SubFolder In SourceFolder.SubFolders
    If Not ((SubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
      Set SubResult = findFileInFolders(SubFolder.path, fileName)
      If SubResult.Count > 0 Then
          For Each x In SubResult
             Result.Add x
          Next
      End If
    End If
  Next SubFolder
  
  Set findFileInFolders = Result

End Function



Anzeige
AW: VBA/Daten lesen aus xlsm in Unterordnern
23.05.2023 23:00:01
Luschi
Hallo Pappawinni,

von diesen Vba-Scripten besitze ich Dutzende, doch die habe ich alle in die Wüste geschickt.
Mit Power Query [Datei(en) aus Ordner einschl. Unterordner] läßt sich dieses Problem viel eleganter und streßfreier lösen.

Gruß von Luschi
aus klein-Paris


AW: VBA/Daten lesen aus xlsm in Unterordnern
23.05.2023 23:12:00
Pappawinni
Wie jetzt?
Besitzt du sie, oder sind sie in der Wüste?
Es führen halt viele Wege nach Rom und wenn einer über Hong Kong dahin will,... so what?


AW: VBA/Daten lesen aus xlsm in Unterordnern
24.05.2023 07:10:59
Chuck
OK, ganz vielen Dank. Damit werde ich mal weiter experimentieren.

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige