Lien hypertexte - Listbox
Bonjour
Je code actuellement une application qui permet de rechercher selon plusieurs critères dans une feuille excel des lignes.
les critères sont rentré par l'utilisateur dans un formulaire, j'affiche les lignes correspondante dans une Listbox. (dans le même formulaire que les critères).
La colonne 3 de ma listeBox (équivaut a la colonne D de la feuille) devrait être un lien hypertexte, or il y a que le texte en brut.
J'ai cherché pleins de choses qui revienne souvent au même endroit. Les solutions trouvé sont de sélectionner en fonction de la ligne de la listebox la ligne de la feuille excel et d'utiliser la cellule de la feuille.
Mon problème, je n'arrive pas a trouver l'algo qui fait correspondre mes lignes ListBox avec mes lignes excel de manière dynamique.
C'est à dire que selon mes recherche, un coup la ligne Listbox 1 correspondra à la ligne 1050 de la feuil1, un autre coup cette même ligne 1 correspondra à la ligne 60 etc.
En resumé, je cherche à pouvoir rendre ma colonne 3 de ma listebox clickable et pouvoir accéder à l'hyperlink (but du programme au final)
Voici le code permettant de remplir ma listebox :
Private Sub CommandButton1_Click() 'Bouton recherche
k = 0
Me.ListBox2.Clear
ListBox2.ColumnCount = 9
Me.ListBox2.ColumnWidths = "30;30;30;300;30;60;60;80;60"
If Me.TextBox1 = "" Then Me.TextBox1 = "*" 'Numero du doc
If Me.TextBox2 = "" Then Me.TextBox2 = "*" 'keyword
If Me.ListBox1 = "" Then Me.ListBox1 = "*" 'typeDoc
For i = 4 To 3000
If Cells(i, 4) Like "*" & Me.TextBox2 & "*" And Cells(i, 1) Like "*" & Me.ListBox1 & "*" And Cells(i, 2) Like "*" & Me.TextBox1 & "*" Then
Me.ListBox2.AddItem
Me.ListBox2.List(k, 0) = Cells(i, 1)
Me.ListBox2.List(k, 1) = Cells(i, 2)
Me.ListBox2.List(k, 2) = Cells(i, 3)
Me.ListBox2.List(k, 3) = Cells(i, 4)
Me.ListBox2.List(k, 4) = Cells(i, 5)
Me.ListBox2.List(k, 5) = Cells(i, 6)
Me.ListBox2.List(k, 6) = Cells(i, 7)
Me.ListBox2.List(k, 7) = Cells(i, 8)
Me.ListBox2.List(k, 8) = Cells(i, 9)
k = k + 1
End If
Next i
End SubMerci
Bonjour,
Quelques petits conseils préalables : tu gagnerais (et ton code également !) à commencer par apprendre à utiliser la feuille de propriétés (pour définir les valeurs par défaut des contrôles utilisés), à utiliser des boucles chaque fois que c'est possible (cela allège considérablement), éventuellement à te servir aussi de tableaux qui accroîtront fortement les possibilités...
Pour ce qui est de ton problème de lien, tu dois l'ancrer pour l'utiliser, donc tu choisis une cellule pour le faire (qui est n'importe où sur la feuille et n'a pas d'utilité) et tu lances à la sélection dans la ListBox quelque chose comme :
ActiveSheet.Hyperlinks.Add(Range("XX1"), "http:" & ListBox1.List(i, k)).Followi étant défini à partir de la valeur du ListIndex et k par la colonne de ta liste (ne pas oublier que ces index commencent à 0).
Cordialement.
Re !
Merci pour ta réponse, je vais rajouter des précisions et quelques questions !
Tout d'abord mes liens sont des accès a des fichiers (lien en relatif). La syntaxe des cellules comportant les liens sont de la forme :
=LIEN_HYPERTEXTE("Documents\document1.doc";"Nettoyage des salles")
Si je comprends bien ton code, il crée un lien hypertexte dans la cells XX1 qui prend la forme de http:// Nettoyage des salles
Et l'active avec le follow?
Question :
La démarche à suivre serait donc dans l'évènement click de ma listbox, récupérer la ligne correspondante dans le fichier excel, prendre la colonne D de cette ligne et follow le lien dedans avec les méthodes de Hyperlinks?
Merci
Evidemment, s'il ne s'agit pas d'un lien internet tu ne mets pas "http:" !
Tu remplaces éventuellement pas : "file:"...
Avec cette méthode tu n'utilises le lien figurant dans la feuille, tu en recrées un que tu actives immédiatement.
Si tu veux utiliser celui d'origine, il faudrait que tu configures un tableau des éléments à affecter à ta ListBox, parmi lesquels tu introduirais le numéro de ligne qui figureras donc dans une colonne de ta ListBox, information à partir de laquelle tu pourras pointer la cellule contenant le lien pour l'activer.
Cordialement.
J'ai relu ta réponse !
En fait si la valeur que tu récupères dans la ListBox n'est pas l'adresse du lien, tu n'as aucune chance de recréer le lien à partir de cet élément.
Donc : soit tu as un élément unique dans ta base de données qui te permet par recherche de retrouver la bonne ligne et le lien, soit il faut que tu introduises dans ta liste ListBox un élément permettant de l'obtenir (comme je l'ai dit, le plus simple est alors d'introduire le numéro de ligne).
NB: Dans la mesure où tu dis que ta ListBox a pour principal objectif d'activer des liens, c'est une question qui était à régler au niveau de la conception de ton projet, sans attendre d'être au milieu du gué...
Oui de plus en plus je me dis que l'idée d'utiliser la liste pour afficher le résultat de recherche n'est pas adapté aux besoins !
Si je ne trouve pas de solution d'ici la fin de semaine je changerai le concept : je copie toutes les lignes recherché tel quel dans une sheet "résultat" mais je trouve ça moins ergonomique pour l'utilisateur (c'est une application a but professionnel).
Donc sinon Oui j'ai une colonne donnant un identifiant unique. Dis moi si c'est le bon raisonnement s'il te plait
Dans l'évènement click de la list :
- Je récupère l'identifiant dans une variable id
- Je reparcours tout mon tableau excel
- Je selectionne la colonne D de la ligne correspondante à l'identifiant id
- J'utilise la formule hyperlinks
?
Merci
Oui, un identifiant unique tu peux le rechercher dans la base, cela te donnera la ligne, tu connais la colonne, donc tu atteins la cellule.
Il te suffit alors de l'activer : cellule.Hyperlinks(1).Follow
Je suis dessus depuis 1h30. Je comprends pas mon problème
Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim I As Integer
Dim idLigne As String
idLigne = Me.ListBox2.Column(1)
For I = 4 To 3000
If Cells(I, 2) Like idLigne Then
MsgBox Cells(I, 4).Formula
Cells(I, 4).Hyperlinks(1).Follow
End If
Next
End SubDonc je récupère bien la cellule que je veux, la msgbox m'indique qu'elle contient une formule sous la forme de LIEN_HYPERTEXTE...
Et l'erreur qui surgit :
Code 9 l'indice n'appartient pas à la sélection
Une idée du problème?
J'ai essayé avec
Cells(I, 4).Select
Selection.Hyperlinks(1).followMême erreur.
Avec ListBox2.Column(1) tu indiques la 2e colonne, mais pas la ligne, tu as donc un tableau avec toutes les valeurs de la colonne.
Bisare, lorsque j'affiche la valeur de ma cellule, j'obtiens bien le bon résultat.
Pour faire d'autre test j'ai carrément utilisé la syntaxe en statique comme ceci :
Sub liens()
Cells(2, 3).Hyperlinks(1).Follow
End SubLors de l'activation de cette macro, même résultat : "L'indice n'appartient pas à la sélection"
Cells n'est pas qualifié, es-tu sûr de tes indices ?
Ok, rectification mes indices étaient faux désolé..
Du coup ça m'inquiète encore plus sur mon code. Je pensais sélectionner la bonne cellule mais pas du tout.
Je le remet pour en discuter :
Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim I As Integer
Dim idLigne As String
idLigne = Me.ListBox2.Column(1)
For I = 4 To 3000
If Cells(I, 2) Like idLigne Then
MsgBox Cells(I, 4).Formula
Cells(I, 4).Hyperlinks(1).Follow
End If
Next
End SubJe pensais que Me.listBox2.column(1) récuperait la valeur dans la colonne 2 de LA selection. Du coup de LA ligne sélectionnée.
Mais non?
As tu une idée d 'évolution?
EDIT : Rectification :
Sub liens()
Cells(3, 4).Hyperlinks(1).Follow
End Sub
ne marche pas pour les liens entrée par la formule
=LIEN_HYPERTEXTE("Documents\document1.doc";"test")
Mais marche pour les liens entrées en mode clic droit liens hypertexte etc.
-_-
Merci de ton aide encore !
Oui ! La formule ne permet pas de l'activer ainsi
Bon ! Pour récupérer idLigne, il me semble cela devrait être ainsi :
With Me.listbox2
idLigne = .Column(1, .ListIndex)
End WithPour le lien, il te faut donc revenir à une recréation ailleurs après avoir récupéré l'adresse du lien dans la formule :
If Cells(I, 2) = idLigne Then 'Pouquoi Like si même valeur ?
adrLien = Cells(I, 2).Formula
adrLien = Mid(adrLien, InStr(adrLien, "(") + 2, InStr(adrLien, ",") - InStr(adrLien, "(") - 3)
ActiveSheet.Hyperlinks.Add(Cells(100, 1), adrLien).Follow
End IfA essayer. Cordialement.
Super ! Du coup j'ai les 2 solutions si quelqu'un rentre un liens en clic droit insérer lien hypertexte et si le lien est entré par la formule.
je poste le code final si quelqu'un le recherche plus tard
Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Integer
Dim idLigne As String
idLigne = Me.ListBox2.Column(1)
For i = 4 To 3000
If Cells(i, 2) = idLigne Then
adrLien = Cells(i, 4).Formula
On Error Resume Next
Cells(i, 4).Hyperlinks(1).Follow
adrLien = Mid(adrLien, InStr(adrLien, "(") + 2, InStr(adrLien, ",") - InStr(adrLien, "(") - 3)
ActiveSheet.Hyperlinks.Add(Cells(100, 1), adrLien).Follow
End If
Next
End SubDu coup le MeListBox2.Column renvoie qu'une seule valeur a priori étant donnée que la relation est exacte.
Merci pour ton aide
Bonne journée.
Ps : Comment on valide le topic ?