Archief - VBA Error handling in loops

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Recipe4hate

Legacy Member
Goedemiddag dames en heren,


Ik heb een vervelend probleem in VBA. Ik roep in een For-lus een routine aan, die mogelijk kan falen. Indien deze faalt, zou ik gewoon de volgende Next moeten hebben en de For-lus opnieuw laten starten met de 2e routine... enz.

De calcInvoice sub is gebaseerd op duizend-en-één queries, dus deze aanpassen is onmogelijk (en functioneert naar behoren). De error die moet worden opgevangen is dus 3021.

Het rare is, is dat de eerste keer dat calcInvoice een error genereert, de errorbreak wel wordt aangesproken, de keer daarop niet meer (ik krijg dan effectief een error op lijn x in de calcInvoice sub.)

Ik heb al op het internet gelezen dat het kan dat de huidige Errorhandler actief/nonactief wordt, naargelang deze is uitgevoerd?


Code:
    For iC = 0 To UBound(arrAllActiveCarriers)
        On Error GoTo errorbreak
        Err.Clear
        [Form_Swb_InvoiceData]![Combo_Carrier].Value = arrAllActiveCarriers(iC)
        calcInvoice
errorbreak:
        If (Err = 3021) Then
            '//This error does not need to be trapped, but has to be passed
        ElseIf (Err > 0) Then
            MsgBox "Error"
        End If
    Next


Alle hulp is welkom!

M1tch

Legacy Member
Ik ken niks van VBA maar ...

je gebruikt een assignment '=' ipv van een equals '==' operator om u error te vergelijken in u errorbreak. En dan krijg je altijd true (tenzij de value toevallig 0 zou zijn). Denk er ook aan dat je altijd langs errorbreak komt, ook al heb je geen error, is dit gewenst gedrag ?


Het is beter design om dat errorbreak-gedeelte in een aparte functie te gooien, dat maakt alles veel overzichtelijker.

goto's kunnen soms handig zijn, maar vermijd dit indien mogelijk, want er is meestal een simpeler alternatief.

Recipe4hate

Legacy Member
M1tch zei:
Ik ken niks van VBA maar ...

je gebruikt een assignment '=' ipv van een equals '==' operator om u error te vergelijken in u errorbreak. En dan krijg je altijd true (tenzij de value toevallig 0 zou zijn).

Niet correct, in VBA moet je weldegelijk een '=' gebruiken voor vergelijkingen.

M1tch zei:
Denk er ook aan dat je altijd langs errorbreak komt, ook al heb je geen error, is dit gewenst gedrag ?

Dit is gewenst gedrag, bovenaan mijn FOR wordt mijn error gecleared, er kan dus enkel een error gethrowed worden binnen de subroutine. En enkel als de error een nummer heeft (als deze bestaat dus), wordt de IF binnen de errorhandling afgelopen.

M1tch zei:
Het is beter design om dat errorbreak-gedeelte in een aparte functie te gooien, dat maakt alles veel overzichtelijker.
Mwa, om nu enkel die 2 IF's in een aparte routine te steken, de module bevat hier voor de rest weinig code, dus het blijft vrij overzichtelijk.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan