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...)
En esperant une aide (précieuse) des grands maîtres du CODE VBA!!
Merci beaucoup!
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!