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

Bonjour.
j'ai essayé mais …
Alors pourquoi dans le classeur joint n'y est elle plus cette CbxRéf.List = RgTI.Columns(1).Value dans une Private Sub UserForm_Initialize ?
Le BtnOK ne servira plus pour l'instant. Le code devra être mis dans une CbxRéf_Change et il suffira d'y mettre
VB:
Ligne = CbxRéf.ListIndex + 1
Il n'y aura plus besoin de faire de recherche, le ComboBox l'aura déjà faite à votre place dans sa propriété List.

P.S Le reste a disparu du userform de votre dernier classeur joint, plus de TextBox, plus d'image où faire Image.Picture = LoadPicture(RgTI(Ligne, "F").Value). Pourquoi ?
 
Dernière édition:

jardibot

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

Honnêtement je crois je suis un peu perdu. J'essaye mais tout est nouveau pour moi.. Mais je veux apprendre et continuer

Je n'arrive plus a lancer userform via un bouton sur ma feuille excel:
Ceci est dans le module1:

Sub Lancer_appl_QuandClic()
UserForm1.Show
End Sub

A chaque essai error 424

Ensuite ceci est dans userform1:

Private Sub Cbxréf_Change() ici je sais pas ce que signifie _change
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 = Cbxréf.ListIndex + 1
If Err Then
Cbxréf.Value = Empty
Else
Genre = RgTI(Ligne, "D").Value
Cultivar = RgTI(Ligne, "E").Value
Cbxréf = Genre & " " & Cultivar ici je sais pas s'il faut mettre plutôt Tbxrép = genre & "" & Cultivar
End If
End Sub
Private Sub UserForm_Initialize() ici je sais pas ce que signifie userform initialize
Cbxréf.List = RgTI.Columns(1).Value
End Sub
Private Sub BtnQ_Click()
Unload Me
End Sub

Merci
 

Pièces jointes

  • TEST_CBXREF.xlsm
    65.8 KB · Affichages: 51
  • TEST_CBXREF.xlsm
    65.8 KB · Affichages: 58
  • TEST_CBXREF.xlsm
    65.8 KB · Affichages: 60

Dranreb

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

ici je sais pas ce que signifie _change
Toujours pareil: c'est une procédure de prise en charge d'évènement, donc sélectionner "CbxRéf" dans la liste de gauche (infobulle "Objet"), dans celle de droite (infobulle "Procédure") "Change" y figure, il suffit de le sélectionner pour que le modèle de procédure soit implanté. Cet évènement se produit bien évidemment quand le ComboBox change.

Relisez très attentivement et très lentement mon poste #9. Repassez sur chaque mot tant que vous n'avez pas compris, et si vous n'y arrivez vraiment pas demandez moi.
Relisez y "les deux larges listes déroulantes qui surmontent tout juste la fenêtre de code", en observant bien celles ci, jusqu'à ce qu'il soit définitivement imprimé dans votre esprit qu'elles ne sont pas là pour la décoration mais pour implanter des modèles prédéfinis de procédures, ou, accessoirement, en retrouver d'existantes.
Aussi déjà expliqué :
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.
Avec ça j'avais espéré que vous comprendriez de vous même qu'il fallait sélectionner "Userform" dans la liste de gauche, "Initialize" dans celle de droite et que vous comprendriez immédiatement à quoi servirait la procédure à développer dont la 1ère et la dernière instruction auraient été implantées par cette manœuvre.

Le code complet:
VB:
Option Explicit
Dim RgTI As Range ' Variable globale de type Range

Private Sub UserForm_Initialize()
Set RgTI = [TABLE_INDEX]
CbxRéf.List = RgTI.Columns(1).Value
End Sub

Private Sub CbxRéf_Change()
Dim Ligne As Long, Genre As String, Cultivar As String, RéfFic As String
If CbxRéf.ListIndex < 0 Then Exit Sub
Ligne = CbxRéf.ListIndex + 1
Genre = RgTI(Ligne, "D").Value
Cultivar = RgTI(Ligne, "E").Value
RéfFic = RgTI(Ligne, "F").Value
TbxRép.Text = Genre & " " & Cultivar
On Error Resume Next
Image1.Picture = LoadPicture(RéfFic)
End Sub

Private Sub BtnQ_Click()
Unload Me
End Sub

Attention, pour moi il manquait la bibliothèque Stdole, référence "OLE Automation", fichier C\WINDOWS\System32\stdole2.tlb pour que la fonction LoadPicture soit reconnue.
 
Dernière édition:

jardibot

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

Je suis débutant, j'ai bien vu et relu tout vos paragraphes, et bien vu les listes déroulantes au dessus du code que l'on écrit.

Je n'y serais pas arrivé.

Je viens de voir votre message, je vais le regarder à fond, et comprendre toutes étapes.

Je vous informe quand je l'aurais fait.

merci
 

jardibot

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

