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

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,
 
G

Guest

Guest
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+
 

Kiseki

XLDnaute Occasionnel
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.
 

Pierrot93

XLDnaute Barbatruc
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
@+
 
G

Guest

Guest
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+
 

Pierrot93

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

Re,

pas de problème chez moi, ce code ne renvoie pas d'erreur, valeur trouvée ou pas... Apriès, vu le message d'erreur, tout dépend où tu as placé ce code et comment l'utilises tu....
 

Dranreb

XLDnaute Barbatruc
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:

Kiseki

XLDnaute Occasionnel
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

  • BD.xlsm
    56.9 KB · Affichages: 93
  • BD.xlsm
    56.9 KB · Affichages: 92
  • BD.xlsm
    56.9 KB · Affichages: 87
  • BD.xls
    145 KB · Affichages: 90
  • BD.xls
    145 KB · Affichages: 111
  • BD.xls
    145 KB · Affichages: 101
Dernière édition:

Dranreb

XLDnaute Barbatruc
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.
À+
 

Kiseki

XLDnaute Occasionnel
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,
 

Dranreb

XLDnaute Barbatruc
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.

À+
 

Statistiques des forums

Discussions
312 199
Messages
2 086 158
Membres
103 139
dernier inscrit
Bidi