Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Excel-VBA stürzt ab beim Kopieren

Excel-VBA stürzt ab beim Kopieren
Gunther
Hallo!
Ich hoffe, dass Ihr mir bei meinem Problem weiterhelfen könnt.
Ich hatte folgende Aufgabenstellung zu bearbeiten: In einem Verzeichnis befinden sich viele, gleich aufgebautet Excel-Datein. Jede Datei enthält mehrere Blätter die mit Berichten gefüllt sind. Nun soll ein neue Datei erstellt werden, in dem aus jeder Datei ein bestimmtes Blatt kopiert werden soll (nur Werte und Formatierung), um sozusagen einen Gesamtbericht zur Verfügung zu haben.
Hierzu hatte ich ein kleines Makro geschrieben. In der Makrodatei wird angegeben, aus welchen Dateien Kopien benötigt werden, wo die Dateien liegen und wie die neue Datei heißen soll.
Dann habe ich zunächst eine neue Datei erzeugt und bin mit einer einfachen Schleife die Anzahl der Dateien durchgegangen. Dort habe ich jeweils das erforderliche Datenblatt kopiert (Sheets.Copy) und in die neue Datei eingefügt. Anschließend habe ich das Blatt noch einmal markiert und dann mit PastValues die Formeln überschrieben.
Unter Office 2003 funktioniert dieses Makro tadellos. Nun auf einem Vista Rechner mit Office 2007 stürzt Excel immer wieder einfach ab - ohne Fehlermeldung.
Woran könnte das liegen? Wie könnte man die Aufgabenstellung ggf. anders lösen, um Probleme zu vermeiden?
Vielen Dank für Eure Überlegungen!
Gruß
Gunther
Anzeige

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

Betreff
Benutzer
Anzeige
der Code wäre hilfreich oT.
16.09.2009 11:40:13
Tino
AW: der Code wäre hilfreich oT.
16.09.2009 11:48:11
Gunther
Dim strPfad, strSheet, strZieldatei, strQuelldatei, strBerechnungsWert, strZielSheet As String
Dim intGes, intRow, intCol, intStartPos As Integer
Dim lgLaenge As Long
Dim wsMakro As Worksheet
Dim wsZiel As Workbook
Dim rgGes As Range
Set wsMakro = Application.ActiveWorkbook.ActiveSheet
wsMakro.Activate
gvar = Application.Calculation
Application.Calculation = xlManual
Set wsZiel = Workbooks.Add
Application.DisplayAlerts = False
wsZiel.Sheets(Array("Tabelle2", "Tabelle3")).Delete
Application.DisplayAlerts = True
With Application
.ScreenUpdating = False
.Cursor = xlWait
.StatusBar = "Kopiervorgang wird eingeleitet..."
End With
With wsMakro
strPfad = .Range("Pfad") & "\"
strSheet = .Range("Sheet")
strZieldatei = .Range("Datei")
End With
If Dir(strPfad & strZieldatei) = "" Then
wsZiel.SaveAs Filename:=strPfad & strZieldatei
wsZiel.Close SaveChanges:=False
Set wsZiel = Nothing
Else
MsgBox "Eine Datei mit dem Namen: " & strZieldatei & " ist bereits vorhanden. Bitte das Problem vor dem nächsten Aufruf des Programms lösen!", vbCritical
Call Cleansweep(gvar)
Exit Sub
End If
wsMakro.Activate
wsMakro.Range("Quelle").Select
Set rgGes = wsMakro.Range("Quelle").CurrentRegion
rgGes.Select
intGes = rgGes.Rows.Count - 1
Application.StatusBar = "Öffnen und kopieren der Zieldatei: " & strZieldatei
Application.Workbooks.Open strPfad & strZieldatei
Set wsZiel = Application.Workbooks(strZieldatei)
i = 1
Do While i <= intGes
wsMakro.Activate
wsMakro.Range("Quelle").Select
intCol = wsMakro.Range("Quelle").Column
intRow = wsMakro.Range("Quelle").Row
If i = 1 Then
strQuelldatei = ActiveCell()
lgLaenge = Len(strQuelldatei)
strZielSheet = Mid(strQuelldatei, 7, (lgLaenge - 11))
Else
Cells(intRow + (i - 1), intCol).Select
strQuelldatei = ActiveCell()
lgLaenge = Len(strQuelldatei)
strZielSheet = Mid(strQuelldatei, 7, (lgLaenge - 11))
End If
wsMakro.Activate
Application.StatusBar = "Einfügen der Datei: " & strQuelldatei
Application.Workbooks.Open strPfad & "\" & strQuelldatei, 0
Application.Workbooks(strQuelldatei).Activate
With Application.ActiveWorkbook
.Sheets(strSheet).Select
.Sheets(strSheet).Copy After:=Workbooks(strZieldatei).Sheets(1)
End With
Application.CutCopyMode = False
Application.Workbooks(strQuelldatei).Close SaveChanges:=False
wsZiel.Sheets(strSheet).Activate
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
Application.CutCopyMode = False
wsZiel.Sheets(strSheet).Name = strZielSheet
wsZiel.Sheets(strZielSheet).Activate
i = i + 1
Loop
wsZiel.Activate
Application.DisplayAlerts = False
wsZiel.Worksheets("Tabelle1").Delete
Application.DisplayAlerts = True
wsZiel.Sheets(strZielSheet).Activate
wsZiel.Save
wsMakro.Activate
wsZiel.Close
ActiveWindow.WindowState = xlMaximized
Call Cleansweep(gvar)
MsgBox "Es wurden die Daten von " & Str(intGes) & " Dateien erfolgreich übertragen!", vbInformation
Set rgGes = Nothing
Set wsZiel = Nothing
Anzeige
ohne Garantie
16.09.2009 12:23:04
Tino
Hallo,
habe den Code mal nach besten gewissen angepasst soweit ich ihn verstanden habe,
ob es so funktioniert kann ich nicht sagen habe Deine Daten nicht und kann somit nicht testen.
Allerdings weis ich nicht was sich hinter Call Cleansweep(gvar) versteckt.
Dim strPfad As String, strSheet As String, strZieldatei As String
Dim strQuelldatei As String, strBerechnungsWert As String, strZielSheet As String
Dim intGes As Long, intRow As Long, intCol As Long, intStartPos  As Long
Dim lgLaenge As Long
Dim wsMakro As Worksheet
Dim wsZiel As Workbook
Dim rgGes As Range
Dim iAnzahlSh As Integer, gvar As Integer

With Application

Set wsMakro = .ActiveWorkbook.ActiveSheet
    
    wsMakro.Activate
    gvar = .Calculation
    .Calculation = xlCalculationManual
     iAnzahlSh = .SheetsInNewWorkbook
    
    .SheetsInNewWorkbook = 1
     Set wsZiel = Workbooks.Add
    .SheetsInNewWorkbook = iAnzahlSh
    .ScreenUpdating = False
    .Cursor = xlWait
    .StatusBar = "Kopiervorgang wird eingeleitet..."


    With wsMakro
        strPfad = .Range("Pfad") & "\"
        strSheet = .Range("Sheet")
        strZieldatei = .Range("Datei")
    End With
    
    If Dir(strPfad & strZieldatei) = "" Then
        wsZiel.SaveAs Filename:=strPfad & strZieldatei
        wsZiel.Close SaveChanges:=False
        Set wsZiel = Nothing
    Else
        MsgBox "Eine Datei mit dem Namen: " & strZieldatei & " ist bereits vorhanden. Bitte das Problem vor dem nächsten Aufruf des Programms lösen!", vbCritical
        Call Cleansweep(gvar)
        Exit Sub
    End If


    Set rgGes = wsMakro.Range("Quelle").CurrentRegion
    intGes = rgGes.Rows.Count - 1
    
    .StatusBar = "Öffnen und kopieren der Zieldatei: " & strZieldatei
    .EnableEvents = False
    .Workbooks.Open Filename:=strPfad & strZieldatei, ReadOnly:=True
    Set wsZiel = Application.Workbooks(strZieldatei)
    
    i = 1
    
    Do While i <= intGes

        intCol = wsMakro.Range("Quelle").Column
        intRow = wsMakro.Range("Quelle").Row
        
        If i = 1 Then
            strQuelldatei = ActiveCell()
            lgLaenge = Len(strQuelldatei)
            strZielSheet = Mid(strQuelldatei, 7, (lgLaenge - 11))
        Else
            Cells(intRow + (i - 1), intCol).Select
            strQuelldatei = ActiveCell()
            lgLaenge = Len(strQuelldatei)
            strZielSheet = Mid(strQuelldatei, 7, (lgLaenge - 11))
        End If

        .StatusBar = "Einfügen der Datei: " & strQuelldatei
        
        .Workbooks.Open strPfad & "\" & strQuelldatei, 0
        .Workbooks(strQuelldatei).Activate
        
        With .ActiveWorkbook
        .Sheets(strSheet).Copy After:=Workbooks(strZieldatei).Sheets(1)
        End With

        .Workbooks(strQuelldatei).Close SaveChanges:=False
    
        With wsZiel.Sheets(strSheet)
            .UsedRange.Value = .UsedRange.Value
            .Name = strZielSheet
            .Activate
        End With
        i = i + 1
    Loop


     wsZiel.Activate
    .DisplayAlerts = False
     wsZiel.Worksheets("Tabelle1").Delete
    .DisplayAlerts = True
     wsZiel.Sheets(strZielSheet).Activate
     wsZiel.Save
     wsMakro.Activate
     wsZiel.Close
     .EnableEvents = True
End With

ActiveWindow.WindowState = xlMaximized

Call Cleansweep(gvar)

MsgBox "Es wurden die Daten von " & Str(intGes) & " Dateien erfolgreich übertragen!", vbInformation

Set rgGes = Nothing
Set wsZiel = Nothing
Gruß Tino
Anzeige
AW: ohne Garantie
16.09.2009 13:21:12
Gunther
WOW!!!!
Zunächst mal ganz herzlichen Dank! Ich werde das mal testen und sehen, ob der Fehler noch Auftritt. Doch zunächst vielen Dank, für die Mühe die Du Dir gemacht hast. Super!
Die Funktion CleanSweep macht nichts anderes, als den Cursor am Ende wieder auf "Normal" setzen, den Text in der Statusbar löschen und am Ende noch die Berechnungsfunktion wieder auf den Ursprungswert zu setzen. Aber soweit kam das Makro unter 2007 leider gar nicht mehr.
Mal sehen, ob es mit Deinen Änderungen klappt...
Ich melde mich noch einmal.
Gruß
Gunther
Anzeige
AW: ohne Garantie
16.09.2009 16:06:42
Gunther
So, habe nun mal ausführlich getestet - leider läuft das Programm immer noch nicht. Mal stürzt es nach dem kopieren der 4. mal nach der 2. und mal nach der 10. Datei ab. Einmal ist es sogar durchgelaufen. Irgendwie habe ich keine Idee, warum...
Noch irgendwelche Tips?
lass die Frage offen...
16.09.2009 16:40:26
Tino
Hallo,
vielleicht sieht ein anderer den Fehler.
Ich Tippe mal auf eine Speicherauslastung.
Gruß Tino
Anzeige
AW: lass die Frage offen...
17.09.2009 12:31:53
Gunther
Danke für den Hinweis.
Hat jemand noch etwas zum Thema "Speicherauslastung"? Mir ist tatsächlich bereits aufgefallen, dass im Taskmanager der freie physikalische Speicher immer zwischen 0-10MB tendiert.
Allerdings kenne ich mich an der Stelle nicht aus. Irgendwo habe ich aber mal augefschnappt, dass Excel 2007 hier ein Problem hat!?
Anzeige
AW: lass die Frage offen...
17.09.2009 15:28:15
fcs
Hallo Gunther,
ein Problem in deiner Version ist, dass du Cells.Selection benutzt und danach dann Copy und PasteSpecial benutzt, um Formeln durch Werte zu erstzen. Das braucht natürlich enorme Reserven.
Du solltest hier mit UsedRange arbeiten.
wsZiel.Sheets(strSheet).Activate
ActiveSheet.UsedRange.Copy
ActiveSheet.UsedRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
Application.CutCopyMode = False
wsZiel.Sheets(strSheet).Name = strZielSheet
wsZiel.Sheets(strZielSheet).Activate
Ansonsten funktioniert deine Prozedur auch wenn sie elendig viele Select- und Activate-Anweisungen enthält.
Ich würde die Prozedur komplett umstricken, inklusive geordneter Fehlerbehandlung.
Gruß
Franz
Sub Sheet_Copy()
Dim strPfad As String, strSheet As String, strZieldatei As String
Dim strQuelldatei As String, strBerechnungsWert As String, strZielSheet As String
Dim intGes As Long, intStartPos As Long
Dim lgLaenge As Long, i As Long
Dim wsMakro As Worksheet, wbMakro As Workbook
Dim wbZiel As Workbook, wbQuelle As Workbook
Dim rgGes As Range
Dim gvar As Integer
Dim intFehler As Long
On Error GoTo Fehler
With Application
Set wbMakro = .ActiveWorkbook
Set wsMakro = .ActiveWorkbook.ActiveSheet
.EnableEvents = False
gvar = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.Cursor = xlWait
.StatusBar = "Kopiervorgang wird eingeleitet..."
intFehler = 1
'Zieldatei-Namen-auslesen
With wsMakro
strPfad = .Range("Pfad") & "\"
strSheet = .Range("Sheet")
strZieldatei = .Range("Datei")
End With
intFehler = 2
'Prüfen, ob Zieldatei-Name schon vorhanden
If Not Dir(strPfad & strZieldatei) = "" Then
MsgBox "Eine Datei mit dem Namen: " & strZieldatei _
& " ist bereits vorhanden. Bitte das Problem vor dem nächsten Aufruf" _
& "des Programms lösen!", vbCritical
Call cleansweep(gvar)
Exit Sub
End If
intFehler = 3
Set rgGes = wsMakro.Range("Quelle").CurrentRegion
intGes = rgGes.Rows.Count - 1
.StatusBar = "Öffnen und kopieren der Zieldatei: " & strZieldatei
'Dateiliste abarbeiten
For i = 2 To rgGes.Rows.Count 'Schleifenzähler ggf. anpassen
'      For i = 1 To rgGes.Rows.Count-1 'alternative
intFehler = 4
'Dateiname einlesen
strQuelldatei = rgGes(i, 1)
lgLaenge = Len(strQuelldatei)
'neuen Blattnamen aus Dateiname erzeugen
strZielSheet = Mid(strQuelldatei, 7, (lgLaenge - 11))
.StatusBar = "Einfügen der Datei: " & strQuelldatei
intFehler = 5
Set wbQuelle = .Workbooks.Open(Filename:=strPfad & "\" & strQuelldatei, _
UpdateLinks:=0, ReadOnly:=True)
With wbQuelle
intFehler = 6
'Blatt aus Quelle kopieren
If wbZiel Is Nothing Then
'Neue Ziel-Arbeitsmappe für kopierte Blätter erstellen bei 1. Datei
.Sheets(strSheet).Copy
Set wbZiel = ActiveWorkbook
Else
.Sheets(strSheet).Copy Before:=wbZiel.Sheets(1)
End If
End With
wbQuelle.Close SaveChanges:=False
Set wbQuelle = Nothing
intFehler = 7
'Formeln durch Werte ersetzen Ziel-Blatt umbenennen
With wbZiel.Sheets(1)
.UsedRange.Value = .UsedRange.Value
'              .UsedRange.Copy
'              .UsedRange.Value.PasteSpecial Paste:=xlPasteValues
'              Range("A1").Select
.Name = strZielSheet
End With
Next i
'Zieldatei speichern
If wbZiel Is Nothing Then
MsgBox "Es wurden keine Dateien kopiert"
Else
intFehler = 8
'Speichern der Zieldatei
wbZiel.SaveAs Filename:=strPfad & strZieldatei, addtomru:=True
wbZiel.Close SaveChanges:=False
Set wbZiel = Nothing
End If
End With
wbMakro.Activate
wsMakro.Activate
Call cleansweep(gvar)
MsgBox "Es wurden die Daten von " & Str(intGes) & " Dateien erfolgreich übertragen!", _
vbInformation
Err.Clear
Fehler:
With Err
If .Number  0 Then
Select Case .Number
Case 99999
Case Else
Application.ScreenUpdating = True
MsgBox "Fehler-Nr. " & .Number & vbLf & .Description & vbLf & "intFehler = " _
& intFehler
If Not wbQuelle Is Nothing Then wbQuelle.Close SaveChanges:=False
Call cleansweep(gvar)
End Select
End If
End With
Set rgGes = Nothing
Set wbZiel = Nothing
End Sub

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Excel-VBA: Probleme beim Kopieren von Daten beheben


Schritt-für-Schritt-Anleitung

  1. Makro erstellen: Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.

  2. Neues Modul einfügen: Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  3. Code einfügen: Füge den folgenden VBA-Code ein, um Daten von mehreren Excel-Dateien zu kopieren:

    Sub Sheet_Copy()
       ' Deine Variablen hier definieren
       Dim strPfad As String, strSheet As String, strZieldatei As String
       ' Weitere Variablen ...
       On Error GoTo Fehler
       ' Dein Makro-Code hier ...
    End Sub
  4. Parameter anpassen: Stelle sicher, dass die Parameter wie strPfad, strSheet, und strZieldatei korrekt gesetzt sind.

  5. Einstellungen des Anwendungsobjekts: Setze Application.Calculation auf xlCalculationManual, um die Berechnung während des Kopierens zu verhindern.

  6. Kopieren und Einfügen: Verwende UsedRange, um den Speicherbedarf zu reduzieren und Excel-Abstürze zu vermeiden:

    With wsZiel.Sheets(1)
       .UsedRange.Value = .UsedRange.Value
    End With
  7. Fehlerbehandlung: Implementiere eine Fehlerbehandlung, um mögliche Probleme beim Speichern oder Kopieren zu erfassen.


Häufige Fehler und Lösungen

  • Excel stürzt beim Kopieren ab: Dies kann durch zu viele Select und Activate Anweisungen verursacht werden. Verwende stattdessen direkte Referenzen auf die Range-Objekte.

  • Speicherauslastung: Überprüfe den Task-Manager, um festzustellen, ob der Speicher während des Kopiervorgangs zu niedrig ist. Solltest Du feststellen, dass der freie physikalische Speicher zwischen 0-10 MB schwankt, kann das zu Abstürzen führen.

  • Fehlende Datei: Wenn das Makro versucht, eine bereits existierende Datei zu speichern, kann es zu einem Fehler kommen. Stelle sicher, dass der Dateiname eindeutig ist.


Alternative Methoden

  • Open Office: Wenn Excel unter Vista oder Office 2007 Probleme hat, kann es hilfreich sein, die Datei mit Open Office zu öffnen und dort die Kopieroperationen durchzuführen. Dies könnte verhindern, dass Excel beim Kopieren abstürzt.

  • Direkte Datenverbindung: Anstatt Daten zu kopieren, kannst Du auch eine direkte Datenverbindung zwischen den Arbeitsmappen einrichten, um die Notwendigkeit des Kopierens zu umgehen.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie man Daten von einer Quelle in eine Zielmappe kopiert:

Sub CopyData()
    Dim sourceRange As Range
    Dim targetSheet As Worksheet

    Set sourceRange = Workbooks("Quelle.xlsx").Sheets("Daten").UsedRange
    Set targetSheet = Workbooks("Ziel.xlsx").Sheets("Daten")

    targetSheet.Cells.Clear ' Vorherige Daten löschen
    sourceRange.Copy
    targetSheet.PasteSpecial Paste:=xlPasteValues
End Sub

Dieses Beispiel zeigt, wie Du die Methode UsedRange anwendest, um die Speicherauslastung zu optimieren.


Tipps für Profis

  • Vermeide Select und Activate: Reduziere die Anzahl dieser Anweisungen, um die Ausführungsgeschwindigkeit zu erhöhen und Fehler zu vermeiden.

  • Verwende Application.ScreenUpdating = False: Schalte die Bildschirmaktualisierung aus, um die Performance zu verbessern.

  • Regelmäßige Tests: Teste das Skript regelmäßig in verschiedenen Szenarien, um sicherzustellen, dass die Stabilität gewährleistet ist.


FAQ: Häufige Fragen

1. Warum stürzt Excel beim Kopieren ab? Das kann an einer hohen Speicherauslastung oder einer ineffizienten Programmierung (z.B. zu viele Select und Activate Anweisungen) liegen.

2. Wie kann ich die Speicherauslastung optimieren? Verwende UsedRange, um nur die tatsächlich benötigten Zellen zu kopieren, und überprüfe regelmäßig den Task-Manager auf den verfügbaren Speicherplatz.

3. Gibt es Alternativen zu Excel für solche Aufgaben? Ja, Open Office kann verwendet werden, wenn Excel unerwartet abstürzt. Es bietet ähnliche Funktionen und kann möglicherweise stabiler in bestimmten Situationen sein.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige