Anzeige
Archiv - Navigation
1032to1036
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
Auslesen Ordnerinhalte
19.12.2008 22:25:05
Thomas
Hallo zusammen,
ich habe folgendes Problem und bitte um Hilfe.
Ich will eine Datei erstellen die Ordnerinhalte wiedergeben soll.
Beispiel:
Es gibt einen Datei-Ordner "Kunden", der beinhaltet weitere Ordner die nach Städten sortiert sind. In den Städteordnern befinden sich Exceldateien der Kunden.
Es gilt nun eine Datei zu erstellen namens: Übersicht, wo die Register nach Orten (wie die Städteordner) gegliedert werden.
In der jeweiligen Arbeitsmappe soll nun aus jeder Datei eines Städteordners die Zell B3, Zelle B4 und Zelle B5 ausgelesen werden und in der Mappe z.B. in A1,A2,A3...(für Zellen B3), B1,B2,B3...(für Zellen B4) und C1,C2,C3...(für Zelle B5) untereinander weg gelistet werden.
Es werden künftig Listen in den Städteordnern zugefügt. Nach Möglichleit sollte die Datei "Übersicht" die neu eingefügten Dateien automatisch einlesen. Ziel ist es also, alle Ordnerveränderungen in der Datei "Übersicht" kontrollieren zu können.
Wenn mir jemand weiterhelfen könnte mit einer kleinen Erläuterung das ich es nachvollziehen kann, das wäre klasse.
Vorab vielen Dank.

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Teillösung
20.12.2008 12:18:00
Tino
Hallo,
keine komplette Lösung, aber einen Anfang.
Funktioniert auch unter xl2007, sollte es mal erforderlich sein.
Mit diesem Code, werden alle Unterordner als Register angelegt und die Dateien in Spalte A aufgelistet.
Tabellen anlegen und Dateien auflisten ist mit einer Prüfung verbunden, somit dürfte es keinen doppelten Einträgen geben.
Die Tabellen werden im der aktuellen Datei angelegt.
Im Code stehen auch einige Kommentare, die sollten Dir helfen den Code zu verstehen.
Viel Spaß damit und noch Frohe Weihnachten.
Modul Modul1
Option Explicit 
 
Dim Liste As String 
Dim FS As Object 
Dim varFolder 
Sub ListOrdner(myFolder, Optional sFilter As String = "*.*") 
Dim myFile As Object, mySubfolders As Object 
 
Set myFolder = FS.getfolder(myFolder) 
 On Error GoTo FehlerZugriff 
     
    For Each myFile In myFolder.Files 
      If myFolder = varFolder Then Exit For 
        If myFile.Path Like sFilter Then 
         
            Liste = Liste & myFile.Path & ">" 
        End If 
    Next 
 
    For Each mySubfolders In myFolder.subfolders 
        Liste = Liste & "<" & mySubfolders.Path & ">" 
        ListOrdner mySubfolders, sFilter 
    Next 
FehlerZugriff: 
    Err.Clear 
Set myFile = Nothing: Set mySubfolders = Nothing: Set myFolder = Nothing 
End Sub 
 
Sub Start() 
Dim sArea() As String, sArea2() As String 
Dim sFileFilter As String, sTabellen As String, OName As String, sDateiName As String 
Dim A As Long, B As Long, LCol As Long 
Dim InList 
Dim oTab As Worksheet 
Const InfoText As String = "Bitte warten!" 
Set FS = CreateObject("Scripting.FileSystemObject") 
 
 
sFileFilter = "*.xls" 'Filtefilter 
 
'es werden nur die Unterordner durchsucht und gelistet 
varFolder = "F:\" 'welcher Ordner? 
 
 
 
'Tabellennamen für Prüfung in einen String 
For A = 1 To ThisWorkbook.Sheets.Count 
 sTabellen = sTabellen & Sheets(A).Name & "<>" 
Next A 
 
With Application 
 .StatusBar = InfoText 
 .ScreenUpdating = False 
 
        ListOrdner varFolder, sFileFilter 
        sArea = Split(Liste, "<") 
        
        For A = Lbound(sArea) To Ubound(sArea) 
         sArea2 = Split(sArea(A), ">") 
          If Ubound(sArea2) > 1 Then 
                    LCol = LCol + 1 
            For B = Lbound(sArea2) To Ubound(sArea2) 
                 
             If B = 0 Then 
                    'Tabellenname, max 31 Zeichen 
                    OName = Left$(Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\")), 31) 
                             'Sonderzeichen entfernen 
                                OName = Replace(OName, "\", "") 
                                OName = Replace(OName, "?", "") 
                                OName = Replace(OName, "!", "") 
                                OName = Replace(OName, "/", "") 
                                OName = Replace(OName, "[", "") 
                                OName = Replace(OName, "]", "") 
                                OName = Replace(OName, "*", "") 
                     'Ist Tabelle in Liste? 
                    If sTabellen Like "*" & OName & "<>*" Then 
                        Set oTab = Sheets(OName) 
                    Else 
                     'Tabelle nicht in Liste, anlegen 
                        Sheets.Add , ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) 
                        Set oTab = ActiveSheet 
                        oTab.Name = OName 
                        oTab.Cells(1, 1) = "Dateiname": oTab.Cells(1, 1).Font.Bold = True 
                    End If 
              
             Else 
                    'Datei in Liste 
                     With oTab 
                      sDateiName = Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\")) 
                             InList = Application.Match(sDateiName, .Columns(1), 0) 
                               If Not IsNumeric(InList) Then 
                                'Datei nicht in Liste, schreiben 
                                 .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0) = sDateiName 
                               End If 
                     End With 
             End If 
             
             
            Next B 
          End If 
        Next A 
  
 .ScreenUpdating = True 
 .StatusBar = False 
End With 'Application 
 
Erase sArea: Erase sArea2 
Set FS = Nothing: Set varFolder = Nothing 
End Sub 
 
 


Gruß Tino

www.VBA-Excel.de


Anzeige
AW: Teillösung
20.12.2008 13:13:48
Thomas
Hallo und vielen Dank, die Lösungen waren schon sehr gut. Leider muss ich aber die Exceldateien in den Ordnern auslesen, d.h. einzelne Zellen.
Mir würde ein Makro reichen, wo ein Ordner angegeben ist und er mir dann aus jeder darin enthaltenen Exceldatei die Zelle B1 ausliest. Die Werte sollten dann in der Übersichtsdatei untereinander weg gelistet werden.
Wenn also in den Exceldateien in der Zelle B1 der Kundenname steht, dann müsste es bei drei Dateien so aussehen.
Übersichtsdatei:...............................................zu lesender Ordner:
Kundenname1...................................................Exceldatei1
Kundenname2...................................................Exceldatei2
Kundenname3...................................................Exceldatei3
Viele Grüße
Thomas
Anzeige
Ärgerlich
20.12.2008 16:37:08
Tino
Hallo,
wie jetzt doch keine Register für die Ordner, war doch so in der Fragestellung beschrieben?
Ärgerlich habe mir so viel Mühe gegeben.
Überlege Dir erst mal was Du möchtest, dann versuche ich es nochmal.
Du möchtest jetzt eine Tabelle
Spalte A den Ordnername?
Spalte B Dateiname?
Spalte C Wert aus Datei Zelle B1?
Haben die Dateien immer denselben Tabellennamen wo die Zelle B1 sich befindet?
Gruß Tino
AW: Ärgerlich
20.12.2008 19:19:12
Thomas
Hi Tino,
das tut mir leid. Habe doch geschrieben, dass die Werte (Zellen) der Dateien ausgelesen werden müssen.

In der jeweiligen Arbeitsmappe soll nun aus jeder Datei eines Städteordners die Zell B3, Zelle B4 und Zelle B5 ausgelesen werden und in der Mappe z.B. in A1,A2,A3...(für Zellen B3), B1,B2,B3...(für Zellen B4) und C1,C2,C3...(für Zelle B5) untereinander weg gelistet werden.


Zu deinen Fragen:


Du möchtest jetzt eine Tabelle
Spalte A den Ordnername?
Spalte B Dateiname?
Spalte C Wert aus Datei Zelle B1?


Es brauchen keine Ordnernamen aufgelistet werden sondern nur die Zellenwerte.
Vielleicht hilft dir ein Beispiel es zu verstehen.
In jedem Ordner befinden sich Kundendateien, in den Kundendateien (.xls) sind Kundendaten angelegt die in die Übersicht übernommen werden müssen.
Sagen wir mal ein Ordner heißt München, darin sind (bis jetzt) 3 Dateien. In jeder Der Dateien steht in B1 der Kundenname, in B2 die Straße und in B3 der Ort. Nun sollen die Kundendaten in eine Übersicht übernommen werden.
Die Übersicht soll dann so aussehen:
Register: München
In der Mappe soll nun in der Spalte A der Kundenname, in B die Straße und in C der Ort aller Exceldateien des Dateiordners München übernommen werden.
Da immer Kunden dazu kommen und die Dateien eine andere Bezeichnung haben, kann man leider keinen Verweis auf feste Dateinamen geben.
Hoffe, das macht die Angelegenheit etwas verständlicher.
Kannst Du mir sagen ob es im Netz eine Möglichkeit gibt mehr über VBA zu lernen? Ich habe nichts gefunden! Ich nutze nur den Recorder und würde gerne mehr davon verstehen.
Gruß
Thomas

Anzeige
AW: Ärgerlich
20.12.2008 19:42:00
Tino
Hallo,
Du hast geschrieben
"Es gilt nun eine Datei zu erstellen namens: Übersicht, wo die Register nach Orten gegliedert werden..."
Werde mal schauen ob ich ein Beispiel aufbauen kann.
Gruß Tino
zweiter Versuch
20.12.2008 20:40:04
Tino
Hallo,
ok. teste mal diesen Code.
Im Code musst Du den Pfad und die Tabellennamen
wo die Daten in Deiner Datei hinsollen eventuell noch anpassen.
Option Explicit

Dim Liste As String
Dim FS As Object
Dim varFolder
Sub ListOrdner(myFolder, Optional sFilter As String = "*.*")
Dim myFile As Object, mySubfolders As Object
 
Set myFolder = FS.getfolder(myFolder)
 On Error GoTo FehlerZugriff
     
    For Each myFile In myFolder.Files
      If myFolder = varFolder Then Exit For
        If myFile.Path Like sFilter Then
         
            Liste = Liste & myFile.Path & ">"
        End If
    Next
 
    For Each mySubfolders In myFolder.subfolders
        Liste = Liste & "<" & mySubfolders.Path & ">"
        ListOrdner mySubfolders, sFilter
    Next
FehlerZugriff:
    Err.Clear
Set myFile = Nothing: Set mySubfolders = Nothing: Set myFolder = Nothing
End Sub
 
Sub Start()
Dim sArea() As String, sArea2() As String
Dim sFileFilter As String, OName As String, sDateiName As String
Dim A As Long, B As Long, LCol As Long
Dim tempDatei As Workbook
Dim iCalc As Integer
Const InfoText As String = "Bitte warten!"
Set FS = CreateObject("Scripting.FileSystemObject")
 

LCol = 2 'erste Einfügezeile 
sFileFilter = "*.xls" 'Filtefilter 
 
'es werden nur die Unterordner durchsucht und gelistet 
varFolder = "J:\" 'welcher Ordner? 
 
 
With Application
 iCalc = .Calculation
 .StatusBar = InfoText
 .ScreenUpdating = False
 .EnableEvents = False
 .Calculation = xlCalculationManual
 
'hier Tabellennamen eventuell anpassen!********************** 
 With Sheets("Tabelle1")
  .Range("A1") = "Name": .Range("B1") = "Kundenname": .Range("C1") = "Straße": .Range("D1") = "Ort"
  .Range("A1:D1").Font.Bold = True
 End With
 
        ListOrdner varFolder, sFileFilter
        sArea = Split(Liste, "<")
        
        For A = Lbound(sArea) To Ubound(sArea)
         sArea2 = Split(sArea(A), ">")
          If Ubound(sArea2) > 1 Then
            For B = Lbound(sArea2) To Ubound(sArea2)
             If B = 0 Then
              'Ordnername 
              OName = Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\"))
             Else ' B = 0 
                If sArea2(B) <> "" Then
                  Cells(LCol, 1) = OName 'schreibe Ordnername 

                  Set tempDatei = Workbooks.Open(sArea2(B), False, True) 'Datei öffnen 
                  
                  With tempDatei.Worksheets(1) 'Zellen lesen und schreiben 
                   'hier Tabellennamen eventuell anpassen!********************** 
                   ThisWorkbook.Sheets("Tabelle1").Cells(LCol, 2) = .Range("B1")
                   ThisWorkbook.Sheets("Tabelle1").Cells(LCol, 3) = .Range("B2")
                   ThisWorkbook.Sheets("Tabelle1").Cells(LCol, 4) = .Range("B3")
                   tempDatei.Close False
                  End With
                  
                  LCol = LCol + 1
                End If ' sArea2(B) <> "" 
             End If ' B = 0 
            Next B
          End If 'UBound(sArea2) > 1 
        Next A
 
 .Calculation = iCalc
 .EnableEvents = True
 .ScreenUpdating = True
 .StatusBar = False
End With 'Application 
 
Erase sArea: Erase sArea2
Set FS = Nothing: Set varFolder = Nothing
End Sub


Gruß Tino

Anzeige
AW: zweiter Versuch
20.12.2008 22:25:27
Thomas
Hallo Tino,
meinst Du mit OName den Ordnernamen "München" (wo sich die Dateien drin befinden)?
Damit klappt es leider nicht "keine Variable".

For A = Lbound(sArea) To Ubound(sArea)
sArea2 = Split(sArea(A), ">")
If Ubound(sArea2) > 1 Then
For B = Lbound(sArea2) To Ubound(sArea2)
If B = 0 Then
'Ordnername
OName = Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\"))
Else ' B = 0
If sArea2(B)  "" Then
Cells(LCol, 1) = OName 'schreibe Ordnername


Gruß
Thomas

AW: zweiter Versuch
20.12.2008 22:54:46
Tino
Hallo,
bei mir funktioniert es, hast Du auch den zu durchsuchenden Ordner richtig angegeben?
Liegen Dein Dateien z. Bsp in
C:\Test\Münschen
C:\Test\Berlin

Musst Du
C:\Test
angeben
Gruß Tino
Anzeige
AW: zweiter Versuch
21.12.2008 00:23:22
Thomas
Hallo,
ich habe den Pfad wie folgt angegeben.

Option Explicit
Dim Liste As String
Dim FS As Object
Dim varFolder
Sub ListOrdner(myFolder, Optional sFilter As String = "*.*")
Dim myFile As Object, mySubfolders As Object
Set myFolder = FS.getfolder(myFolder)
On Error GoTo FehlerZugriff
For Each myFile In myFolder.Files
If myFolder = varFolder Then Exit For
If myFile.Path Like sFilter Then
Liste = Liste & myFile.Path & ">"
End If
Next
For Each mySubfolders In myFolder.subfolders
Liste = Liste & ""
ListOrdner mySubfolders, sFilter
Next
FehlerZugriff:
Err.Clear
Set myFile = Nothing: Set mySubfolders = Nothing: Set myFolder = Nothing
End Sub
Sub Start()
Dim sArea() As String, sArea2() As String
Dim sFileFilter As String, OName As String, sDateiName As String
Dim A As Long, B As Long, LCol As Long
Dim tempDatei As Workbook
Dim iCalc As Integer
Const InfoText As String = "Bitte warten!"
Set FS = CreateObject("Scripting.FileSystemObject")
LCol = 2 'erste Einfügezeile
sFileFilter = "*.xls" 'Filtefilter
'es werden nur die Unterordner durchsucht und gelistet
varFolder = "C:\Dokumente und Einstellungen\Tom.TOM-NBQFB4PGLP2\Eigene Dateien\Arbeit\ _
Abrechnung\Kunden\München" 'welcher Ordner?
With Application
iCalc = .Calculation
.StatusBar = InfoText
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
'hier Tabellennamen eventuell anpassen!**********************
With Sheets("München")
.Range("A1") = "Name": .Range("B1") = "Kundenname": .Range("C1") = "Straße": .Range("D1") = " _
Ort"
.Range("A1:D1").Font.Bold = True
End With
ListOrdner varFolder, sFileFilter
sArea = Split(Liste, "")
If UBound(sArea2) > 1 Then
For B = LBound(sArea2) To UBound(sArea2)
If B = 0 Then
'Ordnername
München = Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\"))
Else ' B = 0
If sArea2(B)  "" Then
Cells(LCol, 1) = München 'schreibe Ordnername
Set tempDatei = Workbooks.Open(sArea2(B), False, True) 'Datei öffnen
With tempDatei.Worksheets(1) 'Zellen lesen und schreiben
'hier Tabellennamen eventuell anpassen!**********************
ThisWorkbook.Sheets("Tabelle1").Cells(LCol, 2) = .Range("B1")
ThisWorkbook.Sheets("Tabelle1").Cells(LCol, 3) = .Range("B2")
ThisWorkbook.Sheets("Tabelle1").Cells(LCol, 4) = .Range("B3")
tempDatei.Close False
End With
LCol = LCol + 1
End If ' sArea2(B)  ""
End If ' B = 0
Next B
End If 'UBound(sArea2) > 1
Next A
.Calculation = iCalc
.EnableEvents = True
.ScreenUpdating = True
.StatusBar = False
End With 'Application
Erase sArea: Erase sArea2
Set FS = Nothing: Set varFolder = Nothing
End Sub


Wenn ich bei München (habe ich mal fett dargestellt) noch den Pfad C:... angebe, dann bekomme ich einen Fehler.
Habe jetzt mal den ganzen Code kopiert, vielleicht erkennst Du den Fehler ja.
Danke für deine Geduld.
Gruß
Thomas

Anzeige
AW: zweiter Versuch
21.12.2008 00:54:00
Tino
Hallo,
ist
...Tom.TOM-NBQFB4PGLP2\Eigene Dateien\Arbeit\Abrechnung\Kunden\München"
jetzt ein Ordner wo Deine Dateien drin sind oder wo Deine Unterordner sich befinden?
aus dem Bauch raus würde ich sagen es müsste
...Tom.TOM-NBQFB4PGLP2\Eigene Dateien\Arbeit\Abrechnung\Kunden
dieser Pfad sein, wo sich Deine Unterordner der Kunden befinden.
Also so wie ich Deine Anpassung verstehe, müsste der Code so aussehen.
Option Explicit
Dim Liste As String
Dim FS As Object
Dim varFolder
Sub ListOrdner(myFolder, Optional sFilter As String = "*.*")
Dim myFile As Object, mySubfolders As Object
 
Set myFolder = FS.getfolder(myFolder)
 On Error GoTo FehlerZugriff
     
    For Each myFile In myFolder.Files
      If myFolder = varFolder Then Exit For
        If myFile.Path Like sFilter Then
         
            Liste = Liste & myFile.Path & ">"
        End If
    Next
 
    For Each mySubfolders In myFolder.subfolders
        Liste = Liste & "<" & mySubfolders.Path & ">"
        ListOrdner mySubfolders, sFilter
    Next
FehlerZugriff:
    Err.Clear
Set myFile = Nothing: Set mySubfolders = Nothing: Set myFolder = Nothing
End Sub
 
Sub Start()
Dim sArea() As String, sArea2() As String
Dim sFileFilter As String, OName As String, sDateiName As String
Dim A As Long, B As Long, LCol As Long
Dim tempDatei As Workbook
Dim iCalc As Integer
Const InfoText As String = "Bitte warten!"
Set FS = CreateObject("Scripting.FileSystemObject")
 

LCol = 2 'erste Einfügezeile 
sFileFilter = "*.xls" 'Filtefilter 
 
'es werden nur die Unterordner durchsucht und gelistet 
varFolder = "C:\Dokumente und Einstellungen\Tom.TOM-NBQFB4PGLP2\Eigene Dateien\Arbeit\" & _
            "Abrechnung\Kunden\München" 'welcher Ordner? 
 
 
With Application
 iCalc = .Calculation
 .StatusBar = InfoText
 .ScreenUpdating = False
 .EnableEvents = False
 .Calculation = xlCalculationManual
 
'hier Tabellennamen eventuell anpassen!********************** 
 With Sheets("Münschen") '? 
  .Range("A1") = "Name": .Range("B1") = "Kundenname": .Range("C1") = "Straße": .Range("D1") = "Ort"
  .Range("A1:D1").Font.Bold = True
 End With
 
        ListOrdner varFolder, sFileFilter
        sArea = Split(Liste, "<")
        
        For A = Lbound(sArea) To Ubound(sArea)
         sArea2 = Split(sArea(A), ">")
          If Ubound(sArea2) > 1 Then
            For B = Lbound(sArea2) To Ubound(sArea2)
             If B = 0 Then
              'Ordnername 
              OName = Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\"))
             Else ' B = 0 
                If sArea2(B) <> "" Then
                  Sheets("Münschen").Cells(LCol, 1) = OName 'schreibe Ordnername 

                  Set tempDatei = Workbooks.Open(sArea2(B), False, True) 'Datei öffnen 
                  
                  With tempDatei.Worksheets(1) 'Zellen lesen und schreiben 
                   'hier Tabellennamen eventuell anpassen!********************** 
                   ThisWorkbook.Sheets("Münschen").Cells(LCol, 2) = .Range("B1")
                   ThisWorkbook.Sheets("Münschen").Cells(LCol, 3) = .Range("B2")
                   ThisWorkbook.Sheets("Münschen").Cells(LCol, 4) = .Range("B3")
                   tempDatei.Close False
                  End With
                  
                  LCol = LCol + 1
                End If ' sArea2(B) <> "" 
             End If ' B = 0 
            Next B
          End If 'UBound(sArea2) > 1 
        Next A
 
 .Calculation = iCalc
 .EnableEvents = True
 .ScreenUpdating = True
 .StatusBar = False
End With 'Application 
 
Erase sArea: Erase sArea2
Set FS = Nothing: Set varFolder = Nothing
End Sub


Ich mache für heute Feierabend
Gruß Tino

Anzeige
AW: zweiter Versuch
21.12.2008 11:44:00
Thomas
Guten Morgen Tino,
hat leider nicht geklappt.
Da ich die Befehle nicht kenne fällt es mir schwer zu beurteilen, ob die Tabellennamen der zu lesenden Dateien erforderlich sind oder die der Übersichtdatei.
Ich erkläre Dir mal eben wie es bei mir aufgebaut ist.
C:\Dokumente und Einstellungen\Tom.TOM-NBQFB4PGLP2\Eigene Dateien\Arbeit\Abrechnung\Kunden\München
heißt der Pfad zu den Kunden-Exceldateien aus dem Unterordner München.
Alle Arbeitsblätter der Kundendateien heißen "Tabelle1".
In folgendem Pfad liegen die Unterordner "München", "Berlin" und "Stuttgart".
C:\Dokumente und Einstellungen\Tom.TOM-NBQFB4PGLP2\Eigene Dateien\Arbeit\Abrechnung\Kunden
Ich habe für diese drei Städte in der Übersichtsdatei (wo die ausgelesenen Daten rein geschrieben werden sollen) Arbeitsblätter (Register) mit der Bezeichnung "München", "Berlin" und "Stuttgart" angelegt.
Kannst Du mir im Code einen Bemerkung drüber schreiben, für welche Datei der folgende Abschnitt zuständig ist. z.B. 'folgender Abschnitt für Kundendateien oder 'folgender Abschnitt für Übersichtsdatei
Das würde mir sehr helfen den Code etwas besser zu verstehen.
Kannst Du mir ein gutes Buch empfehlen, womit ich VBA für Excel lernen kann?
Mit dem Recorder ist alles immer sehr einfach, da man alle aufbauenenden Befehle mit Call ... ausführen kann. Ich will einfach mehr davon verstehen.
Gruß
Thomas
Anzeige
nochmal
21.12.2008 13:35:43
Tino
Hallo,
nach Deinen Informationen, muss es so funktionieren.
Gibt es die Tabelle mit dem Ordnername (Münschen usw.) nicht kommt es zum Fehler.
Auch wenn die Tabelle ("Tablle1") in der Kundendatei nicht vorhanden ist, kommt es zum Fehler.
Dafür muss die Datei nicht geöffnet werden.
Weis nicht wie ich Dir noch aus der Ferne helfen kann, vorbeikommen ist nicht. ;-)
Option Explicit
Dim Liste As String
Dim FS As Object
Dim varFolder
Sub ListOrdner(myFolder, Optional sFilter As String = "*.*")
Dim myFile As Object, mySubfolders As Object
 
Set myFolder = FS.getfolder(myFolder)
 On Error GoTo FehlerZugriff
     
    For Each myFile In myFolder.Files
      If myFolder = varFolder Then Exit For
        If myFile.Path Like sFilter Then
         
            Liste = Liste & myFile.Path & ">"
        End If
    Next
 
    For Each mySubfolders In myFolder.subfolders
        Liste = Liste & "<" & mySubfolders.Path & ">"
        ListOrdner mySubfolders, sFilter
    Next
FehlerZugriff:
    Err.Clear
Set myFile = Nothing: Set mySubfolders = Nothing: Set myFolder = Nothing
End Sub
 
Sub Start()
Dim sArea() As String, sArea2() As String
Dim sFileFilter As String, OName As String, sDateiName As String
Dim sFormel As String
Dim A As Long, B As Long, LCol As Long
Dim iCalc As Integer
Const InfoText As String = "Bitte warten!"
Set FS = CreateObject("Scripting.FileSystemObject")
 

LCol = 2 'erste Einfügezeile 
sFileFilter = "*.xls" 'Filtefilter 
 
'es werden nur die Unterordner durchsucht und gelistet 
varFolder = "C:\Dokumente und Einstellungen\Tom.TOM-NBQFB4PGLP2\Eigene Dateien\Arbeit\" & _
            "Abrechnung\Kunden" 'welcher Ordner? 
 
 
With Application
 iCalc = .Calculation
 .StatusBar = InfoText
 .ScreenUpdating = False
 .EnableEvents = False
 .Calculation = xlCalculationManual
 
 
        ListOrdner varFolder, sFileFilter
        sArea = Split(Liste, "<")
        
        For A = Lbound(sArea) To Ubound(sArea)
         sArea2 = Split(sArea(A), ">")
          If Ubound(sArea2) > 1 Then
            For B = Lbound(sArea2) To Ubound(sArea2)
             If B = 0 Then
              'Ordnername 
              OName = Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\"))
             Else ' B = 0 
                If sArea2(B) <> "" Then
                  ThisWorkbook.Sheets(OName).Cells(LCol, 1) = OName 'schreibe Ordnername 
                  
                  'hier Tabellennamen eventuell anpassen!********************** 
                    With ThisWorkbook.Sheets(OName) '? 
                     .Range("A1") = "Name": .Range("B1") = "Kundenname": .Range("C1") = "Straße": .Range("D1") = "Ort"
                     .Range("A1:D1").Font.Bold = True
                    End With
                  
                  
                  sFormel = Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\"))
                  sFormel = "'" & Replace(sArea2(B), sFormel, "[" & sFormel & "]Tabelle1'!") & Range("B1").Address(, , xlR1C1)

                   ThisWorkbook.Sheets(OName).Cells(LCol, 2) = ExecuteExcel4Macro(sFormel)
                    sFormel = Replace(sFormel, Range("B1").Address(, , xlR1C1), Range("B2").Address(, , xlR1C1))
                   ThisWorkbook.Sheets(OName).Cells(LCol, 3) = ExecuteExcel4Macro(sFormel)
                    sFormel = Replace(sFormel, Range("B2").Address(, , xlR1C1), Range("B3").Address(, , xlR1C1))
                   ThisWorkbook.Sheets(OName).Cells(LCol, 4) = .Range("B3")


                  
                    LCol = LCol + 1
                End If ' sArea2(B) <> "" 
             End If ' B = 0 
              LCol = 2
            Next B
          End If 'UBound(sArea2) > 1 
        Next A
 
 .Calculation = iCalc
 .EnableEvents = True
 .ScreenUpdating = True
 .StatusBar = False
End With 'Application 
 
Erase sArea: Erase sArea2
Set FS = Nothing: Set varFolder = Nothing
End Sub


Gruß Tino

Anzeige
AW: nochmal
21.12.2008 13:49:00
Thomas
PERFECT..... Tino, Du hast es geschafft!!!!!
Vielen Dank!
Hab ein schönes Weihnachtsfest und noch einen schönen 4. Advent.
LG
Thomas
Ob wohl....
21.12.2008 13:59:16
Thomas
aaaahhhh....
Er gibt mir nur die Inhalte der letzten Datei wieder.
Leider werden Sie nicht gelistet, sondern nur die Daten aus der letzten Datei im Ordner wird wieder gegeben.
Wenn also München zwei Exceldateien hat, dann wird nur die zweite dargestellt, die erste erscheint nicht.
Hast Du dafür noch eine Lösung?
LG
Mist...
21.12.2008 14:25:36
Tino
Hallo,
...da war noch ein Fehler drin, habe diesen beseitigt und noch etwas umgestellt.
Option Explicit
Dim Liste As String
Dim FS As Object
Dim varFolder
Sub ListOrdner(myFolder, Optional sFilter As String = "*.*")
Dim myFile As Object, mySubfolders As Object
 
Set myFolder = FS.getfolder(myFolder)
 On Error GoTo FehlerZugriff
     
    For Each myFile In myFolder.Files
      If myFolder = varFolder Then Exit For
        If myFile.Path Like sFilter Then
         
            Liste = Liste & myFile.Path & ">"
        End If
    Next
 
    For Each mySubfolders In myFolder.subfolders
        Liste = Liste & "<" & mySubfolders.Path & ">"
        ListOrdner mySubfolders, sFilter
    Next
FehlerZugriff:
    Err.Clear
Set myFile = Nothing: Set mySubfolders = Nothing: Set myFolder = Nothing
End Sub
 
Sub Start()
Dim sArea() As String, sArea2() As String
Dim sFileFilter As String, OName As String, sDateiName As String
Dim sFormel As String
Dim A As Long, B As Long, LCol As Long
Dim iCalc As Integer
Const InfoText As String = "Bitte warten!"
Set FS = CreateObject("Scripting.FileSystemObject")
 

LCol = 2 'erste Einfügezeile 
sFileFilter = "*.xls" 'Filtefilter 
 
'es werden nur die Unterordner durchsucht und gelistet 
varFolder = "C:\Dokumente und Einstellungen\Tom.TOM-NBQFB4PGLP2\Eigene Dateien\Arbeit\" & _
            "Abrechnung\Kunden" 'welcher Ordner? 
 
 
With Application
 iCalc = .Calculation
 .StatusBar = InfoText
 .ScreenUpdating = False
 .EnableEvents = False
 .Calculation = xlCalculationManual
 
 
        ListOrdner varFolder, sFileFilter
        sArea = Split(Liste, "<")
        
        For A = Lbound(sArea) To Ubound(sArea)
         sArea2 = Split(sArea(A), ">")
          If Ubound(sArea2) > 1 Then
            For B = Lbound(sArea2) To Ubound(sArea2)
             If B = 0 Then
              'Ordnername 
              OName = Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\"))
               'hier Tabellennamen eventuell anpassen!********************** 
                With ThisWorkbook.Sheets(OName) '? 
                 .Range("A1") = "Name": .Range("B1") = "Kundenname": .Range("C1") = "Straße": .Range("D1") = "Ort"
                 .Range("A1:D1").Font.Bold = True
                End With
             
             Else ' B = 0 
                If sArea2(B) <> "" Then
                  ThisWorkbook.Sheets(OName).Cells(LCol, 1) = OName 'schreibe Ordnername 
     
                  sFormel = Right$(sArea2(B), Len(sArea2(B)) - InStrRev(sArea2(B), "\"))
                  sFormel = "'" & Replace(sArea2(B), sFormel, "[" & sFormel & "]Tabelle1'!") & Range("B1").Address(, , xlR1C1)

                   ThisWorkbook.Sheets(OName).Cells(LCol, 2) = ExecuteExcel4Macro(sFormel)
                    sFormel = Replace(sFormel, Range("B1").Address(, , xlR1C1), Range("B2").Address(, , xlR1C1))
                   ThisWorkbook.Sheets(OName).Cells(LCol, 3) = ExecuteExcel4Macro(sFormel)
                    sFormel = Replace(sFormel, Range("B2").Address(, , xlR1C1), Range("B3").Address(, , xlR1C1))
                   ThisWorkbook.Sheets(OName).Cells(LCol, 4) = ExecuteExcel4Macro(sFormel)
                    LCol = LCol + 1
                End If ' sArea2(B) <> "" 
             End If ' B = 0 
              
            Next B
             LCol = 2
          End If 'UBound(sArea2) > 1 
        Next A
 
 .Calculation = iCalc
 .EnableEvents = True
 .ScreenUpdating = True
 .StatusBar = False
End With 'Application 
 
Erase sArea: Erase sArea2
Set FS = Nothing: Set varFolder = Nothing
End Sub


Gruß Tino

AW: Mist...
21.12.2008 14:31:00
Thomas
Geschafft, hast Du wirklich gut gemacht.
Danke.....
AW: Mist...
21.12.2008 14:57:00
Thomas
Jetzt bin ich auch dahinter gekommen wie ich die Datei erweitern kann.
1000 Dank....
Super
21.12.2008 15:38:35
Tino
Hallo,
na Klasse das es funktioniert.
Frohe Weihnachten und einen guten Rutsch.
Frohe Weihnachten und einen guten Rutsch.
Gruß Tino
AW: Super
21.12.2008 16:36:00
Thomas
Danke, Dir auch.....

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige