Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1724to1728
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
3x On Error Goto Weiter ?
21.11.2019 13:04:18
Klaus
Hi,
ich habe ein kleines Script gehabt, das auch funktionierte.
Per Formel erzeuge ich an einigen Stellen DIV0! Fehler, per SpecialCells16 selektiere ich dann eben diese Zellen und kann ohne Schleife - sehr schnell - weiter machen.
Problem: Falls es keine SpecialCells16 gibt, steigt die Selektion mit einem Fehler aus. Da behelfe ich mir, indem ich ein "on error goto weiter" drum herum setze.
Da das Makro natürlich eine Fehlerbehandlung hat, gehe ich direkt nach dem SpecialCells16-Befehl mit "on error goto fehler" wieder auf ebendiese.
Das klappt auch - aber nur einmal. Bitte schaut euch einmal mein Makro an. Das erste "goto weiter" funktioniert, bei "goto weiter2" steigt er aus (im SpecialCells Befehl). Klammere ich den "goto weiter" Block komplett aus, läuft der "goto weiter2" Block sauber durch - im "goto weiter3" Block steigt er dann bei SpecialCells wieder aus.
Ich möchte jetzt nicht hören, dass ich keine Fehlerwerte verursachen soll :-) Kann mir jemand erklären, wieso der "On Error Goto" Befehl sich nicht wiederholen lässt?
LG,
Klaus M.
Sub ScanArchivFertigMelden()
On Error GoTo fehler
Const APPNAME = "Scan Archiv Fertig melden"
Dim lRow As Long
With ScanArchiv
.Range("L2:L" & lRow).FormulaR1C1 = "=1/IF(RC7=""fertig"",0,1)" 'provoziert Div0! Fehler
On Error GoTo weiter    'Falls keine SpecialCells Type 16 gefunden werden!
.Columns("L:L").SpecialCells(xlCellTypeFormulas, 16).Offset(0, 1).FormulaR1C1 = "=MATCH(RC1, _
RepairList!C1,)"
weiter:
On Error GoTo fehler
End With
With RepairList
On Error GoTo weiter2   'Falls keine SpecialCells Type 16 gefunden werden!
For Each myRng In .Columns("AH:AH").SpecialCells(xlCellTypeFormulas, 16)
Call OutByDoubleClick(myRng.Row)
Next myRng
weiter2:
On Error GoTo fehler
Call DoResetAutofilter(RepairList, 1, 12, 6)
.Range("$A$6:$L$" & lRow).AutoFilter Field:=10, Criteria1:="="
On Error GoTo weiter3 'Falls keine Special Cells Visible vorhanden sind
For Each myRng In .Range("$M$7:$M$" & lRow).SpecialCells(xlCellTypeVisible)
myRng.FormulaR1C1 = "=IFERROR(IF(LOOKUP(2,1/(ScanArchiv!C[-12]=RC[-12]),ScanArchiv!C[-2] _
)="""","""",LOOKUP(2,1/(ScanArchiv!C[-12]=RC[-12]),ScanArchiv!C[-2])),"""")"
Next myRng
weiter3:
On Error GoTo fehler
End With
'*** Fehlerbehandlung
Err.Clear
fehler:
If Err.Number  0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
& "Fehlernummer: " & Err.Number & vbLf & Err.Description
Err.Clear
End Sub

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 3x On Error Goto Weiter ?
21.11.2019 13:20:07
Nepumuk
Hallo Klaus,
3x die selbe Anweisung ist Unsinn. Und Err.Clear ist keine Fehlerbehandlung. Da muss ein Resume / Resume Next / oder Resume Sprungmarke/Zeilennummer stehen.
Gruß
Nepumuk
AW: 3x On Error Goto Weiter ?
21.11.2019 13:26:28
Klaus
Hallo Nepumuk,
ich lerne gerne was ich besser machen kann. Momentan funktioniert es einfach nicht - auf drei Makros aufgeteilt (siehe mein Beitrag einen weiter unten) funktioniert es. WO siehst du denn drei mal die selbe Anweisung?
Mich interessieren jetzt vor allem zwei Sachen
1) Kann ich "Keine Typ 16 Zellen vorhanden" eleganter abfragen als mit einem OnError?
2) Wieso geht "OnError" einmal und zweimal, aber nicht dreimal?
Deinen Nackenschlag mit der mangelnden Fehlerbehandlung nehme ich mal so hin. "Err.clear" funktioniert insofern, dass meine User im Fehlerfall eine MsgBox bekommen die sie dann screenshoten und mir schicken können, das beruhigt sie ungemein da sie dann ja etwas gemeldet haben. Wenn das VBA-Fenster mit all seinem Code aufgeht, denken sie der Computer explodiert und fallen rückwärts vom Stuhl :-) insofern ist meine Fehlerbehandlung zumindest praktikabel :-) Aber auch hier schaue ich mir sehr gerne eine bessere Version von dir ab!
LG,
Klaus M.
Anzeige
AW: 3x On Error Goto Weiter ?
21.11.2019 13:39:38
peterk
Hallo
ad 1) Ich würde es so machen:

Set myRng = .Columns("AH:AH").SpecialCells(xlCellTypeFormulas, 16)
If not myRng=Nothing then
For Each myCell In myRng
Call OutByDoubleClick(myCell.Row)
Next myCell
end if

AW: 3x On Error Goto Weiter ?
21.11.2019 14:08:42
Nepumuk
Hallo Klaus,
bei mir sähe das so aus:
Sub ScanArchivFertigMelden()
    
    Const APPNAME = "Scan Archiv Fertig melden"
    
    On Error GoTo fehler
    
    Dim lRow As Long
    Dim myRng As Range
    Dim objRange As Range
    
    With ScanArchiv
        .Range("L2:L" & lRow).FormulaR1C1 = "=1/IF(RC7=""fertig"",0,1)" 'provoziert Div0! Fehler
        Set objRange = .Columns("L:L").SpecialCells(xlCellTypeFormulas, xlErrors)
        If Not objRange Is Nothing Then _
            objRange.Offset(0, 1).FormulaR1C1 = "=MATCH(RC1,RepairList!C1,)"
    End With
    
    With RepairList
        Set objRange = .Columns("AH:AH").SpecialCells(xlCellTypeFormulas, xlErrors)
        If Not objRange Is Nothing Then
            For Each myRng In objRange
                Call OutByDoubleClick(myRng.Row)
            Next myRng
        End If
        
        Call DoResetAutofilter(RepairList, 1, 12, 6)
        .Range("$A$6:$L$" & lRow).AutoFilter Field:=10, Criteria1:="="
        
        Set objRange = .Range("$M$7:$M$" & lRow).SpecialCells(xlCellTypeVisible)
        If Not objRange Is Nothing Then
            For Each myRng In objRange
                myRng.FormulaR1C1 = "=IFERROR(IF(LOOKUP(2,1/(ScanArchiv!C[-12]=RC[-12]),ScanArchiv!C[-2]" & _
                    ")="""","""",LOOKUP(2,1/(ScanArchiv!C[-12]=RC[-12]),ScanArchiv!C[-2])),"""")"
            Next myRng
        End If
        
    End With
    
    Exit Sub
    
    fehler:
    MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
        & "Fehlernummer: " & Err.Number & vbLf & Err.Description
    Resume Next
    
End Sub

Gruß
Nepumuk
Anzeige
AW: 3x On Error Goto Weiter ?
21.11.2019 14:13:18
Nepumuk
Ooooooops,
da fehlt noch was.
Sub ScanArchivFertigMelden()
    
    Const APPNAME = "Scan Archiv Fertig melden"
    
    On Error GoTo fehler
    
    Dim lRow As Long
    Dim myRng As Range
    Dim objRange As Range
    
    With ScanArchiv
        .Range("L2:L" & lRow).FormulaR1C1 = "=1/IF(RC7=""fertig"",0,1)" 'provoziert Div0! Fehler
        Set objRange = .Columns("L:L").SpecialCells(xlCellTypeFormulas, xlErrors)
        If Not objRange Is Nothing Then _
            objRange.Offset(0, 1).FormulaR1C1 = "=MATCH(RC1,RepairList!C1,)"
    End With
    
    With RepairList
        Set objRange = Nothing
        Set objRange = .Columns("AH:AH").SpecialCells(xlCellTypeFormulas, xlErrors)
        If Not objRange Is Nothing Then
            For Each myRng In objRange
                ' Call OutByDoubleClick(myRng.Row)
            Next myRng
        End If
        
        ' Call DoResetAutofilter(RepairList, 1, 12, 6)
        .Range("$A$6:$L$" & lRow).AutoFilter Field:=10, Criteria1:="="
        Set objRange = Nothing
        Set objRange = .Range("$M$7:$M$" & lRow).SpecialCells(xlCellTypeVisible)
        If Not objRange Is Nothing Then
            For Each myRng In objRange
                myRng.FormulaR1C1 = "=IFERROR(IF(LOOKUP(2,1/(ScanArchiv!C[-12]=RC[-12]),ScanArchiv!C[-2]" & _
                    ")="""","""",LOOKUP(2,1/(ScanArchiv!C[-12]=RC[-12]),ScanArchiv!C[-2])),"""")"
            Next myRng
        End If
        
    End With
    
    Exit Sub
    
    fehler:
    MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
        & "Fehlernummer: " & Err.Number & vbLf & Err.Description
    Resume Next
    
End Sub

Gruß
Nepumuk
Anzeige
AW: 3x On Error Goto Weiter ?
21.11.2019 14:17:35
Klaus
Danke Nepumuk und Peter,
das werde ich morgen ausprobieren und mich dann melden!
Bis dahin schönen Feierabend (ja, ich habe schon um 2 Feierabend. Neidisch?)
LG,
Klaus M.
AW: 3x On Error Goto Weiter ?
22.11.2019 06:29:02
Klaus
Guten Morgen Nepumuk und Peter,
Das sieht auf jedem Fall eleganter aus als meine Version. Ich werde versuchen, mir "Set Range =" anzugewöhnen.
Allerdings: Das Problem ist nicht behoben. objRange wird zwar auf "is nothing" überprüft, aber der Fehler tritt schon eine Zeile vorher auf. Diese steigt aus, wenn es keine DIV0! findet:
Set objRange = .Columns("L:L").SpecialCells(xlCellTypeFormulas, xlErrors)
Dank eurer Hilfe habe ich es aber für mich funktional und ohne ein dutzend Gotos extra lösen können:
    '*** Fehlerbehandlung
Err.Clear
fehler:
If Err.Number = 1004 Then
Resume Next
Else
If Err.Number  0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
& "Fehlernummer: " & Err.Number & vbLf & Err.Description
Err.Clear
End If

So läuft es bei "keine DIV0! gefunden" weiter (und die Prüfung auf "is nothing" verhindert, dass Formeln eingetragen werden) und bricht bei allen sonstigen Fehlern wie gewollt mit Meldung ab.
LG und Danke,
Klaus M.
Anzeige
AW: 3x On Error Goto Weiter ?
21.11.2019 13:20:13
Klaus
Workaround:
Wenn ich es auf drei Subs aufteile, funktioniert es.
Sub ScanArchivFertigMelden()
On Error GoTo fehler
Const APPNAME = "Scan Archiv Fertig melden"
Dim lRow As Long
With ScanArchiv
.Range("L2:L" & lRow).FormulaR1C1 = "=1/IF(RC7=""fertig"",0,1)" 'provoziert Div0! Fehler
On Error GoTo weiter    'Falls keine SpecialCells Type 16 gefunden werden!
.Columns("L:L").SpecialCells(xlCellTypeFormulas, 16).Offset(0, 1).FormulaR1C1 = "=MATCH(RC1, _
RepairList!C1,)"
weiter:
On Error GoTo fehler
RepairsOut
CommentsOut
'*** Fehlerbehandlung
Err.Clear
fehler:
If Err.Number  0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
& "Fehlernummer: " & Err.Number & vbLf & Err.Description & vbLf & vbLf & "Bitte Klaus  _
Meyer von der Twer (AV) kontaktieren!"
Err.Clear
End Sub
Sub RepairsOut()
Dim myRng As Range
With RepairList
On Error GoTo weiter2   'Falls keine SpecialCells Type 16 gefunden werden!
For Each myRng In .Columns("AH:AH").SpecialCells(xlCellTypeFormulas, 16)
Call OutByDoubleClick(myRng.Row)
Next myRng
End With
weiter2:
End Sub
Sub CommentsOut()
Dim myRng As Range
Dim lRow As Long
With RepairList
Call DoResetAutofilter(RepairList, 1, 12, 6)
.Range("$A$6:$L$" & lRow).AutoFilter Field:=10, Criteria1:="="
On Error GoTo weiter3 'Falls keine Special Cells Visible vorhanden sind
For Each myRng In .Range("$M$7:$M$" & lRow).SpecialCells(xlCellTypeVisible)
myRng.FormulaR1C1 = "=IFERROR(IF(LOOKUP(2,1/(ScanArchiv!C[-12]=RC[-12]),ScanArchiv!C[-2] _
)="""","""",LOOKUP(2,1/(ScanArchiv!C[-12]=RC[-12]),ScanArchiv!C[-2])),"""")"
Next myRng
End With
weiter3:
On Error GoTo fehler
End Sub
Mich würd trotzdem interessieren, warum "On Error Goto" sich nur einmal innerhalb des Sub ändern darf.
LG,
Klaus
Anzeige
AW: 3x On Error Goto Weiter ?
21.11.2019 13:20:25
Rudi
Hallo,
würde ich so machen:
Sub ScanArchivFertigMelden()
On Error GoTo fehler
Const APPNAME = "Scan Archiv Fertig melden"
Dim rSC As Range
Dim lRow As Long
With ScanArchiv
.Range("L2:L" & lRow).FormulaR1C1 = "=1/IF(RC7=""fertig"",0,1)" 'provoziert Div0! Fehler
On Error Resume Next 'Falls keine SpecialCells Type 16 gefunden werden!
Set rSC = .Columns("L:L").SpecialCells(xlCellTypeFormulas, 16)
On Error GoTo 0
If Not rSC Is Nothing Then
rSC.Offset(0, 1).FormulaR1C1 = "=MATCH(RC1, RepairList!C1,)"
End If
weiter:
End With
'...

Gruß
Rudi
Anzeige
AW: 3x On Error Goto Weiter ?
21.11.2019 13:21:11
Daniel
HI
wenn du einen Fehlersprung ausgeführt hast, befindest du dich im Fehlerbehandlungsmodus.
im Fehlerbehandlungsmodus ist kein weitere Fehlersprung möglich.
du musst also erst den Fehlerbehandlungsmodus beenden, z.B. mit einem On Error Goto 0 oder einem Resume am Ende des Fehlersprungs
machs doch so:
dim FehlerZellen as range
set FehlerZellen = nothing
ON Error resume next
set Fehlerzellen = ...Specialcells(…,16)
On error goto 0
if Fehlerzellen is Nothing then
… Code wenn kein Fehler vorhanden
Else
… Code wenn Zellen mit Fehler vorliegen
End if
Gruß DAniel
Anzeige
AW: 3x On Error Goto Weiter ?
21.11.2019 13:31:04
Klaus
Verstehe.
Also mal in ganz doof (keine Angst, so würde ich das nicht umsetzen):
Sub ScanArchivFertigMelden()
On Error GoTo fehler
Range("L2:L" & lRow).FormulaR1C1 = "=1/IF(RC7=""fertig"",0,1)" 'provoziert Div0! Fehler
On Error GoTo weiter    'Falls keine SpecialCells Type 16 gefunden werden!
irgendwas mitSpecialCells(xlCellTypeFormulas, 16)
weiter:
On Error GoTo 0
On Error GoTo fehler
On Error GoTo weiter2   'Falls keine SpecialCells Type 16 gefunden werden!
For Each myRng In .Columns("AH:AH").SpecialCells(xlCellTypeFormulas, 16) [...]
weiter2:
On Error GoTo 0
On Error GoTo fehler
On Error GoTo weiter3 'Falls keine Special Cells Visible vorhanden sind
For Each myRng In .Range("$M$7:$M$" & lRow).SpecialCells(xlCellTypeVisible) [..]
weiter3:
On Error GoTo 0
On Error GoTo fehler
'*** Fehlerbehandlung
Err.Clear
fehler:
If Err.Number  0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
& "Fehlernummer: " & Err.Number & vbLf & Err.Description
Err.Clear
End Sub
Das würde funktionieren?
LG,
Klaus M.
Anzeige

174 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige