Erreur d'exécution '1004' pour un Range.Find

Bonjour,

Dans un UserForm, j'appelle la macro ci-dessous en appuyant sur un bouton :

1  : Sub Ajouter_DB(db As Worksheet, db_col As Integer, data As String, critere As String)
2  :    Dim db_lst_row As Integer
3  :    Dim critere_col As Integer
4  :    Dim critere_lst_row As Integer
5  :    If critere = "" Then
6  :    Else
7  :        If Range(critere).Find(what:=data, lookat:=xlWhole) Is Nothing Then
8  :            critere_col = Range(critere).Cells(2).Column
9  :            critere_lst_row = ws_critere.Cells(Rows.Count, critere_col).End(xlUp).row + 1
10 :            ws_critere.Cells(critere_lst_row, critere_col).Value = data
11 :        End If
12 :    End If
13 :    db_lst_row = db.Cells(Rows.Count, 1).End(xlUp).row + 1
14 :    db.Cells(db_lst_row, db_col).Value = data '
15 : End Sub

La macro récupère l'information data saisi dans une comboBox ou une textBoxe du UserForm.

Puis, dans un premier temps, il la compare à une liste de donnée se trouvant sur une feuille EXCEL : critere.

capt1

critere est le nom définie par une zone de la colonne par une formule. Par exemple, la zone matériau est définie par :

=DECALER(CRITERE!$B$1;1;0;NBVAL(CRITERE!$B$3:$B$1001)+1;1)

Si data se trouve dans la liste de donnée, la macro ne fait rien. Si data ne se trouve pas dans la liste, la macro l'ajoute sur la dernière ligne.

Enfin, dans un deuxième temps la data est écrite sur une autre feuille db, qui fait office de base de donnée.

Le problème est que lorsque je lance la macro, la ligne 7 s'allume et ce message d'erreur apparait :

Erreur d'exécution '1004' : La méthode 'Range' de l'objet '_Global' a échoué

Cependant, lorsque je retire la macro du UserForm et je la lance dans un Module comme ceci :

Sub macro1()
    Dim critere As String
    critere = "List_materiau"
    Dim db_lst_row As Integer
    Dim critere_col As Integer
    Dim critere_lst_row As Integer
    Dim data As String
    data = "INOX"
    If critere = "" Then
    Else
        If Range(critere).Find(what:=data, lookat:=xlWhole) Is Nothing Then 
            critere_col = Range(critere).Cells(2).Column
            critere_lst_row = ws_critere.Cells(Rows.Count, critere_col).End(xlUp).row + 1
            ws_critere.Cells(critere_lst_row, critere_col).Value = data
        End If
    End If
End Sub

La macro fonctionne !

Est-ce que quelqu'un aurait une idée de ce qui se passe ?

Merci d'avance

Bonjour,

Une règle fondamentale depuis un usf : préciser la parentalité des Range.

Bonjour,

Merci d'avoir répondu aussi rapidement,

Qu'est-ce que la parentalité des Range ?

Okay, j'ai renseigné le Worsheet auquel appartient ma liste de donnée.

La ligne 7 est maintenant :

If ws_critere.Range(critere).Find(what:=data, lookat:=xlWhole) Is Nothing Then 

ws_critere est le nom de mon Worksheet

Mais, maintement excel me dit :

Erreur d'exécution '1004' : La méthode 'Range' de l'objet 'Worksheet' a échoué

Bonjour,

critere doit correspondre à une référence de plage valide, par exemple A:A

Pour une aide plus pertinente, merci de joindre un fichier de démo avec l'intégralité du code qui pose pb, que l'on puisse le reproduire.

J'ai trouvé une solution.

J'ai décomposé ma macro en deux :

- une pour rechercher le critère

Sub Doublon(critere As String, donnee As String)
    Dim existe As Range
    Dim critere_col As Integer
    Dim critere_lst_row As Integer
    Set existe = Range(critere).Find(what:=donnee, LookAt:=xlWhole)
    If existe Is Nothing Then
        critere_col = Range(critere).Cells(1).Column
        critere_lst_row = ws_critere.Cells(Rows.Count, critere_col).End(xlUp).row + 1
        ws_critere.Cells(critere_lst_row, critere_col).Value = donnee
    End If
End Sub

- une pour ajouter les informations dans la base de donnée

Sub Ajouter_DB(db As Worksheet, db_col As Integer, data As String)
    Dim db_lst_row As Integer
    db_lst_row = db.Cells(Rows.Count, 1).End(xlUp).row + 1 
    db.Cells(db_lst_row, db_col).Value = data 
End Sub

PS : j'ai oublié de copier la ligne avec le set existe

Rechercher des sujets similaires à "erreur execution 1004 range find"