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

Bereich aus Dateien eines Verzeichnisses auslesen

Bereich aus Dateien eines Verzeichnisses auslesen
22.02.2013 08:50:53
chandler
Hallo Forum,
würde gerne ein Bereich auslesen aus ca. 300 Dateien eines Verzeichnisses auslesen.
Bekomme leider eine Fehlermeldung bei: For iCounter = 1 To UBound(arr)
"Laufzeitfehler '9' Index außerhalb des gültigen Bereichs"
Habe die Anzahl der Dateien reduziert, trotzdem hilft es nicht.
Was ist falsch?
Hier der Code:
Sub start()
Dim arr As Variant
Dim iCounter As Integer, iRow As Integer
Dim sPath As String
Application.ScreenUpdating = False
sPath = GetDirectory( _
"Bitte Pfad der Quelldateien auswählen:")
If sPath = "" Then Exit Sub
arr = FileArray(sPath, "*.xlsx")
iRow = 5
On Error Resume Next
For iCounter = 1 To UBound(arr)
Workbooks.Open sPath & "\" & arr(iCounter)
Application.ScreenUpdating = False
Range("E10:F10").Copy _
ThisWorkbook.Worksheets("Tabelle1").Cells(iRow, 2)
ActiveWorkbook.Close savechanges:=False
iRow = iRow + 1
Next iCounter
Application.ScreenUpdating = True
End Sub
Und weiter:
Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Declare

Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, ByVal pszPath As String) As Long
Declare 

Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long

Function GetDirectory(Optional Msg As String) As String
Dim bInfo As BROWSEINFO
Dim Path As String
Dim r As Long, x As Long, pos As Integer
bInfo.pidlRoot = 0&
If IsMissing(Msg) Then
bInfo.lpszTitle = "Wählen Sie bitte einen Ordner aus."
Else
bInfo.lpszTitle = Msg
End If
bInfo.ulFlags = &H1
x = SHBrowseForFolder(bInfo)
Path = Space$(512)
r = SHGetPathFromIDList(ByVal x, ByVal Path)
If r Then
pos = InStr(Path, Chr$(0))
GetDirectory = Left(Path, pos - 1)
Else
GetDirectory = ""
End If
End Function

Function FileArray(strPath As String, strPattern As String)
Dim arrDateien()
Dim intCounter As Integer
Dim strDatei As String
If Right(strPath, 1)  "\" Then strPath = strPath & "\"
strDatei = Dir(strPath & strPattern)
Do While strDatei  ""
intCounter = intCounter + 1
ReDim Preserve arrDateien(1 To intCounter)
arrDateien(intCounter) = strDatei
strDatei = Dir()
Loop
FileArray = arrDateien
End Function

Hat jemend eine Idee und kann helfen?
Vielen Dank. Grüße

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bereich aus Dateien eines Verzeichnisses auslesen
22.02.2013 10:47:56
Luschi
Hallo chandler,
habe den Vba-Code mal getestet, ein Fehler kann so nicht auftreten, da 'On Error Resume Next'
alles abfängt. Wenn Du diese Zeile aber deaktivierst und das Array() 'arr' ist leer, weil er keine Dateien mit dem entsprechendem Dateityp in den ausgewählten Verzeichnis gefunden hat; ja dann kommt der von Dir beschriebene Vba-Fehler: denn 'arr' ist dann kein Array, sondern ein normaler Variant-Wert und hat keine Ober- und Untergrenze.
Deshalb prüfe, ob 'aar' tatsächlich ein Array() ist:

arr = FileArray(sPath, "*.xlsx")
If Not VarType(arr) = (vbArray + vbVariant) Then
Exit Sub
End If
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Bereich aus Dateien eines Verzeichnisses auslesen
22.02.2013 11:04:10
chandler
Hallo Luschi,
in der Tat "On Error Resume Next" habe nur ich aus Verzweiflung ausprobiert.
Hie der Code. Leider immer noch die gleiche Fehlermeldung
Sub start()
Dim arr As Variant
Dim iCounter As Integer, iRow As Integer
Dim sPath As String
Application.ScreenUpdating = False
sPath = GetDirectory( _
"Bitte Pfad der Quelldateien auswählen:")
If sPath = "" Then Exit Sub
arr = FileArray(sPath, "*.xlsx")
If Not VarType(arr) = (vbArray + vbVariant) Then
Exit Sub
End If
iRow = 5
For iCounter = 1 To UBound(arr)
Workbooks.Open sPath & "\" & arr(iCounter)
Application.ScreenUpdating = False
Range("E10:F10").Copy _
ThisWorkbook.Worksheets("Tabelle1").Cells(iRow, 2)
ActiveWorkbook.Close savechanges:=False
iRow = iRow + 1
Next iCounter
Application.ScreenUpdating = True
End Sub
Vilen Dank. Grüße

Anzeige
AW: Bereich aus Dateien eines Verzeichnisses auslesen
22.02.2013 11:12:35
Case
Hallo, :-)
ein weiteres Problem:
Workbooks.Open sPath & "\" & arr(iCounter)
"sPath" hat aber schon einen abschließenden Backslash - somit hast Du dann zwei.
"Application.ScreenUpdating = False" sollte nicht in der Schleife sein.
Der Code läuft ansonsten bei mir durch.
Du kannst aber auch mal folgendes probieren:
Option Explicit
Const strSheetQ As String = "Lastkollektive" ' DIE Tabelle wird ausgelesen"
Const strSheetZ As String = "Tabelle1" ' Die Tabelle in DIESER Datei
Const strRange As String = "E2:F2" ' Der Bereich wird ausgelesen
Public Sub Files_Read()
Dim strDir As String
Dim objFSO As Object
Dim objDir As Object
Dim lngCalc As Long
On Error GoTo Fin
With Application
.ScreenUpdating = False
.AskToUpdateLinks = False
.EnableEvents = False
lngCalc = .Calculation
.Calculation = xlCalculationManual
.DisplayAlerts = False
End With
Set objFSO = CreateObject("Scripting.FileSystemObject")
' Datei im gleichen Ordner wie Auswertungsdateien
' strDir = ThisWorkbook.Path & "\"
' Fester Ordner vorgegeben
' strDir = "C:\Temp\Test\"
' strDir = IIf(Right(strDir, 1)  "\", strDir & "\", strDir)
If funcDirectory(strDir)  "" Then
Set objDir = objFSO.GetFolder(strDir)
With ThisWorkbook.Worksheets(strSheetZ)
.Rows("2:" & .Rows.Count).ClearContents
'dirInfo objDir, "*.xls*", True ' Mit Unterordner
dirInfo objDir, "*.xls*" ' Ohne Unterordner
.UsedRange.Value = .UsedRange.Value
End With
End If
Fin:
With Application
' eventuell...
'.Goto (ThisWorkbook.Worksheets(strSheetZ).Range("A1")), True
.ScreenUpdating = True
.AskToUpdateLinks = True
.EnableEvents = True
.Calculation = lngCalc
.DisplayAlerts = True
End With
Set objDir = Nothing
Set objFSO = Nothing
If Err.Number  0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
End Sub
Public Sub dirInfo(ByVal objCurrentDir As Object, ByVal strName As String, _
Optional ByVal blnTMP As Boolean = False)
Dim objWorkbook As Workbook
Dim strFormula As String
Dim lngLastRow As Long
Dim varTMP As Variant
Dim strTMP As String
strTMP = Range(strRange).Address(RowAbsolute:=True, _
ColumnAbsolute:=True, ReferenceStyle:=xlR1C1)
For Each varTMP In objCurrentDir.Files
If varTMP.Name Like strName And varTMP.Name  _
ThisWorkbook.Name And Left(varTMP.Name, 1)  "~" Then
With ThisWorkbook.Worksheets(strSheetZ)
lngLastRow = IIf(Len(.Cells(.Rows.Count, 1)), _
.Rows.Count, .Cells(.Rows.Count, 1).End(xlUp).Row) + 1
With .Range(.Cells(lngLastRow, 1), _
.Cells(Range(strRange).Rows.Count + lngLastRow - 1, _
Range(strRange).Columns.Count))
.FormulaArray = "='" & Mid(varTMP.Path, 1, _
InStrRev(varTMP.Path, "\")) & "[" & _
Mid(varTMP.Path, InStrRev(varTMP.Path, _
"\") + 1) & "]" & _
strSheetQ & "'!" & strRange
End With
End With
End If
Next varTMP
If blnTMP = True Then
For Each varTMP In objCurrentDir.SubFolders
dirInfo varTMP, strName, blnTMP
Next varTMP
End If
Set objWorkbook = Nothing
End Sub
Private Function funcDirectory(strDirectory As String) As String
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = "C:\"
.Title = "Directory"
.ButtonName = "Select..."
.InitialView = msoFileDialogViewList
If .Show = -1 Then
strDirectory = .SelectedItems(1)
If Right(strDirectory, 1)  "\" Then _
strDirectory = strDirectory & "\"
Else
strDirectory = ""
End If
End With
funcDirectory = strDirectory
End Function
"Lastkollektive" ist das Tabellenblatt in den 300 auszulesenden Dateien - also Name anpassen!
Bei mir im Code wird alles ab Zeile 2 abwärts gelöscht, also probiere das erst mal in einer neuen Datei!!!
Servus
Case

Anzeige
AW: Bereich aus Dateien eines Verzeichnisses auslesen
22.02.2013 11:33:30
chandler
Hallo Case,
vielen Dank.
Wie gesagt ich hatte einen blackout, habe immer das Übergeordnete Verzeichnis ausgewählt.
Wie man Unterverzeichnisse in einer Schleife ausliesst weiss ich aber nicht.
Vielen Dank. Grüße

AW: Bereich aus Dateien eines Verzeichnisses auslesen
22.02.2013 11:18:22
chandler
Hallo Luschi,
ich hatte ein Denkfehler hatte ein Verzeichnis mit Unterverzeichnissen.
Leider kann ich mit dem Makro der die Unterverzeichnisse so nicht ansprechen. Schade.
Ich weiss leider nicht wie man Unterverzeichnisse mit xlsx auslesen kann.
Vielen Dank. Grüße

AW: Bereich aus Dateien eines Verzeichnisses auslesen
22.02.2013 11:27:19
Case
Hallo, :-)
mit meinem Code kannst Du auch Unterordner auslesen lassen.
Entferne das Kommentarzeichen hier:
'dirInfo objDir, "*.xls*", True ' Mit Unterordner
Und setze eines hier:
dirInfo objDir, "*.xls*" ' Ohne Unterordner
Servus
Case

Anzeige
AW: Bereich aus Dateien eines Verzeichnisses auslesen
22.02.2013 12:10:25
chandler
Hallo Case,
es wäre echt super, wenn das ginge, könnte viel Zeit sparen.
Werde gleich deinen Code anpassen und ausprobieren.
Vielen Dank. Grüße

AW:Funktioniert einwandfrei
23.02.2013 15:56:28
chandler
Hallo Case,
vielen Dank für die Hilfe. Funktioniert einwandfrei.
Grüße

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige