Hallo,
wenn Excel nach dem Speichern von drei Tabellen nicht mehr reagiert, liegt es daran, dass der Befehl an sich für die Speicherung zu lange braucht.
Windows erwartet von einer Anwendung, dass es uf Anfragen in einem bestimmten Zeitfenster reagiert. Damit sollen "nicht reagierende Anwendungen" optisch für den Anwender markiert werden. Zusätzlich wird dem Anwender schließlich die Möglichkeit gegeben, eine scheinbar nicht mehr reagierende Anwendung zu beenden. Windows macht hier keinen Unterschied, ob die Anwendung eine aufwendige Berechnung durchführt oder nicht.
Wenn der Befehl "Einzelne_Tabellen" länger als normal benötigt, um vollständig ausgeführt zu werden, passieren solche Ausnahmesituationen, wie bereits beschrieben.
Es gibt mehrere Möglichkeiten, um das zu beheben:
Sub Einzelne_Tabellen()
Dim oWs As Worksheet
On Error Resume Next
For Each oWs In ActiveWorkbook.Worksheets
oWs.Copy
With ActiveWorkbook
' .SaveAs oWs.Name
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
oWs.Name & ".PDF", Quality:=xlQualityStandard, IncludeDocProperties _
:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
VBA.DoEvents
.Close False
End With
Next oWs
End Sub
Der Befehl VBA.DoEvents bewirkt nichts anderes, als eine Abarbeitung aller zwischenzeitlich aufgelaufenen Anfragen.
Wichtiger Hinweis: Falls der Anwender zwischenzeitlich nochmals den Speicherungs-Vorgang anstößt, wird dieser auch mehrfach ausgeführt! Um eine mehrfache Ausführung zu verhindern kann man auch folgenden Code einsetzen:
Sub Einzelne_Tabellen()
Static doSave As Boolean
Dim oWs As Worksheet
On Error Resume Next
If Not doSave Then
doSave = True
For Each oWs In ActiveWorkbook.Worksheets
oWs.Copy
With ActiveWorkbook
' .SaveAs oWs.Name
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
oWs.Name & ".PDF", Quality:=xlQualityStandard, IncludeDocProperties _
:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
VBA.DoEvents
.Close False
End With
Next oWs
doSave = False
Else
MsgBox "Die Seicherung wird bereits ausgeführt! Bitte etwas Geduld...", vbInformation
End If
End Sub
Die Statische Variable doSave behält seinen Wert auch nach BEendigung des Befehls bei. Daher wird die Varable vor Beginn der Speicherng auf True gesetzt und nach Abschluß wieder auf False zurückgesetzt. Falls der Befehl mehrfach aufgerufen wird, bekommt der Anwender eine Info-Nachricht.
Falls das nichts bringen sollte, kann man auch den ganzen Speicherungs-Vorgang im Hintergrund ausführen lassen:
Mit OnTime kann ein beliebiges Makro auch im Hintergrund ausgeführt werden:
Sub Einzelne_Tabellen(Optional runningDirekt As Boolean = True)
Static doSave As Boolean
Dim oWs As Worksheet
On Error Resume Next
If runningDirekt Then
Application.OnTime Now() + TimeValue("00:00:01"), "'Einzelne_Tabellen (False)'"
Else
If Not doSave Then
doSave = True
For Each oWs In ActiveWorkbook.Worksheets
oWs.Copy
With ActiveWorkbook
' .SaveAs oWs.Name
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
oWs.Name & ".PDF", Quality:=xlQualityStandard, IncludeDocProperties _
:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
VBA.DoEvents
.Close False
End With
Next oWs
doSave = False
Else
MsgBox "Die Seicherung wird bereits ausgeführt! Bitte etwas Geduld...", vbInformation
End If
End If
End Sub
Kurze Erläuterung: Wenn der Befehl Ohne Parameter aufgerufen wird, so wird dieser nach 1 Sekunde nochmals mit einem Parameter im Hintergrund gestartet. Erst beim zweiten Aufruf (mit Parameter) wird die Sicherung der Tabellenblätter durchgeführt.
Vorteil: Excel kann während der Speicherung normal auf Anfragen reagieren, es tritt keine Meldung "Anwendung reagiert nicht mehr" auf.
Nachteil: Der Anwender kann beim Speichern einer Tabelle weiterhin Änderungen vornehmen. Die Folgen kann ich nicht abschätzen.
Vielleicht hilft eine dieser Lösungsvorschläge weiter.
LG, BigBen
|