Voilà, j'ai lu votre fichier, en effet jamais j'aurais réussi.

Effectivement je vois maintenant l'utilité du combobox.
Comme vous me l'avez dit l'image ne fonctionne pas. Je vais paraître à nouveau comme un super débutant,

Vous disiez:
Attention, pour moi il manquait la bibliothèque Stdole, référence "OLE Automation", fichier C\WINDOWS\System32\stdole2.tlb pour que la fonction LoadPicture soit reconnue.

(je ne sais pas ce qu'est la bibliothèque Stdole)

ça veut dire qu'il faut mettre les photos à un emplacement bien défini dans l'ordinateur? j'utilise un mac..
le lien que j'ai mis dans mes cellules excel son un hypertexte renvoyant vers : File://localhost/Users//yann/Desktop/../Documents/IMAGE_EQUIPE/20145.jpg

Faut-il les mettre ailleurs? et est ce bien un lien hypertexte qu'il faut mettre dans excel?

par ailleurs que signifie ?

Option Explicit
Dim RgTI As Range ' Variable globale de type Range


a quoi sert-il?

Avec toutes mes questions, je dois vous ennuyer… désolé
 

Dranreb

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

"stdole", c'est le nom de bibliothèque qui vient s'inscrire dans la liste tout en haut à gauche (où il y a "<Toutes bibliothèque>") de l'explorateur d'objets (touche F2 pour l'afficher), une fois qu'on a installé le code contenu dans le fichier Stdole2.tlb.
Et pour l'installer, chercher et cocher "OLE Automation" dans la liste Références disponibles, menus Outils, Références… ou Alt+O puis Alt+R.
Oh là ! Un mac dites vous ? Je ne connais pas du tout. Le LoadPicture admet comme argument une référence de fichier. Et c'est donc ce qu'il doit y avoir dans les cellules d'où on les prend.

Option Explicit est une sécurité pour éviter de se tromper dans des noms de variables qu'on prétend utiliser et qui, dès lors, pour cela doivent toujours être déclarées.
Avant toute procédure, elle peut être suivie de déclarations de variables globales par Dim, Private ou Public. Globale ça veut dire qu'elles sont connues au moins dans tout le module, partagées et reprises par toutes ses procédures.
Ici ça permet de ne l'initialiser qu'une fois dans la UserForm_Initialize, et après elle est connue partout. Tandis que si elle est déclarée dans une procédure c'est une variable locale dans cette procédure. Elle est alors volatile: elle est réservée dans la pile au début de son exécution et n'existe plus une fois qu'elle est terminée.
 

jardibot

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

.. voilà j'ai trouvé et cliqué sur "OLE AUTOMATION" dans références disponibles.

je suis retourné dans explorateur d'objet, je vois bien l'onglet "stdole", en haut à gauche (où il y a "<Toutes bibliothèque>") , j'ai cliqué dessus..

Après je ne sais pas quoi faire? il n'y a pas de fichier appelé Stdole2.tlb.

Que dois-je faire? merci
 

Dranreb

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

Plus rien en principe: la fonction LoadPicture devrait à présent être reconnue. Chez moi je vois justement là que stdole a une classe SdtFunctions qui comprend 2 membres: LoadPicture et SavePicture. Et quand je sélectionne LoadPicture la description tout en bas se termine par: "Loads a picture from a file"
 

jardibot

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

Bonjour Dranreb

J'ai fait des essais à nouveau, j'utilise un ordinateur Apple, la fonction loadpicture est peut-être dite autrement sur les Apple?

Dans la bibliothèque 'Stdole', dans les classes j'ai : DISPPARAMS, EXCEPINFO, IFontdisp, IPictureDisp,OLE_TRISTAE, RECT, StdFont, StdPicture

Peut-etre ça pourrait vous aidez..? :) et trouver la fonction sur XL2013 avec un 'APPLE'

MERCI


J'ai essayé sur un ordinateur 'Windows', et dans la bibliothèque , il y a bien la fonction load.picture, j'ai lancé le code et tout à fonctionné comme vous l'avez dit.
 

Dranreb

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

Bonjour
Je n'ai pas RECT. J'ai tout le reste de ce que vous dites plus <globales>, IFontEventsDisp, StdFunctions et LoadPictureConstants.
Je pencherais plutôt pour l'hypothèse qu'elle s'appelle aussi LoadPicture sur Apple mais qu'elle est implantée ailleurs. Mais évidemment je n'en sais rien. À vous de chercher, je ne peux pas vous aider davantage.
 
Dernière édition:

jardibot

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

Bonjour Dranreb

Avant tout merci pour votre aide. Sur windows, ça fonctionne très bien.
Si d'autres questions sont possibles je m'avance.. hésitez pas à me dire si ça vous ennuie.

J'ai continué un peu les fonctions que je souhaite ajouter.

J'essaye de renseigner des données via l'userform via (plusieurs textbox) pour qu'elles renseignent des cellules de la feuille1(ici nommé LISTE_GENERAl) où les colonnes sont toutes renommées (CODE, ANNEE, GENRE, CULTIVAR…)

Option Explicit
Dim WS As Worksheet

Private Sub UserForm_Initialize()
Set WS = Sheets("LISTE_GENERAL")
Je pense qu'il manque quelque chose mais je sais pas quoi...
End Sub

Private Sub BtnVALIDER_Click()
Dim L As Integer
L = Sheets("LISTE_GENERAL").Range("a65536").End(xlUp).Row + 1
Range("CODE" & L).Value = TbxNCODE.Value CODE = ma colonne renommée mais ça fonctionne pas
'Range("GENRE" & L).Value = TbxGENRE.value'
'Range("ESPECE" & L).Value = TbxESP.Value'
'Range("VARIETE" & L).Value = TbxVAR.Value'
'Range("CULTIVAR" & L).Value = TbxCULTI.Value'

End Sub

Private Sub BtnQ_Click()
Unload UserForm3
End Sub

Private Sub BtnQ2_Click()
Unload UserForm3
UserForm2.Show

mon problème est que les colonnes renommées ne sont pas reconnues. Sauf quand je mets "A" au lieu de "CODE" mais quand j'ajoute une colonne dans mon fichier excel, et relance l'userform tout est décalé.

Merci beaucoup
 

Dranreb

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

Bonjour.

Comment voulez vous que je vous dise s'il manque quelque chose sans voir l'état actuel de votre Userform ?
s'il y a des ComboBox il faut garnir leurs List.

Personnellement je trouve un peu dommage d'utiliser une variable Worksheet pour désigner ensuite toujours la même feuille alors qu'on peut utiliser la constante Worksheet prédéfinie, qui figure dans l'explorateur de projet, dans la rubrique Microsoft Excel Objets, à gauche du nom Excel de la feuille correspondante rappelé entre parenthèses.

De plus vous loupez même la seule occasion d'utiliser cette variable comme expression workseet puis que vous faites toujours encore L = Sheets("LISTE_GENERAL").Range("a65536").End(xlUp). Row + 1 au lieu de L = WS.Range("a65536").End(xlUp). Row + 1

Si CODE est le nom d'une colonne entière la bonne syntaxe c'est Range("CODE").Rows(L).Value ou, plus court et clair
Code:
.Rows(L).Value
 
Dernière édition:

jardibot

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

Ah oui c'est mieux.

Voilà je vous envoie ce que j'ai fait.

J'ai ajouté des users forms, pour me permettre d'introduire des données dans ma feuille1(LISTE_GENERAL).
Il s'agit de l'userform3, en appuyant sur le bouton "valider", ça insère les données.

1- Par contre, après une saisie de données, les cases dans l'userform (3) ne s'efface pas pour refaire une nouvelle saisie. comment faire?
2- les saisies rentrées dans la feuille1(LISTE_GENERAL) s'ajoute bien à la suite mais n'intègre pas mon tableau général 'Nommé ensemble "Table_Index"). comment puis-je faire?
3- est-il possible qu'a chaque nouvelle saisie, les bordures s'affichent elles aussi sur toute la ligne de mon tableau (Table_Index)
4- Dans l'userform 1 vu ensemble, le combobox (cbxréf), peut-il permettre une saisie manuelle? C'est - à dire soit on utilise la liste déroulante soit on tape le code manuellement que l'on recherche. (car j'ai plus de 3000codes)

Je vous remercie de me suivre.
 

Pièces jointes

  • TEST_OK.xlsm
    73.7 KB · Affichages: 38
  • TEST_OK.xlsm
    73.7 KB · Affichages: 52
  • TEST_OK.xlsm
    73.7 KB · Affichages: 54

Dranreb

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

1) - Il faut affecter une chaine vide aux TextBox après l'écriture.
2) et 3) - En général je copie la dernière ligne existante puis l'insère devant elle même. J'utilise ensuite l'original ainsi repoussé d'une ligne vers le bas comme support de mes nouvelles donnée. Cela garantit la reconduite des formats, donc des bordures, mais aussi cela rectifie automatiquement en conséquence toutes les références qui se terminaient à l'ancienne dernière ligne, non seulement dans tout le classeur (plages nommées, formules, zone d'impression) mais même aussi dans une variable Range qui s'y référait dans du code.
4) - Mais bien sûr ! En doutiez vous tellement que vous n'avez même pas essayé ? À condition que ce soient des textes (les List garnis en numériques ou dates supportent mal la recherche d'après frappe), un ComboBox c'est fait avant tout pour y taper quelque chose. Le truc c'est qu'on peut s'arrêter de le taper quand ça a été trouvé, et sinon, mais plus rarement, finir par un choix dans la liste, alors affichée à partir d'une ligne contenant le début déjà tapé.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 082
Membres
103 458
dernier inscrit
Vulgaris workshop