Erreur de déclaration de variable
Bonjour à tous !
Je suis en train de rédiger le code VBA d'un UserForm sur Windows et j'ai pris l'habitude de tester si les variables déclarées fonctionnent bien au fur et à mesure du code. Pour cela je renvoie la valeur de la variable dans un MsgBox.
Voici le code qui me pose problème, pour lequel j'ai une "Erreur d'exécution '91': Variable objet ou variable de bloc With non définie" :
Private Sub CommandButton2_Click()
Dim myValue As String
myValue = CB1.Value + CB2.Value + CB3.Value + CB4.Value
Dim myFind As Range
Set myFind = Range("TableauSOURCE").Find(myValue).Offset(0, 1)
If Not myFind Is Nothing Then
MsgBox (myFind)
End If
End SubJe cherche myValue dans la 1ère colonne de mon TableauSOURCE et je fais afficher dans ma MsgBox la valeur située dans la colonne suivante. Or j'ai l'erreur qui remonte malgré plusieurs essais à changer les types, mettre des IF, etc...
Je sais que je déclare mal ma variable mais je ne trouve pas comment faire !
Merci beaucoup pour votre aide,
Patafoin
Bonjour,
Range est un "objet" pas une "valeur". Un objet Range (une ou des cellules) a de nombreuses propriétés en dehors de sa valeur. De plus utiliser () demande au code de l'évaluer et du coup j'imagine que ça plante.
Pour afficher des infos sur votre Range, vous pouvez faire comme ceci :
Private Sub CommandButton2_Click()
Dim myValue As String
myValue = CB1.Value + CB2.Value + CB3.Value + CB4.Value
Dim myFind As Range
Set myFind = Range("TableauSOURCE").Find(myValue).Offset(0, 1)
If Not myFind Is Nothing Then
MsgBox "Adresse : " & myFind.Address & " | Valeur : " & myFind.Value
End If
End SubBonjour,
Merci pour votre réponse. Hélas j'obtiens la même erreur et le débogueur identifie toujours la même ligne :
Set myFind = Range("TableauSOURCE").Find(myValue).Offset(0, 1)Pourtant le résultat de myValue est bien présent dans la première colonne de mon TableauSOURCE... Ce tableau est dans une autre feuille que celle où se trouve le bouton ActiveX qui exécute l'UF, mais ça ne change rien même si je rend active la bonne feuille avant de faire le Range et j'obtiens aussi l'erreur.
Merci,
Patafoin
ah oui excusez moi, je n'ai pas pris en compte le fait que votre find était probablement incorrect.
Private Sub CommandButton2_Click()
Dim myValue As String
myValue = CB1.Value + CB2.Value + CB3.Value + CB4.Value
Dim myFind As Range
Set myFind = Range("TableauSOURCE").Find(myValue)
If Not myFind Is Nothing Then
MsgBox "Adresse : " & myFind.Offset(0, 1).Address & " | Valeur : " & myFind.Offset(0, 1).Value
Else
MsgBox "Rien trouvé"
End If
End SubSi ce sub vous renvoie "rien trouvé" alors votre find ne fonctionne pas. Mais sans le fichier correspondant impossible de vous aider davantage. Prenez le temps de lire les autres paramètres de find Range.Find method (Excel) | Microsoft Learn. Pour info Excel se "rappelle" des paramètres précédents et si pour une raison X ou Y vous aviez mis autre chose que ceux par défaut, ça peut etre une raison.
Edit : pour info les Value des combobox sont du texte. Donc CB1.Value+CB2.Value vous fait une concaténation pas une somme (en VBA "1" + "2" = "12" pas "3", utilisez plutot "&" pour la concaténation de texte que "+" qui est ambivalent)
Effectivement le fichier étant déjà assez complet, je n'ai pas pris le temps de refaire un fichier Test pour que vous ayez le cas de figure exact...
Merci pour l'info des Value des ComboBox, effectivement je souhaite une concaténation, donc le "&" plutôt que le "+" rend l'écriture plus propre.
J'ai finalement trouvé grâce à votre post et en lisant bien un exemple de la méthode Excel :
J'ai modifié mon code comme ceci et cela fonctionne !
Private Sub CommandButton2_Click()
Dim myValue As String
myValue = CB1.Value & CB2.Value & CB3.Value & CB4.Value
Dim myFind As Range
With Worksheets("SOURCE").Range("TableauSOURCE")
Set myFind = .Find(myValue, LookIn:=xlValues)
If Not myFind Is Nothing Then
'MsgBox "Adresse : " & myFind.Offset(0, 1).Address & " | Valeur : " & myFind.Offset(0, 1).Value
Else
MsgBox "Rien trouvé"
End If
End With
End SubMerci beaucoup !
A bientôt,
Patafoin
Ah top, ce devait être réglé sur un autre paramètre ! Content que vous ayez résolu.
Bonne fin de journée
EDIT : on me souffle dans l'oreillette un autre point : dans l'état, votre code recherche dans tout le tableau. Pour ne rechercher que dans la 1e colonne, écrivez plutôt ceci
Set myFind = Range("TableauSOURCE").ListObject.Listcolumns(1).DataBodyRange.Find(myValue, LookIn:=xlValues)Merci pour la précision, ça complète le niveau basique que j'ai en VBA !
A bientôt,
Patafoin