Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
844to848
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
844to848
844to848
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Fehler beim "worksheet.copy", aber wieso?

Fehler beim "worksheet.copy", aber wieso?
13.02.2007 12:58:02
Boris
Hallo,
ich bekomme einen "Laufzeitfehler 1004, copy method of worksheet class failed" in der unten markierten Zeile, das komische ist: der Fehler tritt nicht immer auf, und auch nicht immer an der selben Stelle.
Erklärung des Tools: Das Makro wird von Sheet(1) aus aufgerufen und löscht zunächst alle Sheets, die nach Sheet(2) (="Template") kommen. Dann werden xl-Files aus einem Verzeichnis nacheinander geöffnet, die Daten in "Template" kopiert, Charts aktualisiert und dieses Template ans Ende kopiert (wo "MANCHMAL" der Fehler auftritt):
Sub DatenKonsolidieren()
Application.ScreenUpdating = False
Call LöscheOutputSheets
Call KopiereOutputSheets
ThisWorkbook.Sheets(1).Activate
Application.ScreenUpdating = True
End Sub

Private Sub LöscheOutputSheets()
Dim i As Integer
Application.DisplayAlerts = False
For i = 3 To ThisWorkbook.Sheets.Count
ThisWorkbook.Sheets(3).Delete
Next i
Application.DisplayAlerts = True
End Sub


Private Sub KopiereOutputSheets()
Dim Mappe As String
Dim i As Integer, j As Integer, vtemp As Integer
Dim SheetName As String
Dim arrFiles() As Integer
Dim VLink As Variant, k As Integer
Dim QuellOrdner As String
Dim objBild As Object
Dim WS As Worksheet
Set WS = ThisWorkbook.Worksheets("Template")
QuellOrdner = ThisWorkbook.Path & "\..\Reports\"
'Erstellen der Integer-Arrays mit den ID-Nummern (alphanumerisch sortiert):
Mappe = Dir(QuellOrdner & "*.xls")
i = 0
Do While Mappe <> ""
i = i + 1
ReDim Preserve arrFiles(1 To i)
arrFiles(i) = Left(Mappe, InStr(Mappe, ".") - 1)
Mappe = Dir
Loop
'Numerische Sortierung der Integer-Arrays:
For j = UBound(arrFiles) - 1 To LBound(arrFiles) Step -1
'Alle links davon liegenden Zeichen auf richtige Sortierung der jeweiligen Nachfolger überprüfen:
For i = LBound(arrFiles) To j
'Ist das aktuelle Element seinem Nachfolger gegenüber korrekt sortiert?
If arrFiles(i) > arrFiles(i + 1) Then
'Element und seinen Nachfolger vertauschen.
vtemp = arrFiles(i)
arrFiles(i) = arrFiles(i + 1)
arrFiles(i + 1) = vtemp
End If
Next i
Next j
'Öffnen der einzelnen Dateien und kopieren der Datensätze:
For i = 1 To UBound(arrFiles)
Workbooks.Open QuellOrdner & arrFiles(i) & ".xls", UpdateLinks:=0
ThisWorkbook.Sheets("Template").Range("C3").Value = arrFiles(i)
'Kopieren der Datenbereiche
Workbooks(arrFiles(i) & ".xls").Sheets(1).Range("A1:S50").Copy WS.Range("AF72")
Workbooks(arrFiles(i) & ".xls").Sheets(2).Range("A1:E54").Copy WS.Range("AF13")
'Aktualisierung der Charts
WS.ChartObjects("Chart 1").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC7").Value
WS.ChartObjects("Chart 2").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC8").Value
WS.ChartObjects("Chart 3").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC4").Value
WS.ChartObjects("Chart 4").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC5").Value
WS.ChartObjects("Chart 5").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC6").Value
WS.ChartObjects("Chart 6").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC9").Value
IN FOLGENDER ZEILE TRITT DER FEHLER AUF:
ThisWorkbook.Sheets("Template").Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = arrFiles(i)
'        VLink = ActiveWorkbook.LinkSources(xlExcelLinks)
'        If Not IsEmpty(VLink) Then
'            For k = 1 To UBound(VLink)
'                ActiveWorkbook.BreakLink VLink(k), Type:=xlLinkTypeExcelLinks
'            Next k
'        End If
Workbooks(arrFiles(i) & ".xls").Close savechanges:=False
Next i
End Sub

Wenn ich die Datei "frisch" geöffnet habe, funktioniert das ganze (aber komischerweise auch nicht immer). Führe ich das Makro jedoch mehrmals hintereinander aus, kommt der Fehler fast immer, aber das auch nicht immer an der gleichen Stelle der Schleife...
Wer kann mir helfen?
PS: Habe schon vermutet, dass die Charts die Ursache sind, aber auch ohne Charts tritt der Fehler auf.

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehler beim "worksheet.copy", aber wieso?
13.02.2007 13:13:57
Erich G.
Hallo Boris,
den Fehler gabs schon - wenn auch in anderer Ausprägung - in Excel97:
http://support.microsoft.com/?scid=kb;de;177634
gefunden in
http://www.xlam.ch/xlimits/xllimit24.htm
In der XL97 (glaube ich) wurde der neue interne Blattname duch Anhängen einer 1 gebildet - das wird bald zu lang.
Aber auch in neueren Versionen steigt VBA bei der n-ten Kopie eines Blatts - meist einer Vorlage - aus.
in dem obigen Link steht auch eine mögliche Abhilfe: Sheets.Add und dann Cells.Copy anstelle von Sheets().Copy.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Fehler beim "worksheet.copy", aber wieso?
13.02.2007 13:16:42
Ramses
Hallo
Das könnte mal verbessert werden

Private Sub LöscheOutputSheets()
Dim i As Integer
Application.DisplayAlerts = False
For i = 3 To ThisWorkbook.Sheets.Count
ThisWorkbook.Sheets(3).Delete
Next i
Application.DisplayAlerts = True
End Sub

1. Werden alle Sheets gezählt, auch Diagrammblätter = Charts :-).
Besser Worksheets.Count
2. Soll die Schleife zum löschen von "hinten" beginnen
For i = ThisWorkbook.worksheets.Count to 3 Step -1
ThisWorkbook.worksheets(i).Delete
Next i
Probier mal ob der Fehler dann immer noch auftritt
Gruss Rainer
Anzeige
AW: Fehler beim "worksheet.copy", aber wieso?
13.02.2007 14:19:02
Boris
Hallo Rainer,
danke für den Hinweis, der Fehler tritt jedoch leider immer noch auf... und das ist mir völlig unklar, da ich in einem anderen Makro in etwa die gleichen Befehle zum Kopieren von Sheets verwende, und zwar eine erheblich größere Anzahl, diese werden nach dem Kopieren umbenannt.
Hm, bin ratlos...
Nachtrag
13.02.2007 14:54:53
Boris
Am "XL97-Problem" kann es nicht liegen, wenn folgendes Makro funktioniert:

Sub test()
For x = 1 To 300
ThisWorkbook.Sheets(1).Copy after:=Thisworkbook.Sheets(Thisworkbook.Worksheets.Count)
ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count).name = x
Next x
End Sub

Richtig?
Anzeige
AW: Sheets(x).copy mehrfach - Fehler
13.02.2007 18:31:27
Erich G.
Hallo Boris,
ja, am XL97-Fehler liegt es nicht.
Bei mir (XP SP2, Excel10 (2002) SP3, 1 GB Speicher) bricht copytest bei ca. 525 Blättern ab:
https://www.herber.de/bbs/user/40396.xls
Ich habe nicht klären können, unter welchen Bedingungen der Fehler früher oder später auftritt.
In anderen Mappen ist schon bei der 25. oder 30. Kopie Schluss...
Aufklärung wäre schön! - Grüße von Erich aus Kamp-Lintfort
AW: Sheets(x).copy mehrfach - Fehler
14.02.2007 18:00:14
Boris
Aufklärung wäre schön ist gut:) Ich wollte doch die Antwort:) Es ist mir nach wie vor ein Rätsel. Bei mir war eben bei 266/533 schluss.
Nur wieso stürzt mein Makro von der ursprünglichen Anfrage schon so viel früher ab? Und wieso ist der gemeldete Fehler ein anderer?
Gruß,
Boris
Anzeige
AW: Sheets(x).copy mehrfach - Fehler
14.02.2007 18:58:06
Kurt
Hi,
lösch mal zu Testzwecken alle Namen aus der Mappe, auch die unsichtbaren und
versuchs dann nochmal, sollten wesentlich mehr Kopien möglich sein.
mfg Kurt
AW: Sheets(x).copy mehrfach - Fehler
15.02.2007 11:53:10
Boris
Das bringt alles nichts, so ein *Mist*... Irgendwie muss ich dieses Problem lösen, sonst sind 2 Monate Arbeit futsch...
AW: Sheets(x).copy mehrfach - Fehler
15.02.2007 13:17:49
Erich G.
Hallo Boris,
schau doch noch mal in meinen ersten Beitrag, da steht etwas zu dem Link: Mögliche Abhilfe: Sheets.Add...
Ich stelle wieder auch offen - vielleicht kennt ja doch jemand die Ursache...
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Sheets(x).copy mehrfach - Fehler
15.02.2007 22:53:38
Gerd L
Guten Abend,
ja bei so ca. 530 Tabellenblättern einfacher Art ist tatsächlich das Ende der Fahnenstange erreicht.
Da im Testmakro von Erich pro Schleifendurchlauf zwei Sheets eingefügt werden, dann halt bei
266 Durchläufen.
Laut ..."xllimits" soll die Dateikapazität auch bei maximal 125 Diagrammen erschöpft sein.
Wieviele Diagramme maximal benötigt werden, ist nicht genannt worden.
Eine weitere Alternative wäre, nur die benötigten Werte in die "Sammeldatei" einzulesen u.
bei Bedarf ein Diagramm dann wahlweise mit den verschiedenen Werten aufzubauen.
Die Dateinamen werden in ein Integer-Array eingelesen. Falls die Dateinamen bzw. ID-Nummern
führende Nullen enthalten, werden diese hierbei abgeklemmt. Dies könnte bei der Namenszuweisung
an die Sheets in der Zieldatei zum Namenskonflikt wegen Doppelbennung führen.
Im Code stehen ein paar deklarierte, aber nicht benutzte, Variablen. Diese sind entweder überflüssig oder hier wurde nur eine gekürzte Fassung des Makros eingestellt.
Dass bei Wiederholungen unter Umständen die Arbeitsspeicherkapazität schneller erreicht wird oder
erst gar nichts mehr läuft, falls nicht ordentlich zurückgesetzt worden ist, ist auch klar, zumal wenn im Code ein Datenfeld drin ist.
Gruß
Gerd
Anzeige
AW: Sheets(x).copy mehrfach - Fehler
16.02.2007 01:03:50
Erich G.
Hallo zusammen,
weils noch unklar ist: Es liegt am Copy!
In dieser Mappe gibt es auch den "Würgaround" mit Sheets.Add und Range().copy. Der läuft durch, fast wie geschmiert...
https://www.herber.de/bbs/user/40474.xls
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Sheets(x).copy mehrfach - Fehler
16.02.2007 11:14:21
Boris
Hi Gerd,
mein Datenblatt beinhaltet 6 Diagramme, eine Kopieranzahl von ca. 100 würde mir reichen, mehr wäre besser. Das eigentliche Ziel ist: "Pdf-e alle Datenblätter in ein Dokument". Da Acrobat nicht über eine "Spool-Funktion" verfügt, müsste man jedes Datenblatt einzeln erstellen und dann erst zusammenfügen -> zu viel Aufwand (Eine andere Software als Acrobat kommt nicht in Frage). So bin ich auf die Idee gekommen: Kopiere alle Sheets hintereinander und drucke dann erst das gesamte Workbook.
In der Tat waren da verwaiste Deklarationen, danke für den Hinweis -> hat leider nur nichts gebracht:)
Die Dateinamen bzw. IDs sind im Format #.xls gespeichert, es existieren also keine führende Nullen.
Hier ist nochmal der komplette Code, Verbesserungsvorschläge sind jederzeit erwünscht. Wie setzt man denn (und was?) ordentlich zurück (bin ein VBA-Newbie)?

Sub KopiereOutputSheets()
Dim Mappe As String
Dim i As Integer, j As Integer
Dim vtemp As Integer
Dim arrFiles() As Integer
Dim QuellOrdner As String
Dim WS As Worksheet
Set WS = ThisWorkbook.Worksheets("Template")
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For i = ThisWorkbook.Worksheets.Count To 3 Step -1
ThisWorkbook.Worksheets(i).Delete
Next i
QuellOrdner = ThisWorkbook.Path & "\..\Argus Reports\"
'Erstellen der Integer-Arrays mit den ID-Nummern (alphanumerisch sortiert):
Mappe = Dir(QuellOrdner & "*.xls")
i = 0
Do While Mappe <> ""
i = i + 1
ReDim Preserve arrFiles(1 To i)
arrFiles(i) = Left(Mappe, InStr(Mappe, ".") - 1)
Mappe = Dir
Loop
'Numerische Sortierung der Integer-Arrays:
For j = UBound(arrFiles) - 1 To LBound(arrFiles) Step -1
'Alle links davon liegenden Zeichen auf richtige Sortierung der jeweiligen Nachfolger überprüfen:
For i = LBound(arrFiles) To j
'Ist das aktuelle Element seinem Nachfolger gegenüber korrekt sortiert?
If arrFiles(i) > arrFiles(i + 1) Then
'Element und seinen Nachfolger vertauschen.
vtemp = arrFiles(i)
arrFiles(i) = arrFiles(i + 1)
arrFiles(i + 1) = vtemp
End If
Next i
Next j
'Öffnen der einzelnen Dateien und kopieren der Datensätze:
For i = 1 To UBound(arrFiles)
Workbooks.Open QuellOrdner & arrFiles(i) & ".xls", UpdateLinks:=0
WS.Range("C3").Value = arrFiles(i)
'Kopieren der Datenbereiche
Workbooks(arrFiles(i) & ".xls").Sheets(1).Range("A1:S50").Copy WS.Range("AF72")
Workbooks(arrFiles(i) & ".xls").Sheets(2).Range("A1:E54").Copy WS.Range("AF13")
'Aktualisierung der Charts
WS.ChartObjects("Chart 1").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC7").Value
WS.ChartObjects("Chart 2").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC8").Value
WS.ChartObjects("Chart 3").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC4").Value
WS.ChartObjects("Chart 4").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC5").Value
WS.ChartObjects("Chart 5").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC6").Value
WS.ChartObjects("Chart 6").Chart.SeriesCollection(1).Values = "='Template'!" & WS.Range("AC9").Value
WS.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count)
ThisWorkbook.Sheets(ThisWorkbook.Worksheets.Count).Name = arrFiles(i)
Workbooks(arrFiles(i) & ".xls").Close savechanges:=False
Next i
ThisWorkbook.Sheets(1).Activate
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Gruß,
Boris
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige