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

Dateien aus Pfad verarbeiten

Dateien aus Pfad verarbeiten
David
Hallo zusammen.
Ich habe diverse Dateien aus verschiedenen Niederlassungen, die immer gleich aufgebaut sind. Für den Import in eine Access-Datenbank ist der Aufbau allerdings ungeeignet.
Per VBA lasse ich deswegen eine neue "Sammel-Datei" erstellen, die aus jeder Datendatei nur 1 Blatt macht (vorher je Niederlassung/Tag eine Datei).
Der Code funzt soweit auch problemlos. Ich habe das bis jetzt so gelöst, dass alle offenen Dateien geprüft werden, ob es eine Datendatei ist (anhand Name) und wenn ja, wird sie verarbeitet. Dazu müssen dann allerdings alle betroffenen Dateien erst einmal geöffnet werden und anschließend wieder gesschlossen.
Eigentlich wollte ich das lieber so machen, dass alle Datendateien in einem Ordner liegen und der Code sie sich dort sucht, öffnet, bearbeitet und wieder schließt. So weit haben allerdings meine VBA-Kenntnisse nicht gereicht.
Diese Funktionalität würde ich deshalb von den anderen hier mitlesenden Profis erbitten. Vielleicht kann mir jemand zeigen, wie dies gemacht wird. Prinzipiell ist mir die Vorgehensweise schon klar, aber ich scheitere an der richtigen Syntax.
Hier der Code:
Option Explicit
Sub zusammenfassung()
GetMoreSpeed True
Dim wks As Worksheet, zrow As Double, ecol As Double, wkb As Workbook, B_Name As String
Workbooks.Add
ActiveWorkbook.SaveAs filename:="C:\Documents and Settings\...\Desktop\Zusammenfassung.xls",  _
FileFormat:=xlNormal
For Each wkb In Workbooks
If InStr(1, wkb.Name, "Auswertung gelöschte") > 0 Then
Workbooks("Zusammenfassung.xls").Worksheets.Add before:=Worksheets(1)
B_Name = Left(wkb.Name, InStr(1, wkb.Name, ".") - 1)
B_Name = Mid(B_Name, InStr(1, B_Name, "LS") + 3, 30)
Workbooks("Zusammenfassung.xls").ActiveSheet.Name = B_Name
For Each wks In wkb.Worksheets
If wks.Name  "Auswertung" Then
With ActiveWorkbook.Worksheets(B_Name)
zrow = .Range("A65536").End(xlUp).Row
ecol = wks.Range("IV1").End(xlToLeft).Column
wks.Range("A1:A1").Resize(, ecol).Copy Destination:=.Range("A1")
.Range("A1").Offset(, ecol) = "Datum"
wks.Range("A2:A30").Resize(, ecol).Copy
.Range("A" & zrow + 1).PasteSpecial Paste:=xlPasteValues
.Range("A" & zrow + 1).PasteSpecial Paste:=xlPasteFormats
On Error Resume Next
.Range("A" & zrow + 1 & ":A" & zrow + 29).Offset(, ecol).Value = CDate(wks. _
Name & "2010")
On Error GoTo 0
.Columns("A:A").Resize(, ecol).AutoFit
End With
End If
Next
End If
Next
For Each wks In Worksheets
If InStr(1, wks.Name, "Tabelle") > 0 Then
wks.Delete
End If
Next
GetMoreSpeed False
End Sub
Und zum Testen hier noch eine der Datendateien:
https://www.herber.de/bbs/user/70190.xls
Die Datendateien haben original immer den Namen "Auswertung gelöschte LS xyz.xls" (wobei xyz für den Namen der Niederlassung steht).
Falls euch noch andere Fehler oder "Umständlichkeiten" im Code auffallen, bin ich auch gern auf konstruktive Kritik gespannt.
Danke vorab.
Gruß
David

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Dateien aus Pfad verarbeiten
21.06.2010 14:08:34
Rudi
Hallo,
teste mal:
Sub zusammenfassung()
GetMoreSpeed True
Dim wks As Worksheet, zrow As Double, ecol As Double, wkb As Workbook, B_Name As String
Dim sFile As String, sPfad As String
sPfad = "c:\test\"
Workbooks.Add
ActiveWorkbook.SaveAs Filename:="C:\Documents and Settings\...\Desktop\Zusammenfassung.xls",  _
_
FileFormat:=xlNormal
sFile = Dir("Auswertung gelöschte" & "*.xls")
Do While sFile  ""
Set wkb = Workbooks.Open(sPfad & sFile)
Workbooks("Zusammenfassung.xls").Worksheets.Add before:=Worksheets(1)
B_Name = Left(wkb.Name, InStr(1, wkb.Name, ".") - 1)
B_Name = Mid(B_Name, InStr(1, B_Name, "LS") + 3, 30)
Workbooks("Zusammenfassung.xls").ActiveSheet.Name = B_Name
For Each wks In wkb.Worksheets
If wks.Name  "Auswertung" Then
With ActiveWorkbook.Worksheets(B_Name)
zrow = .Range("A65536").End(xlUp).Row
ecol = wks.Range("IV1").End(xlToLeft).Column
wks.Range("A1:A1").Resize(, ecol).Copy Destination:=.Range("A1")
.Range("A1").Offset(, ecol) = "Datum"
wks.Range("A2:A30").Resize(, ecol).Copy
.Range("A" & zrow + 1).PasteSpecial Paste:=xlPasteValues
.Range("A" & zrow + 1).PasteSpecial Paste:=xlPasteFormats
On Error Resume Next
.Range("A" & zrow + 1 & ":A" & zrow + 29).Offset(, ecol).Value = CDate(wks.Name & " _
2010")
On Error GoTo 0
.Columns("A:A").Resize(, ecol).AutoFit
End With
End If
Next
wkb.Close False
sFile = Dir
Loop
For Each wks In Worksheets
If InStr(1, wks.Name, "Tabelle") > 0 Then
wks.Delete
End If
Next
GetMoreSpeed False
End Sub

Gruß
Rudi
Anzeige
AW: Dateien aus Pfad verarbeiten
21.06.2010 14:27:57
David
Hallo Rudi,
die Variable sFile erhält nur "" und es wird keine Datei verarbeitet. Ich habe den Pfad auf meinen "Echtpfad" angepasst.
Muss hier
sFile = Dir("Auswertung gelöschte" & "*.xls")
nicht noch irgendwie der Pfad mit eingebaut werden?
Gruß
David
AW: Dateien aus Pfad verarbeiten
21.06.2010 14:33:30
Rudi
Hallo,
natürlich. Der Pfad fehlt.
sFile = Dir(sPfad & "Auswertung gelöschte" & "*.xls")
Gruß
Rudi
AW: Dateien aus Pfad verarbeiten
21.06.2010 15:02:53
David
Hallo Rudi,
jetzt hats geklappt. Ich hatte zwar noch eine Fehlermeldung, aber die hab ich selbst weg bekommen. Meine Referenzierung auf die einzelnen Workbooks/sheets ist wohl nicht ganz sauber, deswegen hatte der Code in die falsche Datei gegriffen.
Eine Frage noch zum Verständnis:
Mit der Do-Loop-Schleife komme ich nicht ganz klar. Der Befehl
sFile = Dir(sPfad & "Auswertung gelöschte" & "*.xls")
liest doch immer nur eine Datei ein (Zumindest wird mir im Debugging-Modus nur die erste Datei angezeigt)?! Wenn nun der Loop-Befehl kommt, um die nächste Datei einzulesen/zu öffnen, wird anscheinend diese Zeile wieder angesteuert. Müsste sie da nicht INNERHALB der Schleife stehen?
Auf jeden Fall noch mal ein großes Danke.
Gruß
David
Anzeige
AW: Dateien aus Pfad verarbeiten
21.06.2010 15:09:16
Rudi
Hallo,
nein, die nächste Datei wird hier
       sFile = Dir
Loop

eingelesen. Die Parameter merkt sich Dir aus dem ersten Aufruf. Es werden alle Dateien, die mit "Auswertung gelöschte" anfangen gelesen. Wenn die Anweisung mit Pfad etc. in der Schleife stünde, würde immer die selbe Datei gelesen.
Gruß
Rudi
AW: Dateien aus Pfad verarbeiten
21.06.2010 15:57:22
David
Ok, verstanden.
Noch ein kosmetisches Problem:
Aus der vorherigen Kopieraktion bleibt in jedem Blatt ein Teilbereich markiert. Nun wollte ich, dass jeweils Zelle A1 aktiviert wird.
Wenn ich aber den Befehl
...
.Range("A1").Select
.Columns("A:A").Resize(, ecol).AutoFit
...

nehme, kommt ein Laufzeitfehler 1004. Was ist daran falsch?
Gruß
David
Anzeige
AW: Dateien aus Pfad verarbeiten
22.06.2010 15:25:26
David
offen vegessen
hier meine Version...
21.06.2010 14:27:36
Tino
Hallo,
Ordner Pfad noch anpassen.
kommt als Code in Modul1
Option Explicit 
 
 
Sub Suchmaschine() 
Dim FileArray() 
Dim LCount As Long 
Dim FNR As String 
 
'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 Counter 
 
'Ordner Pfad anpassen 
ListFilesInFolder FileArray, "G:\1 Forum\Test_Ordner", "Auswertung gelöschte LS*.xls", False, LCount 
 
 
If LCount > 0 Then 
    zusammenfassung FileArray 
End If 
 
Erase FileArray 
End Sub 
 
Sub zusammenfassung(ByVal ArrFiles) 
Dim wks As Worksheet, zrow As Double, ecol As Double, wkb As Workbook, B_Name As String 
Dim nCount As Integer 
Dim oWB As Workbook, oSH As Worksheet, tmpWB As Workbook 
 
Set oWB = Workbooks.Add(1) 
 
''speichern aktivieren 
'oWB.SaveAs Filename:="C:\Documents and Settings\...\Desktop\Zusammenfassung.xls", FileFormat:=xlNormal 
 
With Application 
    .ScreenUpdating = False 
    .EnableEvents = False 
    .DisplayAlerts = False 
     
For nCount = Lbound(ArrFiles) To Ubound(ArrFiles) 
         
        Set oSH = oWB.Worksheets.Add(before:=oWB.Worksheets(1)) 
        oWB.Sheets(2).Delete 
        B_Name = Left(ArrFiles(nCount), InStr(1, ArrFiles(nCount), ".") - 1) 
        B_Name = Mid(B_Name, InStr(1, ArrFiles(nCount), "LS") + 3, 30) 
         
        oSH.Name = B_Name 
        Set tmpWB = Workbooks.Open(ArrFiles(nCount), ReadOnly:=True) 
         
        On Error Resume Next 
            Set wks = tmpWB.Worksheets("Auswertung") 
        On Error GoTo 0 
   
            If Not wks Is Nothing Then 
                With oSH 
                    zrow = .Cells(.Rows.Count, 1).End(xlUp).Row 
                    ecol = wks.Cells(1, wks.Columns.Count).End(xlToLeft).Column 
                    wks.Range("A1").Resize(, ecol).Copy Destination:=.Range("A1") 
                    .Range("A1").Offset(, ecol) = "Datum" 
                    wks.Range("A2:A30").Resize(, ecol).Copy 
                    .Range("A" & zrow + 1).PasteSpecial Paste:=xlPasteValues 
                    .Range("A" & zrow + 1).PasteSpecial Paste:=xlPasteFormats 
                    On Error Resume Next 
                    .Range("A" & zrow + 1 & ":A" & zrow + 29).Offset(, ecol).Value = wks.Name & " " & Year(Date) 
                    On Error GoTo 0 
                    .UsedRange.EntireColumn.AutoFit 
                End With 
            End If 
 
     
    Application.CutCopyMode = False 
    tmpWB.Close False 
Next nCount 
 
    .ScreenUpdating = False 
    .EnableEvents = False 
    .DisplayAlerts = False 
End With 
 
End Sub 
 
kommt als Code in Modul2
Option Explicit 
 
'Listet Files in Area 
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.Name) 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: hier meine Version...
21.06.2010 14:34:58
David
Hallo Tino,
etliches aus deinem Code verstehe ich nicht auf Anhieb, so dass die weitergehender Analyse bedarf.
Mein Makro ist schlußendlich für einen Kollegen, der NULL Ahnung von Excel hat und für den der bisherige Code schon "Zauberei" ist. Und falls da noch weitere Anfragen kommen, würde es mir sicher schwer fallen, den Code ohne weiteres umzubauen. Deswegen würde ich erst mal Rudis Variante bevorzugen (falls ich sie zum laufen kriege) und mir deine Variante mal in einer ruhigen Minute zu Gemüte führen - sicher kann ich da noch was lernen.
Danke udn Gruß
David

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige