Ok, das war schon prägnanter.
Ich würde zuerst vorschlagen, diese Activate/Select/Selection's im Code zu beseitigen (wie/warum siehe Link).
Als nächstes wäre zu Überlegen, ob und wie man den Ablauf in einem/meheren Routinen "sinnvoll" strukturieren könnte.
Mein erster Gedanke wäre:
Option Explicit
Sub Ansatz()
On Error GoTo ErrHandler 'bei unvorhergesehenden Fehlern zum Ende springen
If ActiveSheet Is Nothing Then
Call MsgBox("Kein aktives Tabellenblatt zum Verarbeiten vorhanden.", _
vbExclamation)
Exit Sub
ElseIf Not TypeOf ActiveSheet Is Excel.Worksheet Then
Call MsgBox("Das aktive Blatt ist kein Tabellenblatt. Vorgang kann nicht fortgesetzt werden.", _
vbExclamation)
Exit Sub
End If
Dim wksUebersicht As Excel.Worksheet
Dim wksQuelle As Excel.Worksheet 'Anmeldeformular
Dim blnOpend As Boolean 'True wenn die Übersicht geöffnet werden musste, sonst False
'hier ist nun durch obige Schritte gewiss, dass das aktive Blatt ein Tabellenblatt ist
Set wksQuelle = ActiveSheet
'Übersicht beziehen (wird intern ggf. geöffnet -> dann wurde blnOpend = True gesetzt)
If Not BezieheUebersicht(wksUebersicht, blnOpend) Then
Call MsgBox("Übersicht konnte nicht geöffnet werden.", vbInformation)
Exit Sub
End If
'hier können nun die Daten übertragen werden
'Zugriff mit wksQuelle und wksUebersicht möglich
'ggf. ist es sinnvoll, diesen Vorgang in eine eigene Funktion auszulagern
'<...>
Call MsgBox("Vorgang erfolgreich abgeschlossen.", vbInformation)
GoTo SafeExit
ErrHandler:
Call MsgBox(Err.Description, vbCritical, "Fehler " & Err.Number)
SafeExit:
If blnOpend And Not wkbUebersicht Is Nothing Then
Call wksUebersicht.Parent.Close(SaveChanges:=True)
End If
End Sub
Private Function BezieheUebersicht( _
ByRef Worksheet As Excel.Worksheet, _
ByRef Opened As Boolean _
) As Boolean
'prüfen ob Übersicht bereits geöffnet ist
'... wenn ja, dann setze Worksheet, Opened = False und BezieheUebersicht = True
'... wenn nein, versuche sie zu öffne und ...
' ... bei Erfolg, setze Worksheet, Opened = True und BezieheUebersicht = True
' ... bei Misserfolg kann nichts weiter getan werden (BezieheUebersicht = False)
End Function
Wenn alle Anmeldeformulare gleichzeitig geöffnet sind, dann kann man die Verarbeitung auch gleich mit einer Schleife in einem Rutsch erledigen.
|