Fonction Find et erreur 91

lombriiik

XLDnaute Nouveau
Bonjour à tous,

dans le cadre de mon programme, je suis amené à devoir chercher un numéro de ligne contenant dans une colonne un code. Pour ce faire, j'ai écrit ça :
Code:
Dim i, l As Integer
Dim l1 As Variant
Dim Code As String

    i = 2
    l = 17
    While i <= l
        Code = Sheets("Feuil1").Cells(i, 1).Value
        l1 = Sheets("Feuil2").Columns("A").Find(Code, LookAt:=xlWhole).Row ' Erreur 91 ici 
        On Error GoTo Suite
        Sheets("Feuil2").Rows(l1).Delete shift:=xlUp
Suite:
        i = i + 1
    Wend

Les 6 premières boucles se passent bien mais la 7ème plante tout avec une erreur 91 'Variable objet ou variable de bloc with non définié'.
J'ai fait un débogage pas à pas et la boucle s'exécute effectivement bien, une valeur code n'existe pas dans Feuil2, le programme saute la suppression de la ligne mais à la valeur de code suivante qui n'existe pas dans Feuil2, ça plante.

Auriez vous une idée par hasard grands maîtres ès Excel

Merci de votre aide
 

tototiti2008

XLDnaute Barbatruc
Re : Fonction Find et erreur 91

Bonjour lombriik,

Une gestion d'erreurs propre se termine par un resume, un Exit ou un End.
Maintenant, on peut éventuellement passer par des Err.Clear ou plus simplement,
ici :

Code:
    i = 2
    l = 17
    While i <= l
        Code = Sheets("Feuil1").Cells(i, 1).Value
On Error resume next
l1 = Sheets("Feuil2").Columns("A").Find(Code, LookAt:=xlWhole).Row
Sheets("Feuil2").Rows(l1).Delete shift:=xlUp
On error goto 0
        i = i + 1
    Wend
 

kjin

XLDnaute Barbatruc
Re : Fonction Find et erreur 91

Bonjour,
Je ne sais pas comment ça pouvait fonctionner, mais bon...
Code:
Sub Tata()
Dim i%, l%
Dim L1 As Range
Dim Code As String
    i = 2
    l = 17
    While i <= l
        Code = Sheets("Feuil1").Cells(i, 1).Value
        Set L1 = Sheets("Feuil2").Columns("A").Find(Code, LookAt:=xlWhole)
            If Not L1 Is Nothing Then
            L1.EntireRow.Delete
            End If
        i = i + 1
    Wend
End Sub
Ou
Code:
Sub Toto()
Dim i%
Dim L1 As Range
Dim Code As String
    For i = 2 To 17
        Code = Sheets("Feuil1").Cells(i, 1).Value
        Set L1 = Sheets("Feuil2").Columns("A").Find(Code, LookAt:=xlWhole)
            If Not L1 Is Nothing Then
            L1.EntireRow.Delete
            End If
    Next
End Sub
En supposant qu'il n'y a pas de doublons
A+
kjin
 

lombriiik

XLDnaute Nouveau
Re : Fonction Find et erreur 91

Merci Tototiti2008 et Kjin de vous être penchés sur mon problème. J'ai testé ta solution et elle semble marcher. Cependant, peux tu m'expliquer l'utilité du "On Error GoTo 0" stp ?

Kjin, peux tu être un peu plus précis dans ta critique de mon code stp ? Je débute en VBA et j'essaye de m'en sortir entre l'enregistreur de macro et ce forum alors je préfère des critiques plus détaillés afin de m'améliorer. J'ai déjà testé l'option "If Not L1 Is Nothing Then ..." mais j'avais toujours mon erreur 91 sur la ligne du dessus (le find). Par contre, tu utilises l'instruction "Set", peux tu m'expliquer la différence par rapport à mon code ?

Merci à vous
 

tototiti2008

XLDnaute Barbatruc
Re : Fonction Find et erreur 91

Bonjour à tous,

On error goto 0
signifie : si ça plante, tu plantes de nouveau normalement à partir de ce point.

Le problème de Find est que l'on est pas sûr qu'il va trouver une cellule correspondante. S'il ne trouve rien, il renvoie Nothing comme réponse à la place de la cellule.
en écrivant
l1 = Sheets("Feuil2").Columns("A").Find(Code, LookAt:=xlWhole).Row
tu demande le numéro de ligne de queque chose qui peut être Rien, donc : plantage.
ça n'est pas l1 (numéro de ligne) mais la cellule qu'il faut tester :

Set Cellule = Sheets("Feuil2").Columns("A").Find(Code, LookAt:=xlWhole)
if Not Cellule is Nothing then

un truc du genre, comme l'as fait Kjin

j'espère que ça eclaircit un peu les choses.
 

lombriiik

XLDnaute Nouveau
Re : Fonction Find et erreur 91

Merci de tes explication Tototiti2008, c'est maintenant beaucoup plus clair.

Si j'ai bien compris ton 'On Error goto 0", c'est le même esprit que

Code:
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True

pour effacer la feuille active sans avoir la confirmation à l'écran. Tu retire le contrôle des erreurs sur une ligne dangeureuse et tu le remet après, c'est ça ?

Le reste est aussi plus clair mais j'ai toujours des interrogations sur l'instruction SET. Je vois régulièrement des gens qui utilisent ça dans leur prog mais, dès que j'en met un quelque part dans mon prog, j'ai systématiquement une erreur :confused:
 

tototiti2008

XLDnaute Barbatruc
Re : Fonction Find et erreur 91

oui, tu as compris l'esprit du On error goto 0

Set est obligatoire pour les variables objets.

Si tu as une variable
Dim MaVariable

si tu veux lui affecter une valeur classique (Date, Texte, Numérique, Tableau...) pas besoin de Set

MaVariable = 2*3

si tu veux lui affecter un Objet (Cellule, Feuille, Classeur, Graphique...)

l'instruction Set est obligatoire

Set Mavariable = Activesheet
 

Discussions similaires

Statistiques des forums

Discussions
312 520
Messages
2 089 298
Membres
104 092
dernier inscrit
karbone57