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

Tabellen aus Unterordnern zusammenfassen

Tabellen aus Unterordnern zusammenfassen
Thomas
Hallo excel-Gemeinde,
dieses Forum hat mir schon sehr oft wirklich gute Hilfestellung geleistet. Bis jetzt konnte ich mir aus den unzähligen Beiträgen mit viel try&error die Makros an meine Bedürfnisse anpassen.
Jetzt bin ich aber offensichtlich an meine Grenzen gestossen.
Folgendes Makro habe ich auch aus diesem Forum kopiert, es fasst excel-Tabellen die in einem Ordner gespeichert sind in einer Datei zusammen und reiht die Tabellen aneinander.
Option Explicit
'Erstellt unter Excel2007 in Datei kompatibel zu Excel 2003 und älter

Sub DatenAktualisieren()
Dim wbQuelle As Workbook, wksQuelle As Worksheet
Dim PfadQuelle As String, strQuelle As String
Dim wbZiel As Workbook, arrWksZiel() As Worksheet, intI As Integer, intArr As Integer
Dim ZeileQuelle As Long, ZeileZiel As Long, Spalte As Long
Dim wksSt As Worksheet, SpalteDatei As Long
On Error GoTo Fehler
Set wbZiel = ActiveWorkbook
Set wksSt = wbZiel.Worksheets("Steuerung")
Application.ScreenUpdating = False
SpalteDatei = wksSt.Range("A11").Value 'Nummer der Spalte in der ggf. Dateiname eingetragen   _
_
wird
With wbZiel
'zu vergleichende Worksheet-Objekte dem Array zuweisen
intArr = 0
For intI = 1 To .Worksheets.Count
With .Worksheets(intI)
Select Case .Name
Case wksSt.Range("A17"), wksSt.Range("A18"), wksSt.Range("A19"), _
wksSt.Range("A20"), wksSt.Range("A21"), wksSt.Range("A22")
'Name(n) der Blätter, die in Zusammenfassung nicht _
aktualisiert werden sollen
Case Else
'Array mit den abzugleichendne Tabellenblättern redimensionieren
intArr = intArr + 1
ReDim Preserve arrWksZiel(1 To intArr)
'Worksheet-Objekt zuweisen
Set arrWksZiel(intArr) = wbZiel.Worksheets(intI)
'vorhandene Alt-Daten in den Tabellenblättern löschen
.Range(.Cells(3, 1), .Cells(.Rows.Count, 33)).ClearContents
' If .Cells(.Rows.Count, 2).End(xlUp).Row >= 32 Then
'If SpalteDatei > 0 Then
' .Cells(3, SpalteDatei).Value = "Dateiname"
'End If
' .Range(.Rows(2), .Rows(.Cells(.Rows.Count, 2).End(xlUp).Row)).ClearContents
'End If
End Select
End With
Next
End With
'Verzeichnis mit den Quelldaten festlegen
If wksSt.Range("A14")  "" Then
PfadQuelle = wksSt.Range("A14")
Else
PfadQuelle = wbZiel.Path              'orig
End If
'Dateinamen in Pfad abarbeiten
strQuelle = Dir(PfadQuelle & Application.PathSeparator & "*.xl*")   'orig
intArr = 0
Do Until strQuelle = ""
Select Case LCase(strQuelle)
Case LCase(wbZiel.Name), LCase(wksSt.Range("A25")), LCase(wksSt.Range("A26")), _
LCase(wksSt.Range("A27")) 'Liste ggf. anpassen/ergänzen
'diese Dateien beim Auslesen überspringen
Case Else
'Quelldatei öffnen
Set wbQuelle = Workbooks.Open( _
Filename:=PfadQuelle & Application.PathSeparator & strQuelle, _
ReadOnly:=False, _
UpdateLinks:=True)
intArr = intArr + 1
Application.StatusBar = "DateiNummer " & Format(intArr, "000") _
& " wird bearbeitet"
'Tabellenblätter in Quelle abarbeiten
For intI = 1 To 1 'UBound(arrWksZiel)
Set wksQuelle = wbQuelle.Worksheets(arrWksZiel(intI).Name)
With wksQuelle
'Prüfen, Daten ab Zeile 3 vorhanden
If .Cells(.Rows.Count, 2).End(xlUp).Row >= 3 Then
'Daten in Zusammenfassung einfügen
For ZeileQuelle = 3 To .Cells(.Rows.Count, 2).End(xlUp).Row
With arrWksZiel(intI)
ZeileZiel = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
For Spalte = 2 To 33
.Cells(ZeileZiel, Spalte).Value = _
wksQuelle.Cells(ZeileQuelle, Spalte).Value
Next
'ggf. den Dateinamen der Quelle eintragen
If SpalteDatei  0 Then
.Cells(ZeileZiel, SpalteDatei).Value = wbQuelle.Name
End If
End With
Next
End If
End With
Resume_Next_Sheet:
Next
'Quelldatei wieder schliessen - inklusive speichern
Application.DisplayAlerts = False
wbQuelle.Close savechanges:=True
Set wbQuelle = Nothing
Application.DisplayAlerts = True
End Select
'Namen der nächste Quelldatei einlesen
strQuelle = Dir
Loop
Application.ScreenUpdating = True
'Aktualisierungsdatum im Blatt Steuerung eintragen
wksSt.Range("C8").Value = Now
MsgBox "Fertig" & vbLf & vbLf & intArr & "  Dateien eingelesen"
Fehler:
With Err
Select Case .Number
Case 0 'kein Fehler
Case 9 'Tabellenblatt in Quelle nicht gefunden
Resume Resume_Next_Sheet
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
With Application
.ScreenUpdating = True
.StatusBar = False
End With
If Not wbQuelle Is Nothing Then
Application.DisplayAlerts = False
wbQuelle.Close savechanges:=True
Set wbQuelle = Nothing
Application.DisplayAlerts = True
End If
Set wbZiel = Nothing: Set wksSt = Nothing: Set wksQuelle = Nothing
ReDim arrWksZiel(1 To 1)
End Sub
Jetzt zu meiner Frage:
Wie schaffe ich es, dass ich einen Ordner anwählen kann, in dem sich wiederum mehrere Unterordner mit excel-Tabellen befinden, die mir das Makro dann zusammenfasst.
D.h. die Dateien liegen nicht alle in einem Ordner, sondern immer eine Ordner-Ebene darunter (subfolder)
Quäle mich seit geraumer Zeit mit der Lösung dieses Problems und habe bis jetzt nichts brauchbares gefunden.
Gruß
Thomas

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

Betreff
Benutzer
Anzeige
eine Variante
06.06.2010 19:56:24
Tino
Hallo,
hier mal eine Möglichkeit die Dateien zu suchen.
Diese werden in einem Array abgelegt, dies kannst Du als Schleife in Deinen Code einbauen.
Deinen Code habe ich jetzt nicht getestet.
kommt als Code in Modul1
Option Explicit 
 
Sub Suchmaschine() 
Dim FileArray() As String, strPath As String 
Dim LCount As Long 
 
strPath = fncGetFolder 'Ordnerauswahl 
 
'1.Parameter Area 
'2.Parameter Ordner, wo soll gesucht werden? 
'3.Parameter Datei,* als Platzhalter verwenden,Optional leer ist alle 
'4.Parameter mit Unterordner = True, Optional False ist ohne 
'5.Parameter Zähler 
ListFilesInFolder FileArray, strPath, "*.xl*", True, LCount 
 
 
If LCount > 0 Then 
'Schleife über alle gefundene Dateien 
 For LCount = Lbound(FileArray) To Ubound(FileArray) 
    Debug.Print FileArray(LCount) 
 Next LCount 
End If 
 
Erase FileArray 
End Sub 
 
kommt als Code in Modul2
Option Explicit 
 
Private Declare Function MoveWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal bRepaint As Long) As Long 
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
    ByVal nIndex As Long) As Long 
Private Declare Function GetWindowRect Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByRef lpRect As RECT) As Long 
Private Declare Function SHBrowseForFolder Lib "shell32" ( _
    lpbi As InfoT) As Long 
Private Declare Function CoTaskMemFree Lib "ole32" ( _
    ByVal hMem As Long) As Long 
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" ( _
    ByVal lpStr1 As String, _
    ByVal lpStr2 As String) As Long 
Private Declare Function SHGetPathFromIDList Lib "shell32" ( _
    ByVal pList As Long, _
    ByVal lpBuffer As String) As Long 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassname As String, _
    ByVal lpWindowName As String) As Long 
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal Msg As Long, _
    wParam As Any, _
    lParam As Any) As Long 
 
Private Type InfoT 
    hwnd As Long 
    Root As Long 
    DisplayName As Long 
    Title As Long 
    Flags As Long 
    FName As Long 
    lParam As Long 
    Image As Long 
End Type 
 
Private Type RECT 
    Left As Long 
    Top As Long 
    Right As Long 
    Bottom As Long 
End Type 
 
Private s_BrowseInitDir As String 
Private Function BrowseCallback( _
        ByVal hwnd As Long, _
        ByVal uMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long 
    If uMsg = &H1 Then 
        Call SendMessage(hwnd, &H466, ByVal 1&, ByVal s_BrowseInitDir) 
        Call CenterDialog(hwnd) 
    End If 
    BrowseCallback = 0 
End Function 
 
Private Function FuncCallback(ByVal nParam As Long) As Long 
    FuncCallback = nParam 
End Function 
 
Private Sub CenterDialog(ByVal hwnd As Long) 
    Dim WinRect As RECT, ScrWidth As Integer, ScrHeight As Integer 
    Dim DlgWidth As Integer, DlgHeight As Integer 
    GetWindowRect hwnd, WinRect 
    DlgWidth = WinRect.Right - WinRect.Left 
    DlgHeight = WinRect.Bottom - WinRect.Top 
    ScrWidth = GetSystemMetrics(&H10) 
    ScrHeight = GetSystemMetrics(&H11) 
    MoveWindow hwnd, (ScrWidth - DlgWidth) / 2, _
        (ScrHeight - DlgHeight) / 2, DlgWidth, DlgHeight, 1 
End Sub 
 
Public Function fncGetFolder( _
        Optional ByVal sMsg As String = "Bitte wählen Sie ein Verzeichnis", _
        Optional ByVal sPath As String = "C:\") As String 
    Dim xl As InfoT, IDList As Long, RVal As Long, FolderName As String 
     
    If sPath Like "*.?" Or sPath Like "*.?" Then 
     sPath = Left$(sPath, InStrRev(sPath, "\")) 
    End If 
    
    If Dir(sPath, vbDirectory) = "" Then 
        sPath = ThisWorkbook.Path 
    End If 
     
    s_BrowseInitDir = sPath 
    With xl 
        .hwnd = FindWindow("XLMAIN", vbNullString) 
        .Root = 0 
        .Title = lstrcat(sMsg, "") 
        .Flags = &H1 
        .FName = FuncCallback(AddressOf BrowseCallback) 
    End With 
    IDList = SHBrowseForFolder(xl) 
    If IDList <> 0 Then 
        FolderName = Space(256) 
        RVal = SHGetPathFromIDList(IDList, FolderName) 
        CoTaskMemFree (IDList) 
        FolderName = Trim$(FolderName) 
        FolderName = Left$(FolderName, Len(FolderName) - 1) 
    End If 
    fncGetFolder = FolderName 
End Function 
 
Sub ListFilesInFolder(FileArray, SourceFolderName As String, Optional DateiFormat As String = "*.*", _
                        Optional IncludeSubfolders As Boolean = False, Optional LCount As Long = 0) 
 
Dim FSO As Object, SourceFolder As Object, SubFolder As Object 
Dim FileItem 
Dim Status As Integer 
  
 Set FSO = CreateObject("Scripting.FileSystemObject") 
  
 If FSO.FolderExists(SourceFolderName) Then 
     Set SourceFolder = FSO.GetFolder(SourceFolderName) 
             
        On Error GoTo Err_Zugriff: 'sollte Ordner geschützt sein 
          
        For Each FileItem In SourceFolder.Files 
            If LCase(FileItem) Like LCase(DateiFormat) Then 
             Redim Preserve FileArray(LCount) 
             FileArray(LCount) = FileItem 
             LCount = LCount + 1 
            End If 
        Next FileItem 
     
     
        If IncludeSubfolders Then 
            For Each SubFolder In SourceFolder.SubFolders 
                ListFilesInFolder FileArray, SubFolder.Path, DateiFormat, IncludeSubfolders, LCount 
            Next SubFolder 
        End If 
 Else 
       MsgBox "Ordner nicht gefunden!", vbCritical 
 End If 
 
Err_Zugriff: 
Set FileItem = Nothing: Set SourceFolder = Nothing: Set FSO = Nothing 
End Sub 
 
Gruß Tino
Anzeige
AW: eine Variante
08.06.2010 10:31:28
Thomas
Hallo Tino,
erstmal vielen Dank für deine schnelle Hilfe!
Kannst du mir noch verraten, an welcher Stelle ich diese Schleife einbinden kann?
Gruß
Thomas
die Schleife ist doch schon da
08.06.2010 11:03:38
Tino
Hallo,
, in FileArray(LCount) steht immer die Datei inklusive Pfad.
'Schleife über alle gefundene Dateien
For LCount = Lbound(FileArray) To Ubound(FileArray)
Debug.Print FileArray(LCount)
Next LCount 
Ohne es jetzt zu testen würde ich sagen diese müsste bei Deinem Code anstelle der
Do Until strQuelle = "" Schleife stehen und anstatt
PfadQuelle & Application.PathSeparator & strQuelle müsste der Pfad FileArray(LCount) eingebaut werden.
Gruß Tino
Gruß Tino
Anzeige
AW: die Schleife ist doch schon da
08.06.2010 13:15:32
Thomas
Hallo Tino,
bin mit meinem Latein am Ende. Vom Prinzip verstehe ich schon, was du meinst, ich krieg das nur technisch nicht umgesetzt.
In welchem Modul steht mein ursprünglicher Code? So wie ich das jetzt verstanden habe, wird dieses Array mit deinen Codes ermittelt und muss dann in dem ursprünglichen Code abgefragt werden, oder?
Er bringt mir dummerweise schon beim eintippen nur Fehlermeldungen.
Gruß
Thomas
versuche es mal
09.06.2010 09:08:02
Tino
Hallo,
ich habe den Code nicht getestet.
kommt als Code in Modul1
Option Explicit 
 
Sub DatenAktualisieren() 
Dim wbQuelle As Workbook, wksQuelle As Worksheet 
Dim PfadQuelle As String, strQuelle As String 
Dim wbZiel As Workbook, arrWksZiel() As Worksheet, intI As Integer, intArr As Integer 
Dim ZeileQuelle As Long, ZeileZiel As Long, Spalte As Long 
Dim wksSt As Worksheet, SpalteDatei As Long 
Dim FileArray, iAnzahl As Integer 
 
 
On Error GoTo Fehler 
Set wbZiel = ActiveWorkbook 
Set wksSt = wbZiel.Worksheets("Steuerung") 
Application.ScreenUpdating = False 
'Nummer der Spalte in der ggf. Dateiname eingetragen wird 
SpalteDatei = wksSt.Range("A11").Value 
With wbZiel 
  'zu vergleichende Worksheet-Objekte dem Array zuweisen 
  intArr = 0 
  For intI = 1 To .Worksheets.Count 
    With .Worksheets(intI) 
      Select Case .Name 
        Case wksSt.Range("A17"), wksSt.Range("A18"), wksSt.Range("A19"), _
          wksSt.Range("A20"), wksSt.Range("A21"), wksSt.Range("A22") 
          'Name(n) der Blätter, die in Zusammenfassung nicht _
              aktualisiert werden sollen 
        Case Else 
          'Array mit den abzugleichendne Tabellenblättern redimensionieren 
          intArr = intArr + 1 
          Redim Preserve arrWksZiel(1 To intArr) 
          'Worksheet-Objekt zuweisen 
          Set arrWksZiel(intArr) = wbZiel.Worksheets(intI) 
          'vorhandene Alt-Daten in den Tabellenblättern löschen 
          .Range(.Cells(3, 1), .Cells(.Rows.Count, 33)).ClearContents 
         ' If .Cells(.Rows.Count, 2).End(xlUp).Row >= 32 Then 
            'If SpalteDatei > 0 Then 
             ' .Cells(3, SpalteDatei).Value = "Dateiname" 
            'End If 
           ' .Range(.Rows(2), .Rows(.Cells(.Rows.Count, 2).End(xlUp).Row)).ClearContents 
          'End If 
        End Select 
    End With 
  Next 
End With 
'Verzeichnis mit den Quelldaten festlegen 
If wksSt.Range("A14") <> "" Then 
  PfadQuelle = wksSt.Range("A14") 
Else 
  PfadQuelle = wbZiel.Path              'orig 
 
End If 
 
'Dateien Suchen, Filter eventuell anpassen 
Suchmaschine FileArray, "*.xl*" 
 
intArr = 0 
'wurden Dateien gefunden? 
If IsArray(FileArray) Then 
    'Schleife über alle gefundene Dateien 
    For iAnzahl = Lbound(FileArray) To Ubound(FileArray) 
          strQuelle = Right$(FileArray(iAnzahl), Len(FileArray(iAnzahl)) - InStrRev(FileArray(iAnzahl), "\")) 
          Select Case LCase(strQuelle) 
            Case LCase(wbZiel.Name), LCase(wksSt.Range("A25")), LCase(wksSt.Range("A26")), _
                LCase(wksSt.Range("A27")) 'Liste ggf. anpassen/ergänzen 
              'diese Dateien beim Auslesen überspringen 
            Case Else 
              'Quelldatei öffnen 
              Set wbQuelle = Workbooks.Open( _
                  Filename:=FileArray(iAnzahl), _
                  ReadOnly:=False, _
                  UpdateLinks:=True) 
              intArr = intArr + 1 
              Application.StatusBar = "DateiNummer " & Format(intArr, "000") _
                    & " wird bearbeitet" 
              'Tabellenblätter in Quelle abarbeiten 
              For intI = 1 To 1 'UBound(arrWksZiel) 
                Set wksQuelle = wbQuelle.Worksheets(arrWksZiel(intI).Name) 
                With wksQuelle 
                  'Prüfen, Daten ab Zeile 3 vorhanden 
                  If .Cells(.Rows.Count, 2).End(xlUp).Row >= 3 Then 
                    'Daten in Zusammenfassung einfügen 
                    For ZeileQuelle = 3 To .Cells(.Rows.Count, 2).End(xlUp).Row 
                      With arrWksZiel(intI) 
                        ZeileZiel = .Cells(.Rows.Count, 2).End(xlUp).Row + 1 
                        For Spalte = 2 To 33 
                          .Cells(ZeileZiel, Spalte).Value = _
                                wksQuelle.Cells(ZeileQuelle, Spalte).Value 
                        Next 
                        'ggf. den Dateinamen der Quelle eintragen 
                        If SpalteDatei <> 0 Then 
                          .Cells(ZeileZiel, SpalteDatei).Value = wbQuelle.Name 
                        End If 
                      End With 
                    Next 
                  End If 
                End With 
Resume_Next_Sheet: 
              Next 
              'Quelldatei wieder schliessen - inklusive speichern 
              Application.DisplayAlerts = False 
              wbQuelle.Close savechanges:=True 
              Set wbQuelle = Nothing 
              Application.DisplayAlerts = True 
          End Select 
          'Namen der nächste Quelldatei einlesen 
        Next iAnzahl 
Else 
        MsgBox "Es wurden keine Dateien gefunden!" & vbCr & "Oder Benutzer hat die Aktion abgebrochen!" 
End If 
 
Application.ScreenUpdating = True 
'Aktualisierungsdatum im Blatt Steuerung eintragen 
wksSt.Range("C8").Value = Now 
MsgBox "Fertig" & vbLf & vbLf & intArr & "  Dateien eingelesen" 
Fehler: 
With Err 
  Select Case .Number 
    Case 0 'kein Fehler 
    Case 9 'Tabellenblatt in Quelle nicht gefunden 
      Resume Resume_Next_Sheet 
    Case Else 
      MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description 
  End Select 
End With 
With Application 
  .ScreenUpdating = True 
  .StatusBar = False 
End With 
 
If Not wbQuelle Is Nothing Then 
  Application.DisplayAlerts = False 
  wbQuelle.Close savechanges:=True 
  Set wbQuelle = Nothing 
  Application.DisplayAlerts = True 
End If 
Set wbZiel = Nothing: Set wksSt = Nothing: Set wksQuelle = Nothing 
Redim arrWksZiel(1 To 1) 
End Sub 
 
kommt als Code in Modul2
Option Explicit 
  
Private Declare Function MoveWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal bRepaint As Long) As Long 
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
    ByVal nIndex As Long) As Long 
Private Declare Function GetWindowRect Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByRef lpRect As RECT) As Long 
Private Declare Function SHBrowseForFolder Lib "shell32" ( _
    lpbi As InfoT) As Long 
Private Declare Function CoTaskMemFree Lib "ole32" ( _
    ByVal hMem As Long) As Long 
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" ( _
    ByVal lpStr1 As String, _
    ByVal lpStr2 As String) As Long 
Private Declare Function SHGetPathFromIDList Lib "shell32" ( _
    ByVal pList As Long, _
    ByVal lpBuffer As String) As Long 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassname As String, _
    ByVal lpWindowName As String) As Long 
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal Msg As Long, _
    wParam As Any, _
    lParam As Any) As Long 
  
Private Type InfoT 
    hwnd As Long 
    Root As Long 
    DisplayName As Long 
    Title As Long 
    Flags As Long 
    FName As Long 
    lParam As Long 
    Image As Long 
End Type 
  
Private Type RECT 
    Left As Long 
    Top As Long 
    Right As Long 
    Bottom As Long 
End Type 
  
Private s_BrowseInitDir As String 
Private Function BrowseCallback( _
        ByVal hwnd As Long, _
        ByVal uMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long 
    If uMsg = &H1 Then 
        Call SendMessage(hwnd, &H466, ByVal 1&, ByVal s_BrowseInitDir) 
        Call CenterDialog(hwnd) 
    End If 
    BrowseCallback = 0 
End Function 
  
Private Function FuncCallback(ByVal nParam As Long) As Long 
    FuncCallback = nParam 
End Function 
  
Private Sub CenterDialog(ByVal hwnd As Long) 
    Dim WinRect As RECT, ScrWidth As Integer, ScrHeight As Integer 
    Dim DlgWidth As Integer, DlgHeight As Integer 
    GetWindowRect hwnd, WinRect 
    DlgWidth = WinRect.Right - WinRect.Left 
    DlgHeight = WinRect.Bottom - WinRect.Top 
    ScrWidth = GetSystemMetrics(&H10) 
    ScrHeight = GetSystemMetrics(&H11) 
    MoveWindow hwnd, (ScrWidth - DlgWidth) / 2, _
        (ScrHeight - DlgHeight) / 2, DlgWidth, DlgHeight, 1 
End Sub 
  
Public Function fncGetFolder( _
        Optional ByVal sMsg As String = "Bitte wählen Sie ein Verzeichnis", _
        Optional ByVal sPath As String = "C:\") As String 
    Dim xl As InfoT, IDList As Long, RVal As Long, FolderName As String 
      
    If sPath Like "*.?" Or sPath Like "*.?" Then 
     sPath = Left$(sPath, InStrRev(sPath, "\")) 
    End If 
     
    If Dir(sPath, vbDirectory) = "" Then 
        sPath = ThisWorkbook.Path 
    End If 
      
    s_BrowseInitDir = sPath 
    With xl 
        .hwnd = FindWindow("XLMAIN", vbNullString) 
        .Root = 0 
        .Title = lstrcat(sMsg, "") 
        .Flags = &H1 
        .FName = FuncCallback(AddressOf BrowseCallback) 
    End With 
    IDList = SHBrowseForFolder(xl) 
    If IDList <> 0 Then 
        FolderName = Space(256) 
        RVal = SHGetPathFromIDList(IDList, FolderName) 
        CoTaskMemFree (IDList) 
        FolderName = Trim$(FolderName) 
        FolderName = Left$(FolderName, Len(FolderName) - 1) 
    End If 
    fncGetFolder = FolderName 
End Function 
  
Sub ListFilesInFolder(FileArray, SourceFolderName As String, Optional DateiFormat As String = "*.*", _
                        Optional IncludeSubfolders As Boolean = False, Optional LCount As Long = 0) 
  
Dim FSO As Object, SourceFolder As Object, SubFolder As Object 
Dim FileItem 
Dim Status As Integer 
   
 Set FSO = CreateObject("Scripting.FileSystemObject") 
   
 If FSO.FolderExists(SourceFolderName) Then 
     Set SourceFolder = FSO.GetFolder(SourceFolderName) 
              
        On Error GoTo Err_Zugriff: 'sollte Ordner geschützt sein 
           
        For Each FileItem In SourceFolder.Files 
            If LCase(FileItem) Like LCase(DateiFormat) Then 
             Redim Preserve FileArray(LCount) 
             FileArray(LCount) = FileItem 
             LCount = LCount + 1 
            End If 
        Next FileItem 
      
      
        If IncludeSubfolders Then 
            For Each SubFolder In SourceFolder.SubFolders 
                ListFilesInFolder FileArray, SubFolder.Path, DateiFormat, IncludeSubfolders, LCount 
            Next SubFolder 
        End If 
 Else 
       MsgBox "Ordner nicht gefunden!", vbCritical 
 End If 
  
Err_Zugriff: 
Set FileItem = Nothing: Set SourceFolder = Nothing: Set FSO = Nothing 
End Sub 
 
Sub Suchmaschine(ByRef FileArray, ByVal strFilter As String) 
Dim strPath As String 
Dim LCount As Long 
Dim tmpAr() As String 
 
strPath = fncGetFolder 'Ordnerauswahl 
  
'1.Parameter Area 
'2.Parameter Ordner, wo soll gesucht werden? 
'3.Parameter Datei,* als Platzhalter verwenden,Optional leer ist alle 
'4.Parameter mit Unterordner = True, Optional False ist ohne 
'5.Parameter Zähler 
ListFilesInFolder tmpAr, strPath, strFilter, True, LCount 
  
  
If LCount > 0 Then 
    FileArray = tmpAr 
    Erase tmpAr 
End If 
End Sub 
 
Gruß Tino
Anzeige
AW: Tabellen aus Unterordnern zusammenfassen
08.06.2010 10:34:13
Thomas
Hallo Tino,
erstmal vielen Dank für deine schnelle Hilfe!
Kannst du mir noch verraten, an welcher Stelle ich diese Schleife einbinden kann?
Gruß
Thomas

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige