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

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

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
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?
Anzeige
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
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!?
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

112 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige