XL 2016 fonction search et on error qui bug au deuxième passage

BNJ-ANIOL

XLDnaute Nouveau
Bonjour la communauté,

J'ai créer une macro avec une fonction search qui me permet de catégoriser une ligne.
Je recherche si le mot clé qui correspond à la catégorie 1 se situe dans ma première cellule, s'il ne se trouve pas, alors une erreur se produit mais je gère cette erreur pour qu'il vienne vérifier la deuxième catégorie, s'il ne se trouve pas non plus, alors la troisième catégorie... une fois qu'il a trouvé la bonne catégorie, il passe à la ligne suivante et répéte le même système.
Ma macro gère qu'une seul fois l'erreur, à la seconde fois, il m'envoie boulé...


Sub test()
r = 2
Do While Cells(r, 1) <> "" 'vérifier si cellule est à analyser
j = 1 'réinitialisation des catégories
Cells(r, 2) = r
Do While (Cells(1, j + 2) <> "") 'vérifier si toute les catégories ont été testé
On Error GoTo er

a = WorksheetFunction.Search(Cells(1, j + 2), Cells(r, 1))
suite:
Cells(r, j + 2) = a 'mémorisation de la catégorie
j = j + 1
Loop
r = r + 1
Loopfonc

Exit Sub
er:
a = "erreur"
GoTo suite
End Sub
 

Pièces jointes

  • error_search.xlsm
    12.7 KB · Affichages: 2
Solution
Bonsoir @BNJ-ANIOL,
Ma macro gère qu'une seul fois l'erreur, à la seconde fois, il m'envoie boulé...

Il faut revoir la gestion des erreurs, le code est corrigé ci-dessous :

VB:
Sub test()
    Dim r As Long, j As Long, a As Variant
    r = 2
    Do While Cells(r, 1).Value <> "" ' Vérifie si la cellule doit être analysée
        j = 1 ' Réinitialisation des catégories
        Cells(r, 2).Value = r
        Do While Cells(1, j + 2).Value <> "" ' Vérifie si toutes les catégories ont été testées
            On Error Resume Next ' Pour éviter que l'erreur Search arrête l'exécution
            a = WorksheetFunction.Search(Cells(1, j + 2).Value, Cells(r, 1).Value)
            If Err.Number <> 0 Then ' Si une erreur se produit...

laurent950

XLDnaute Accro
Bonsoir @BNJ-ANIOL,
Ma macro gère qu'une seul fois l'erreur, à la seconde fois, il m'envoie boulé...

Il faut revoir la gestion des erreurs, le code est corrigé ci-dessous :

VB:
Sub test()
    Dim r As Long, j As Long, a As Variant
    r = 2
    Do While Cells(r, 1).Value <> "" ' Vérifie si la cellule doit être analysée
        j = 1 ' Réinitialisation des catégories
        Cells(r, 2).Value = r
        Do While Cells(1, j + 2).Value <> "" ' Vérifie si toutes les catégories ont été testées
            On Error Resume Next ' Pour éviter que l'erreur Search arrête l'exécution
            a = WorksheetFunction.Search(Cells(1, j + 2).Value, Cells(r, 1).Value)
            If Err.Number <> 0 Then ' Si une erreur se produit
                a = "erreur"
                Err.Clear ' Efface l'erreur pour éviter des répercussions
            End If
            On Error GoTo 0 ' Rétablit la gestion d'erreur normale
            Cells(r, j + 2).Value = IIf(IsError(a), "erreur", a) ' Écrit "erreur" si a est une erreur
            j = j + 1
        Loop
        r = r + 1
    Loop
End Sub
 

BNJ-ANIOL

XLDnaute Nouveau
Bonsoir @BNJ-ANIOL,


Il faut revoir la gestion des erreurs, le code est corrigé ci-dessous :

VB:
Sub test()
    Dim r As Long, j As Long, a As Variant
    r = 2
    Do While Cells(r, 1).Value <> "" ' Vérifie si la cellule doit être analysée
        j = 1 ' Réinitialisation des catégories
        Cells(r, 2).Value = r
        Do While Cells(1, j + 2).Value <> "" ' Vérifie si toutes les catégories ont été testées
            On Error Resume Next ' Pour éviter que l'erreur Search arrête l'exécution
            a = WorksheetFunction.Search(Cells(1, j + 2).Value, Cells(r, 1).Value)
            If Err.Number <> 0 Then ' Si une erreur se produit
                a = "erreur"
                Err.Clear ' Efface l'erreur pour éviter des répercussions
            End If
            On Error GoTo 0 ' Rétablit la gestion d'erreur normale
            Cells(r, j + 2).Value = IIf(IsError(a), "erreur", a) ' Écrit "erreur" si a est une erreur
            j = j + 1
        Loop
        r = r + 1
    Loop
End Sub
Merci beaucoup !
Je savais que ma syntaxe pour la gestion d'erreur n'était pas bonne.
J'avais pourtant chercher, mais je n'ai jamais trouver ce genre de syntaxe...

Je voulais juste revenir sur le "On error goto 0" , est-il vraiment utile (vu qu'on a réinitialisé l'erreur avant (err.clear)
Et pour la dernière ligne, j'ai simplement mis : "cells(r,j+2)=a
la question du "a" a déjà été traité avant, donc normalement, il ne devrait plus y avoir de soucis.
En tout cas, j'ai pas rencontré de problème lors du lancement de ma macro
 

laurent950

XLDnaute Accro
Bonjour @BNJ-ANIOL

Je voulais juste revenir sur le "On error goto 0" , est-il vraiment utile (vu qu'on a réinitialisé l'erreur avant (err.clear)
En réponse :
Bien que l'utilisation de Err.Clear efface l'erreur, l'instruction "On Error GoTo 0" garantit que le code retrouve son comportement normal de gestion d'erreurs. Cette approche permet de mieux contrôler les éventuelles erreurs survenues et d'éviter des effets inattendus sur le reste du code.
Cdt
 

Discussions similaires

Réponses
12
Affichages
563
Réponses
8
Affichages
657

Statistiques des forums

Discussions
312 206
Messages
2 086 220
Membres
103 158
dernier inscrit
laufin