[VBA] Gérer une erreur sur match() non trouvée

  • Initiateur de la discussion Initiateur de la discussion Kiseki
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Kiseki

XLDnaute Occasionnel
Bonjour,

Je souhaiterai faire fonctionner ce contrôle d'erreur :

VB:
On Error GoTo newcat
    
    index_cat = WorksheetFunction.Match(Sheets("Ajout").Range("D14"), fd.Range("A1:A200"), 0) 'Index de la catégorie
       
    If fd.Cells(index_cat, 1).End(xlDown) <> "" Then
        l_inc = fd.Cells(index_cat, 1).End(xlDown).Row 'Index de la ligne qui reçevra les nouvelles données
    
        'Ajout de la ligne d'accueil
        fd.Cells(index_cat, 1).End(xlDown).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End If
    
newcat:

Mais la recherche par match() s'il ne trouve rien n'est pas prise comme une erreur.

Je pense qu'avant j’utilisai find et ça fonctionnai, je ne sait pas la quelle est plus efficace mais j'aimerai savoir gérer ce genre de soucis.



Merci,
 
Re : [VBA] Gérer une erreur sur match() non trouvée

Bonjour,


Range("B:B3").Find = méthode VBA
Match = fonction de feuille de calcul-< retourne donc un valeur d'erreur de fonction de calcul #NA
Code:
Dim Resultat As Variant
Resultat = Application.Match(truc, PalgeCellules, 0)
If IsError(Resultat) Then
    'Pas trouvé
Else
    'Trouvé
End If

A+
 
Re : [VBA] Gérer une erreur sur match() non trouvée

Bonjour Hasco,


Merci mais il bloc sur la ligne qui définis index_cat.

VB:
'Déclaration des variables
    
    Dim index_cat As Byte, l_inc As Byte
    

'Ligne recevant les nouvelles données
    
On Error GoTo newcat
    
    'index_cat = WorksheetFunction.Match(Sheets("Ajout").Range("D14"), fd.Range("A1:A200"), 0) 'Index de la catégorie
    index_cat = fd.Range("A1:A200").Find(Sheets("Ajout").Range("D14"), LookIn:=xlValues, lookat:=xlWhole).Row 'Ligne de la catégorie
    Debug.Print index_cat
       
    If fd.Cells(index_cat, 1).End(xlDown) <> "" Then
        l_inc = fd.Cells(index_cat, 1).End(xlDown).Row 'Index de la ligne qui reçevra les nouvelles données
    
        'Ajout de la ligne d'accueil
        fd.Cells(index_cat, 1).End(xlDown).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End If
    
newcat:
    If l_inc = 0 Then
        l_inc = fd.Cells(255, 2).End(xlUp).Offset(1).Row 'Index de la ligne qui reçevra les nouvelles données
    End If


Le code fonctionne très bien si la valeur à trouver existe, sinon il bloque sur l'erreur, que ce soit avec match ou find, pourtant je lui indique clairement qu'en cas d'erreur il aille à une étiquette.


Vu que l'erreur est en définissant la variable je ne peux pas tester celle-ci juste après car elle ne sera pas exécutée.

Si je teste directement la ligne faudrait l'écrire deux fois.
 
Re : [VBA] Gérer une erreur sur match() non trouvée

Bonjour Kiseki, Hasco🙂

exemple d'utilisation de la méthode "find" qui ne renvoie pas de message d'erreur ... A adapter à ton projet
Code:
Set x = Range("2:2").Find(Date, , xlValues, xlWhole, , , False)
If Not x Is Nothing Then MsgBox "la date du jour est en " & x.Address
bon après midi
@+
 
Re : [VBA] Gérer une erreur sur match() non trouvée

Re,

Déclarer x

Je sens qu'on va tourner en rond. D'abord un code avec Match, puis un autre avec Find, et après...?



Un fichier exemple serait le bienvenu.

A+
 
Re : [VBA] Gérer une erreur sur match() non trouvée

Bonjour.
Le code fonctionne très bien si la valeur à trouver existe, sinon il bloque sur l'erreur, que ce soit avec match ou find, pourtant je lui indique clairement qu'en cas d'erreur il aille à une étiquette.
Oui mais il n'y ira à nouveau une autre fois qu'à condituion d'avoir exécuté une instruction Resume ! Important ça !

Mais la recherche par match() s'il ne trouve rien n'est pas prise comme une erreur.
Si je pense qu'elle renvoit alors toujours une valeur d'erreur. ... dont l'affectation à un variant ne provoque peut être pas d'erreur d'éxécution, je ne sais pas moi: je déclare toujours As Long les variables devant recevoir ce résultat.

Cordialement.
 
Dernière édition:
Re : [VBA] Gérer une erreur sur match() non trouvée

Très bien.

Je n'utilise que des étiquettes, resume n'est pas utiliser, si ?

Et si je le relance avec un mot qui existe il fonctionne bien, donc j'en doute un peu.


Je déclare tout aussi, as byte même quand je suis sûr que ça n’excède pas 255.


Merci,
 

Pièces jointes

Dernière édition:
Re : [VBA] Gérer une erreur sur match() non trouvée

Je maintiens: On Error Goto n'est pas fait pour sauter un groupe d'instruction si une erreur se produit, mais pour passer la main à un groupe d'instructions gestionnaire de l'erreur qui doit obligatoirement se terminer par un Resume pour reprendre le cours normal de l'exécution. Si une erreur se produit pendant la gestion d'une erreur ça plante toujours.
Utilisez plutôt: On Error Resume Next
et testez l'objet Err.
À+
 
Re : [VBA] Gérer une erreur sur match() non trouvée

Bonjour à vous,

Même de la sorte :

VB:
On Error Resume Next
    
    'index_cat = WorksheetFunction.Match(Sheets("Ajout").Range("D14"), fd.Range("A1:A200"), 0) 'Index de la catégorie
    index_cat = fd.Range("A1:A200").Find(Sheets("Ajout").Range("D14"), LookIn:=xlValues, lookat:=xlWhole).Row 'Ligne de la catégorie

On Error GoTo 0

    Debug.Print index_cat

    If Not index_cat Is Nothing And fd.Cells(index_cat, 1).End(xlDown) <> "" Then
        l_inc = fd.Cells(index_cat, 1).End(xlDown).Row 'Index de la ligne qui reçevra les nouvelles données
    
        'Ajout de la ligne d'accueil
        fd.Cells(index_cat, 1).End(xlDown).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End If


    If l_inc = 0 Then
        l_inc = fd.Cells(255, 2).End(xlUp).Offset(1).Row 'Index de la ligne qui reçevra les nouvelles données
    End If

La première utilisation (index_cat as byte) me donne une incompatibilité de type.

La seconde tel quel un autre soucis (alors qu'il devrait passer la ligne avec on error resume next).




Excuser moi mais pourriez-vous m'aider pour la gestion des erreurs svp ?

Du premier : 'Stop si déjà existant
Et du second : 'Ligne recevant les nouvelles données



Car je patauge.



Merci,
 
Re : [VBA] Gérer une erreur sur match() non trouvée

Bonjour
La première utilisation (index_cat as byte) me donne une incompatibilité de type.
C'est normal, la méthode Find renvoit une plage et pas un nombre.
Mais ça ne devrait pas planter l'exécution avec un On Error Resume Next devant,
à moins que vous n'ayez oublier d'enlever le On Error GoTo suite un peu plus haut
et qu'il est en train de tourner en mode de gestion d'erreur.

À+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour