retrouver une valeur en fonction d'une autre VBA

jardibot

XLDnaute Junior
Bonjour,

Voilà je débute en VBA, je fais de petits exercices, pour m'améliorer.
C'est vraiment le début et un peu d'aide pourrait m'encourager.

J'ai essayé de taper une VBA me permettant de taper une référence dans une cellule. Ici ANC3 (cellule en jaune G4).
Quand je lance mon test (en cliquant sur le bouton "lancer le test"), je souhaite que "le nom de genre + le nom de cultivar " qui correspondent à cette référence (référence qui doit être tester dans la colonne "code")

Si la référence est trouvée dans la colonne "code" alors "le genre + le cultivar" correspondant s'affiche dans une boîte de dialogue.

Si la référence ne correspond à rien alors la référence en cellule "G4" s'efface

Merci beaucoup pour votre aide
 

Pièces jointes

  • TEST1.xlsm
    61.4 KB · Affichages: 58
  • TEST1.xlsm
    61.4 KB · Affichages: 69
  • TEST1.xlsm
    61.4 KB · Affichages: 72
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : retrouver une valeur en fonction d'une autre VBA

Bonsoir.

Comme ça par exemple :
VB:
Sub Variables()
Dim RgTI As Range, Reference As String, Ligne As Long, Genre As String, Cultivar As String
Set RgTI = [TABLE_INDEX]
Reference = [G4].Value
On Error Resume Next
Ligne = WorksheetFunction.Match(Reference, RgTI.Columns(1), 0)
If Err Then
    [G4].Value = Empty
Else
    Genre = RgTI(Ligne, "D").Value
    Cultivar = RgTI(Ligne, "E").Value
    MsgBox Genre & " " & Cultivar
    End If
End Sub
 

laetitia90

XLDnaute Barbatruc
Re : retrouver une valeur en fonction d'une autre VBA

bonjour jardibot Dranreb
on peut utiliser FIND eventuellement

Code:
Dim a As Range
 Set a = [a:a].Find(What:=[G4].Value, LookIn:=xlValues, LookAt:=xlWhole)
 If Not a Is Nothing Then MsgBox Cells(a.Row, 4) & " " & Cells(a.Row, 5) Else [G4] = ""
 

jardibot

XLDnaute Junior
Re : retrouver une valeur en fonction d'une autre VBA

Bonsoir Danreb!!

C'est exactement ce que je souhaitais réussir. Merci beaucoup!!

Je débute et j'essaye de comprendre.. Je voulais savoir si tu peux juste m'expliquer un peu la formule.

savoir ce que veux dire RgTI as Range, le mot .Value, On error resume Next, Function.Match (reference, RGTI.Columns(1),0)

GRAND MERCI

Sub Variables()
Dim RgTI As Range, Reference As String, Ligne As Long, Genre As String, Cultivar As String
Set RgTI = [TABLE_INDEX]
Reference = [G4].Value
On Error Resume Next
Ligne = WorksheetFunction.Match(Reference, RgTI.Columns(1), 0)
If Err Then
[G4].Value = Empty
Else
Genre = RgTI(Ligne, "D").Value
Cultivar = RgTI(Ligne, "E").Value
MsgBox Genre & " " & Cultivar
End
 

Dranreb

XLDnaute Barbatruc
Re : retrouver une valeur en fonction d'une autre VBA

RgTI est un nom de variable de mon crû, Range un type de donnée. De donnée objet en l'occurrence, puisque VBA est un langage orienté objets. Un type d'objet est toujours défini par un module de classe. Le plus souvent il est dans une bibliothèque fournie, ici la bibliothèque Excel. Un objet peut posséder des choses Public, donc visibles du module utilisateur de l'objet. En gros les variables sont appelées des propriétés et les procédures des méthodes.
Value est une propriété de l'objet Range qui représente la valeur de la cellule ou du groupe de cellules que le Range représente.
On Error Resume Next est une instruction qui demande à poursuivre l'exécution même si une erreur se produit ensuite.
Match est une méthode de l'objet WorksheetFunction qui regroupe les fonctions de feuilles de calcul. C'est la EQUIV en l'occurrence.

Et les crochet droits sont un moyen d'appeler la méthode Evaluate de l'objet Apllication ou Worksheet, lorsque l'expression est fixe. Elle renvoie le plus souvent un objet Range.
 
Dernière édition:

jardibot

XLDnaute Junior
Re : retrouver une valeur en fonction d'une autre VBA

Merci encore Dranreb pour tes explications.

Si une question supplémentaire ne t'ennuie pas. (dis le moi.. sinon, je comprendrais) !!!

Dans ta formule, au lieu de rentrer une référence dans une cellule en [G4]

J'aurais aimé qu'une boite de dialogue s'ouvre au début de la procédure, me demande de rentrer une référence, après avoir cliqué sur ok, la suite de la procédure que vous avez créé se lance.

Est ce qu'on pourrait avoir la réponse 'Genre & cultivar" dans cette même boite de dialogue. Et faire une boucle, ainsi je peux tester plusieurs références sans fermer la boite de dialogue.

Quand je souhaite terminer je clique sur terminer (je quitte la boucle et retourne sur ma feuille excel)

Quand la référence est pas bonne, la boite de dialogue indique " référence invalide" et je reviens au début.

ça fait beaucoup.. dans tout les cas un grand merci
un jardinier :)
 

Dranreb

XLDnaute Barbatruc
Re : retrouver une valeur en fonction d'une autre VBA

Bonjour.
Ça ne m'ennuie pas.
C'est tout à fait possible et classique. On passe là de l'apéritif au hors d’œuvre.
Mais pour moi il est exclut d'embrayer sur la suite déjà programmée car on va utiliser un contrôle déjà doté d'une capacité de recherche: le ComboBox. Il est désigné à tort en français "Zone de liste modifiable" au lieu de "Zone de texte munie d'une liste".
Mais d'abord faites Insersion, Userform…
Un conseil: Renommez vos contrôles de façon mnémonique: c'est plus facile de s'y retrouver après. Par exemple: ComboBox1 devient CbxRéf et CommandButton1 devient BtnOK.
 
Dernière édition:

jardibot

XLDnaute Junior
Re : retrouver une valeur en fonction d'une autre VBA

Le jardinier à nouveau..

J'avoue ne pas savoir trop que faire après avoir créer un userform, créer un combobox et la commandbutton

Je ne sais pas comment les associer avec votre procédure et surtout qui va avec quoi…

Plus de détails est-il possible? j'ai soif d'apprendre aussi :)

Merci pour votre aide.
 

Dranreb

XLDnaute Barbatruc
Re : retrouver une valeur en fonction d'une autre VBA

Bonjour.
Il y a une chose importante dont je ne vous ai encore pas parlé, en dehors des propriétés et des méthodes, à propos des objets: ils peuvent décréter des évènements.
Un dispositif très pratique est à votre disposition pour faciliter l'implantation des modèles de procédures propres à leur prise en charge. Ce sont les deux larges listes déroulantes qui surmontent tout juste la fenêtre de code. Celle de gauche "Objet" (initialement sur "(Général)" souvent) montre tous les objets connus au stade où en est votre programmation. Lorsque vous en sélectionnez un, cela installe un modèle de procédure pour le 1er évènement prévu pour cet objet. Celle de droite "Procédure" (initialement sur "(Déclarations)" souvent) montre toutes les autre procédures possibles pour l'objet sélectionné dans la liste Objet.
Bien qu'il ne soit pas lui même un objet de type Userform (car il est en fait son propre type), un Userform a toujours comme cœur un objet encapsulé de type et nom "Userform". Son évènement "Initialize" est idéal pour fixer les List des ComboBox. Il se déclenche lors du chargement en mémoire de l'Userform.
À vous de jouer
À +
 
Dernière édition:

jardibot

XLDnaute Junior
Re : retrouver une valeur en fonction d'une autre VBA

Bonsoir :)

J'ai passé beaucoup de temps car je suis novice. J'ai appris énormément en cherchant mais j'ai réussi à faire quelque chose et ça marche :)

J'ai cela dit une question, quand je lance mon application, à l'ouverture, une référence est toujours en mémoire "ANC3"
Je n'arrive pas à avoir le textbox1 vide dès l'ouverture de l'application. J'ai mis le fichier en pièce jointe.

Pouvez-vous regardez et me dire comment faire?

Bonne soirée
 

Pièces jointes

  • TEST2.xlsm
    65.6 KB · Affichages: 51
  • TEST2.xlsm
    65.6 KB · Affichages: 60
  • TEST2.xlsm
    65.6 KB · Affichages: 59

jardibot

XLDnaute Junior
Re : retrouver une valeur en fonction d'une autre VBA

Re bonsoir

Je viens vers vous à nouveau. Je vous embête plus après.

J'ai bien réussi les applications précédentes. Vos explications m'ont bien aidées. Forcément, on veut toujours un petit quelque chose en plus…

Je souhaite rajouter une image dans mon "userform" correspondant à la référence que je tape. Toutes mes photos sont stockées dans "mes documents" en petites définitions. Une référence = une photo = un lien hypertexte

Tout comme Genre & Cultivar , je souhaite que la photo correspondante s'affiche dans "image" de mon userform

le code actuel est celui-ci:
Private Sub CommandButton1_Click()
Dim RgTI As Range, Reference As String, Ligne As Long, Genre As String, Cultivar As String
Set RgTI = [TABLE_INDEX]
Reference = [TextBox1].Value
On Error Resume Next
Ligne = WorksheetFunction.Match(Reference, RgTI.Columns(1), 0)
If Err Then
[TextBox1].Value = Empty
Label2.Visible = True
Else
Label2.Visible = False
Genre = RgTI(Ligne, "D").Value
Cultivar = RgTI(Ligne, "E").Value
[TextBox2] = Genre & " " & Cultivar
End If
End Sub
Private Sub CommandButton2_Click()
Unload Userform10
End Sub

Private Sub CommandButton3_Click()
[TextBox1].Value = Empty
[TextBox2].Value = Empty
Label2.Visible = False
End Sub

Bonne soirée
 

Pièces jointes

  • TEST2.xlsm
    56.7 KB · Affichages: 55
  • TEST2.xlsm
    56.7 KB · Affichages: 51
  • TEST2.xlsm
    56.7 KB · Affichages: 47

Dranreb

XLDnaute Barbatruc
Re : retrouver une valeur en fonction d'une autre VBA

C'est parce que, dans la fenêtre de propriétés, vous avez mis "ANC3" dans la propriété Text de ce contrôle, qui est un TextBox au lieu d'un ComboBox contrairement à ce qu'on avait prévu de faire, et qu'il n'y a pas de procédure à l'initialisation de l'Userform susceptible de l'effacer.
Il n'est pas utile de mettre les noms de contrôles entre crochets droits. Je suis même étonné que ça ne plante pas ! Je vous ai dit que les crochets droits étaient réservés aux expressions fixes dont on veut demander à Excel et non à VBA de dégager la signification.
[TABLE_INDEX] est un raccourci pour Application.Evaluate("TABLE_INDEX"). Comme c'est un nom défini dans le classeur qui se réfère à une adresse de plage, c'est équivalent à son tour à Application.Range("TABLE_INDEX"), expression qui renvoie l'objet Range défini par ce nom.
Edit: je répondais là au poste précédent. Une chose après l'autre, voulez vous ? Remettez vous dans la ligne de ce qu'on avait prévu de faire: Affectez RgTI.Columns(1).Value à la propriété List d'un ComboBox dans une Private Sub UserForm_Initialize dont il avait été question, indirectement, au poste #9 (je suis déçu que vous n'ayez rien compris de tout ça, ou pas fait de rapprochements)

Encore une info au sujet de Unload Userform10: utilisez plutôt le mot clé Me pour désigner l'objet auquel est attaché le code.

Rappel de conseil: Renommez vos contrôles de façon mnémonique: c'est plus facile de s'y retrouver pendant le développement et aussi après, à la maintenance et à l'évolution.
 
Dernière édition:

jardibot

XLDnaute Junior
Re : retrouver une valeur en fonction d'une autre VBA

J'ai fait les corrections pour les crochets et le ANC3. En effet , je comprends mieux.

Oui, je vais refaire la procédure dans un combobox. Je m'y mets..

Une chose avant l'autre vous avez raison.
 
Dernière édition:

jardibot

XLDnaute Junior
Re : retrouver une valeur en fonction d'une autre VBA

Voilà j'ai utilisé un comboBox. ça fonctionne, et s'initialise quand je reclik sur "btnok"

(ce sont mes 2 premiers jours avec les vba..)

Vous m'avez dit d' Affectez RgTI.Columns(1).Value à la propriété List d'un ComboBox dans une Private Sub UserForm_Initialize,

je ne vois pas trop… j'ai essayé mais après le btnOk ne fonctionne plus..

Pour l'instant , voilà ce que ça donne, est-ce mieux? merci

Private Sub BtnOk_Click()
Dim RgTI As Range, Reference As String, Ligne As Long, Genre As String, Cultivar As String
Set RgTI = [TABLE_INDEX]
Reference = Cbxréf.Value
On Error Resume Next
Ligne = WorksheetFunction.Match(Reference, RgTI.Columns(1), 0)
If Err Then
Cbxréf.Value = Empty
Else
Genre = RgTI(Ligne, "D").Value
Cultivar = RgTI(Ligne, "E").Value
Cbxréf = Genre & " " & Cultivar
End If
End Sub
Private Sub BtnQ_Click()
Unload Me
End Sub
 

Pièces jointes

  • TEST_CBXREF.xlsm
    62.4 KB · Affichages: 51
  • TEST_CBXREF.xlsm
    62.4 KB · Affichages: 56
  • TEST_CBXREF.xlsm
    62.4 KB · Affichages: 62

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 349
Membres
102 869
dernier inscrit
radyreth