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 SubLa 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.
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 SubLa 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 SubPS : j'ai oublié de copier la ligne avec le set existe