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

Bei Fehler speziellen Code ausführen

Bei Fehler speziellen Code ausführen
20.10.2023 14:30:34
Dosenjoe
hallo, ich öffne via VBA eine andere Exceltabelle.

Zum kopieren des Tabellenblattes verwende ich:


' Quelle
Set QWS = QWB.Worksheets("Import")
' Ziel
Set ZWS = ZWB.ActiveSheet
' oder after
QWS.Copy Before:=ZWS

Allerdings wird logischer weiße ein fehler ausgespuckt, wenn das Tabellenblatt Import nicht vorhanden ist.

wie kann ich denn in diesem fall einfach den fehler abfangen und mit einem speziellen Schritt weiter machen?

danke schonmal für die hilfe

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bei Fehler speziellen Code ausführen
20.10.2023 14:40:18
Freeloader
Hallo namenloser

Entweder am Anfang abfragen ob das Tabellenblatt vorhanden ist oder mit Error Handler den Fehler "behandeln":



On Error Goto Err1
' Quelle
Set QWS = QWB.Worksheets("Import")
' Ziel
Set ZWS = ZWB.ActiveSheet
' oder after
QWS.Copy Before:=ZWS
Exit Sub
Err1:
Call MeinMakro


Gruss Henner
AW: Bei Fehler speziellen Code ausführen
20.10.2023 15:37:07
daniel
Hi
Fehler sollte man möglichst vermeiden und Fehlerbehandlungen nur für unbekannte und nicht vermeidbare Fehler vorhalten.
Hier lässt sich das ganze elegant ohne Fehler lösen:

for each QWS in QWB.Worksheets

if QWS.Name = "Import" then Exit for
Next

if QWS is nothing then
msgbox "Blatt ""Import"" fehlt in Datei " & QWB.Name, vbCritical
else
QWS.Copy ...
End if


dh nach der Schleife mit Exit For kannst du immer mit If QWS is Nothing abfragen, ob das Blatt da ist oder nicht.

bzw ZWB.ActiveSheet ist grober Unfung.
Das ActiveSheet funktioniert nur in der aktiven Datei, deswegen macht es keinen Sinn, da ein Workbook-Objekt davor zu setzen.
Man muss zumindest sicherstellen, dass die Datei dann auch aktive ist:
ZWB.Select

set ZWS = ActiveSheet

Wobei man das auch nur dann machen sollte, wenn der Anwender auf diese Weise auswählen soll, wo das neue Blatt eingefügt werden soll, ansonsten sollte man das Blatt direkt angeben, bei allen "Active..."-Aktionen besteht sonst immer die Gefahr, das mal aus versehen was falsches aktiv ist, (vorallem wenn man im Einzelstep testet)

Gruß Daniel
Anzeige
AW: Bei Fehler speziellen Code ausführen
20.10.2023 16:50:56
Yal
Moin,

ich bin ganz bei Daniel, dass Fehler vermieden werden sollten, es ist aber manchmal sehr bequem, einen fehlertolerante Handlung zu verwenden.

Spricht: wir nehmen an, dass eine Fehler gemacht wird, aber, da Fehler pro Sub/Function behandelt werden, wir isolieren den potentiel fehlerberursachende Code in einer separaten Function und testen anschliessend das Ergebnis.
In dieser abgelagerte Function sollte nur die eine Aktion vorgenommen werden.

Sub Blatt_kopieren()

' Quelle
Set QWS = Blatt_auswählen(QWB, "Import")
' after ActiveSheet kopieren
If Not QWS Is Nothing Then QWS.Copy Before:=ZWB.ActiveSheet
End Sub

Private Function Blatt_auswählen(wb As Workbook, BlattName As String) As Worksheet
Try:
On Error GoTo Catch
Set Blatt_auswählen = wb.Worksheets(BlattName)
GoTo Finally
Catch:
'FehlerBehandlung, falls notwendig
Finally:
Resume 'Error-Flag zurücksetzen
'Aktivität(en), die auf alle Fälle erledigt werden sollten
End Function


Der "Try-Catch-Finally"-Muster ist hier über-pompös, aber manchmal notwendig. Daher ist es gut, es einmal gesehen zu haben.
Genau gesehen würde den 2 Zeiler ausreichen:
Private Function Blatt_auswählen(wb As Workbook, BlattName As String) As Worksheet

On Error Resume Next 'Ignoriert den Fehler komplett
Set Blatt_auswählen = wb.Worksheets(BlattName)
End Function


VG
Yal
Anzeige
AW: Bei Fehler speziellen Code ausführen
20.10.2023 18:08:42
daniel
das hin- und hergespringe im Code finde ich ziemlich unübersichtlich.

natürlich reicht im Prinizip ein On Error Resume Next davor und ein On Error goto 0 danach und der folgenden Abfrage IF is Nothing.

ich würde aber trotzdem darauf verzichten, wenn es geht denn:
- vielleicht habe ich die Variable schon zuvor verwendet und dann behält sie mit On Error ihren alten Wert
- vielleicht habe ich noch eine weiter Fehlerabsicherung am Laufen und dann muss man immer aufpassen, ob man On Error Goto 0 schalten muss oder nicht doch was anderes.
und im Speziellen Fall hat die Prüfschleife noch weitere Vorteile:
denn ich kann nicht nur nach dem vollständigen Namen gehen, sondern ich kann auch andere Erkennungsmethoden verwenden, bsp nur teilweise Namensübereinstimmung (Like "Import*") falls ein Kollege das Blatt mal in "Importe" umbenannt hat oder ich gehe nicht auf den Namen sondern bestimmte Zellinhalte auf dem Blatt, dh meine Möglichkeiten, das richtige Blatt zu erkennen, sind vielfältiger.

Gruß Daniel
Anzeige
AW: Bei Fehler speziellen Code ausführen
23.10.2023 10:58:14
Yal
Moin,

"das hin- und hergespringe im Code finde ich ziemlich unübersichtlich." Da bin ich ganz bei Dir und im Prinzip gegen jeglichen "Goto", jedoch mit der einzigen Ausnahme der Fehlerbehandlung.

Die Unübersichtlichkeit wird hier mit 2 Anker minimiert:
_ die Verwendung des bekannten Patterns Try-Catch-Finally, der sprachübergreifend bekannt und, wenn konsequent eingesetzt, sofort wiedererkennbar ist.
_ die Reduktion der Umfang der Function auf einer einzigen Handlung.

Noch fehlt in der ersten Zeile der Funktion ein passenden Kommentar, der auf das Verhalten hinweist:
Private Function Blatt_auswählen(wb As Workbook, BlattName As String) As Worksheet

'Liefert das Blatt mit Name Blattname, wenn vorhanden, als Objekt, ansonsten Nothing zurück.
On Error GoTo Catch
Try:
Set Blatt_auswählen = wb.Worksheets(BlattName)
GoTo Finally
Catch:
Finally:
Resume 'Error-Flag zurücksetzen
End Function
(genau gesehen ist "On Error ..." nicht Teil des "Try"-Abschnitts ;-)

VG
Yal
Anzeige
AW: Bei Fehler speziellen Code ausführen
24.10.2023 09:55:11
Dosenjoe
Danke für die Hilfe.
Besser: Ersetze "Err1" durch "ErrorHandler" (owT)
20.10.2023 14:58:19
Freeloader

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige