Gestion des Erreur de la fonction "Match" avec "On error GoTo"

balou88

XLDnaute Nouveau
Bonjour à tous,


Mon problème réside dans la Gestion des erreurs lorsque VBA ne peut "matcher" une valeur. Beaucoup de personne ont déjà eut à faire avec ce problème, mais en parcourant différent forum je n'ai toujours pas trouver mon bonheur...

Pour expliquer simplement, j'ai une feuille avec la liste des articles produits (liste incomplète) et une autre avec la liste des articles contrôlés. Suivant les résultats de ces contrôles, la liste des articles évolue de différente maniére (boucle for balayant la liste des articles contrôlés), le problème est la liste des produits est incomplète du coup certains articles contrôlés ne sont pas répertoriés et la fonction MATCH renvoi une erreur.
Dans ce cas j'utilise la gestion d'erreur "On error GoTo Err" et "Err" un petit programme qui crée mon produit dans la liste des produits (le but étant d'avoir une liste exhaustive au fur et à mesure des contrôles).
Mais à chaque itération de mon balayage le programme passe par "Err" ce qui revient à créer une nouvelle fois un produit qui existe déjà....


J'éspére que c'est à peu prés claire...En gros comment faire pour que mon prog ne passe pas par Err si il n'y a pas d'erreur? ou comment gérer une erreur sur Match?

Je vous laisse mon prog avec différentes annotations pouvant etre utile (je ne peux pas vous joindre le fichier...)



Code:
Option Explicit


Sub Maj_refresh()


Dim nb_ligne_res As Integer  'nombre de ligne de resultats
Dim nb_ligne_prod As Integer  'nombre de ligne de produit
Dim j As Integer, i As Integer


Sheets("Resultats").Activate
nb_ligne_res = WorksheetFunction.CountA(Range("A:A"))

Sheets("Base").Activate
nb_ligne_prod = WorksheetFunction.CountA(Range("A:A"))

For i = 2 To nb_ligne_res  'boucle sur les résultats de contrôle

On Error GoTo Err


j = WorksheetFunction.Match(Worksheets("Resultats").Cells(i, 1).Value, Worksheets("Base").Columns(1), 0) 'je vérifie que mon objet existe dans la liste des produits et j'en extrait le numéro de ligne le cas échéant
   
        If Sheets("Resultats").Cells(i, 3).Value = "Q3" Then ' si objet Q3 mise à jour du produit dans la base des refresh
    
            Sheets("Base").Cells(j, 9) = Sheets("Resultats").Cells(i, 4)
            Sheets("Base").Cells(j, 8) = Sheets("Base").Cells(j, 8) + 1
        End If

        If Sheets("Resultats").Cells(i, 3).Value = "Q4" Then ' si objet Q4 mise à jour du produit dans la base des refresh

            Sheets("Base").Cells(j, 8) = "Fonte"
        End If
        

        
'si la fonction Match renvoi une erreur, je crée mon produit dans la base des produits en dernier
' Mon problème est que même si la fonction match n'a pas renvoyé d'erreur le programme passe par le "Err:" , du coup il incrémente plusieur fois les produits qui existent déjà dans ma base de produit.
Err:

Sheets("Base").Activate
nb_ligne_prod = WorksheetFunction.CountA(Range("A:A"))

 
        If Sheets("Resultats").Cells(i, 3).Value = "Q3" Then 'j'affecte les infos suivant le status qualité de ma pièce Q3 ou Q4
        
        Sheets("Base").Cells(nb_ligne_prod + 1, 1) = Sheets("Resultats").Cells(i, 1)
        Sheets("Base").Cells(nb_ligne_prod + 1, 2) = Sheets("Resultats").Cells(i, 2)
         Sheets("Base").Cells(nb_ligne_prod + 1, 9) = Sheets("Resultats").Cells(i, 4)
        Sheets("Base").Cells(nb_ligne_prod + 1, 8) = "1"
        End If
        
        If Sheets("Resultats").Cells(i, 3).Value = "Q4" Then

            Sheets("Base").Cells(nb_ligne_prod + 1, 1) = Sheets("Resultats").Cells(i, 1)
            Sheets("Base").Cells(nb_ligne_prod + 1, 2) = Sheets("Resultats").Cells(i, 2)
            Sheets("Base").Cells(nb_ligne_prod + 1, 8) = "Fonte"
        End If


        
Next i


End Sub


En esperant une aide (précieuse) des grands maîtres du CODE VBA!! :)


Merci beaucoup!
 

Pierrot93

XLDnaute Barbatruc
Re : Gestion des Erreur de la fonction "Match" avec "On error GoTo"

Bonjour,

perso, j'utilise ce type de code :
Code:
If IsError(Application.Match("xxx", maplage, 0)) Then
    MsgBox "pas trouvé"
Else
    MsgBox "trouvé"
End If

bonne soirée
@+
 

tototiti2008

XLDnaute Barbatruc
Re : Gestion des Erreur de la fonction "Match" avec "On error GoTo"

Bonjour babou, Pierrot :)

Moi je dois avouer que ma préférence va à Countif :

Code:
If Application.Countif(maplage, "xxx")=0 Then
    MsgBox "Pas trouvé"
Else
    MsgBox "trouvé"
End If
 

Pierrot93

XLDnaute Barbatruc
Re : Gestion des Erreur de la fonction "Match" avec "On error GoTo"

Re,
Toto:)
l'avantage de la fonction "match", tu peux l'utiliser dans un tableau, pas "countif" à priori :
Code:
Dim t() As Variant
t = Array("zzz", "xxx")
If Application.CountIf(t, "xxx") = 0 Then
    MsgBox "Pas trouvé"
Else
    MsgBox "trouvé"
End If

If IsError(Application.Match("xxx", t, 0)) Then
    MsgBox "pas trouvé"
Else
    MsgBox "trouvé"
End If
 

balou88

XLDnaute Nouveau
Re : Gestion des Erreur de la fonction "Match" avec "On error GoTo"

Merci Toto mais j'avoue que la solution de Pierrot ma(r)che nickel et me convient parfaitement!
Je l'avais essayé déjà mais sans doute avec une erreur de syntaxe puisque cela n'empêchait pas le problème...

Par contre juste pour mon information et ma culture VBesque,
Savez vous pourquoi le code passe par le "Err:" même si il n'y a pas d'erreur? Le On error GoTo, n'a donc pas plus d'interet que le On error Resume Next non?
 

balou88

XLDnaute Nouveau
Re : Gestion des Erreur de la fonction "Match" avec "On error GoTo"

Ben en gros mon utilisation c'était :

On error GoTo Err (en gros si match renvoie une erreur tu vas à la ligne qui commence par Err:)

Le probléme c'est que le programme passe par Err: et le prend en compte même si Match ne renvoie pas d'errreur...
Je sais pas si c'est trés claire....je n'ai peut être rien compris à l'utilisation de "On error GoTo"..
 

tototiti2008

XLDnaute Barbatruc
Re : Gestion des Erreur de la fonction "Match" avec "On error GoTo"

Re,
Bonjour balou, désolé pour la faute de frappe lors de mon salut...

mais j'avoue que la solution de Pierrot ma(r)che nickel et me convient parfaitement!

Mais la mienne aussi :)

l'avantage de la fonction "match", tu peux l'utiliser dans un tableau, pas "countif" à priori

Un point pour Match ;)
Mais si on manipule des plages, il semblerait que Countif soit moins gourmand (c'est pas moi qui le dit : Ce lien n'existe plus, Merci à Staple qui avait proposé cette lecture )
 

tototiti2008

XLDnaute Barbatruc
Re : Gestion des Erreur de la fonction "Match" avec "On error GoTo"

Re,

Pour le problème du On error goto Err, c'est parce qu'il est dans une boucle
Il fait une première fois une erreur, il va à Err
Pour qu'il n'aille plus à Err au prochain tour, il faut effacer l'erreur (Err.Clear), ou utiliser l'instuction Resume qui efface l'erreur automatiquement... à vérifier dans l'aide VBA sur la gestion des erreurs
Il me semble que les instructions End et Exit réinitialisent les erreurs aussi... mais encore faut-il avoir envie de sortir :)

Edit : Bonne remarque, Pierrot ;)
 

Pierrot93

XLDnaute Barbatruc
Re : Gestion des Erreur de la fonction "Match" avec "On error GoTo"

Re,

Un point pour Match
Mais si on manipule des plages, il semblerait que Countif soit moins gourmand (c'est pas moi qui le dit : Performances d'Excel*2010*: Conseils pour éliminer les obstacles aux performances, Merci à Staple qui avait proposé cette lecture là)

Allez, un point partout... :)
 

Discussions similaires