Routine fehlertoleranter
16.06.2010 08:27:44
Erich
Hi Fritz,
so könnte es durchlaufen:
Option Explicit
Dim arrErr(), lngErr As Long
Sub KopieBlattInAlle()
Dim aStrFN() As String, zz As Long, strFN As String
Dim myCalC As XlCalculation, blnDisp As Boolean
lngErr = 0 ' Dateiliste erzeugen
ReDim arrErr(1 To 5, 1 To 100)
ReDim aStrFN(1 To 100)
strFN = Dir(ThisWorkbook.Path & "\*.xls")
Do While strFN ""
zz = zz + 1
If zz > UBound(aStrFN) Then _
ReDim Preserve aStrFN(1 To 2 * UBound(aStrFN))
aStrFN(zz) = strFN
strFN = Dir()
Loop
If zz = 0 Then Exit Sub
ReDim Preserve aStrFN(1 To zz)
With Application
.EnableEvents = False
myCalC = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
blnDisp = .DisplayStatusBar
.DisplayStatusBar = True
End With
For zz = 1 To UBound(aStrFN)
Application.StatusBar = zz & " von " & UBound(aStrFN)
If aStrFN(zz) ThisWorkbook.Name Then ' nicht eigene Mappe
On Error Resume Next
Workbooks.Open ThisWorkbook.Path & "\" & aStrFN(zz), _
0, False, , , , True
If Err.Number = 0 Then
On Error GoTo 0
With ActiveWorkbook
If SheetEx("Bewertung") Then
ErrListe "Hinw", "Blatt ex.", _
aStrFN(zz), 0, "Blatt 'Bewertung'"
.Close False ' Schließen ohne Speichern
Else
On Error Resume Next
ThisWorkbook.Sheets("Bewertung").Copy _
after:=.Sheets(.Sheets.Count) ' Kopieren
If Err.Number 0 Then _
ErrListe "Fehler", "Copy", _
aStrFN(zz), Err.Number, Err.Description
On Error Resume Next
.Save ' Speichern
If Err.Number 0 Then _
ErrListe "Fehler", "Save", _
aStrFN(zz), Err.Number, Err.Description
.Close False ' Schließen
End If
End With
Else
ErrListe "Fehler", "Open", _
aStrFN(zz), Err.Number, Err.Description
On Error GoTo 0
End If
End If
Next zz
Application.StatusBar = False
If lngErr > 0 Then
ReDim Preserve arrErr(1 To 5, 1 To lngErr)
ThisWorkbook.Worksheets.Add
Cells(2, 1).Resize(UBound(arrErr, 2), UBound(arrErr)) = _
Application.Transpose(arrErr)
End If
With Application
.EnableEvents = True
.Calculation = myCalC
.ScreenUpdating = True
.DisplayStatusBar = blnDisp
End With
End Sub
Sub ErrListe(strArt As String, strBei As String, _
strFile As String, lngNum As Long, strDesc As String)
lngErr = lngErr + 1
If lngErr > UBound(arrErr, 2) Then _
ReDim Preserve arrErr(1 To 5, 1 To 2 * UBound(arrErr, 2))
arrErr(1, lngErr) = strArt
arrErr(2, lngErr) = strBei
arrErr(3, lngErr) = strFile
arrErr(4, lngErr) = lngNum
arrErr(5, lngErr) = strDesc
End Sub
Function SheetEx(strNam As String) As Boolean
On Error Resume Next
SheetEx = ActiveWorkbook.Sheets(strNam).Index > 0
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort