Clique Listbox vers cellules

Bonjour à tous,

Ce sujet à déjà été traité de clique vers une cellule, mais je ne trouve rien qui correspond à mon fichier existant.

Étant débutant, j'avais fais la demande sur ce forum et U. Milité m'avais dis d'ajouter les lignes suivantes à mon code.

Private Sub ListBox1_Click()
    ligne = Application.Match(ListBox1.List(ListBox1.ListIndex), [D:D], 0)
    If Not IsError(ligne) Then ActiveWindow.ScrollRow = ligne
End Sub

Mais aujourd'hui mon fichier à évolué et ma listbox affiche le résultat de deux colonnes, mais quand je clique dans celle-ci plus rien ne ce passe.

C'était tellement pratique que j'aimerais avoir un peu de votre aide pour remettre cela en place.

Voici mon code actuel et vous trouverez un modèle de mon fichier ci dessous :

Option Compare Text

Private Sub ListBox1_Click()
    ligne = Application.Match(ListBox1.List(ListBox1.ListIndex), [C:D], 0)
    If Not IsError(ligne) Then ActiveWindow.ScrollRow = ligne
End Sub
Private Sub TextBox1_Change()

    Application.ScreenUpdating = False

    Range("A12:J20000").Interior.ColorIndex = 2
    ListBox1.Clear

    If TextBox1 <> "" Then
        For ligne = 12 To 20000
            For colonne = 3 To 4
                If Cells(ligne, colonne) Like "*" & TextBox1 & "*" Then
                    Cells(ligne, colonne).Interior.ColorIndex = 6
                    ListBox1.AddItem Cells(ligne, colonne)

                End If
            Next
        Next
    End If

End Sub

Merci d'avance de vos réponses.

36copie-export.zip (131.97 Ko)

Bonsoir,

La solution proposée dans le contexte initial ne peut pas simplement être transposée et adaptée "à la grosse louche": la fonction MATCH est simplement la traduction en VBA de la fonction de feuille de calcul EQUIV ... celle-ci ne saurait en aucun cas faire une recherche dans deux colonnes !

Si la structure de ton fichier change, il faut trouver, le plus souvent une solution différente! On pourrait imaginer (si j'ai bien compris!?) de faire passer à 2 le nombre de colonnes de ta ListBox et de stocker, dans la seconde colonne, le n° de ligne en plus du libellé qui resterait dans la première colonne. De cette manière, au clik sur un item de la ListBox, on lirait simplement le chiffre stocké en colonne 2 et on obtiendrait le n° de ligne correspondant.

... Tu verras si la chose t’intéresse.

Bonjour,

Merci de ton explication, je comprends mieux pourquoi j'arrivais pas à modifier tous cela.

Ma recherche actuel donne bien le résultat de ma colonne C et D dans ma listbox.

Et si j'ai compris dans celle-ci on afficherait le numéro de ligne afin de pouvoir créer le lien pour le clic.

Ton idée à l'air plutôt intéressante !

Bonjour,

Je manque de temps, donc j'ai bricolé un truc vite fait, sur le temps de midi, au départ de ton fichier. Il y aura donc sans doute des choses à peaufiner (ou des erreurs!?)

Je te laisse le soin de tester, mais aussi de chercher à comprendre. Je ne pourrai pas repasser par ici avant quelques heures, j'en ai peur

Bonjour,

Merci pour ton bricolage U. Milité, j'aimerais bien savoir bricoler !

J'avais bien un message d'erreur au départ mais vite résolu.

De plus esthétiquement je n'ai plus le numéro de ligne dans ma listbox.

Mais que le résultat soit dans la colonne C ou B, cela remonte bien la ligne.

Merci encore à toi U. Milité

Bonsoir,

Ravi de savoir que ça fonctionne, mais s'il y avait un "bug", le mieux serait de préciser lequel (et comment tu l'as résolu!?). Ceci permettrait à d'autres qui passeraient ici de savoir ce qu'il en est: j'ai testé avant de déposer le fichier et re-testé ce soir, mais je ne sais pas où tu as rencontré un souci

Petite question : peut on intégrer cette forme de recherche dans un userform ? et en plus il devrait chercher dans une liste qui est dans un autre fichier excel.

J'aurai besoin d'une forme de recherche, que les gens puisse valider les nom et ville des chantiers et que du coup j'obtienne les noms exact (les gens font des fautes de frappe c'est normal) et au final je pourrais travailler sur les arborescences des chantiers, ajouter des fichiers au bon endroit etc... Donc je cherche une solution et la recherche vu dans ce topic m'a l'air pas mal

Bonsoir javier76,

De quel principe parles-tu ?

  • stocker le n° de ligne dans une colonne (éventuellement masquée) d'une ListBox ?
  • faire remonter le n° de ligne de l'item sélectionné dans la ListBox ?

Dans un cas comme dans l'autre, le mieux serait de joindre un fichier exemple, avec ton UserForm et des explications sur ce que tu cherches à faire.

Précise aussi cette histoire de lire le contenu d'un autre classeur: à une question théorique, on ne peut répondre que de manière ... théorique

Bonsoir,

Je joins les fichiers, je ne sais pas si je créer un nouveau topic ou si je reste ici. Vu que la fonction de recherche déjà faite me plait bien je reste ici pour le moment.

Donc pour l'explication (désolé d'avance si je ne suis pas clair),

_ l'utilisateur ouvre le carnet de bon, clique sur nouvelle commande

_ le but serai que l'utilisateur recherche le chantier cible dans les textbox 1,2 ou 3 et que les listbox 1, 2 et 3 renvoi les valeurs du fichier "liste de chantier"

_ l'utilisateur double clic sur le chantier qui lui plait bien dans les list box et du coup cela remplie les textbox 4,5,6 et 7 avec les bonnes valeures

_ A la fin l'utilisateur clique sur "nouvelle commande + BON" et donc le fichier liste la nouvelle commande, nouveau numéro de commande, créé un nouveau fichier de bon commande dans le dossier qui a été parcouru grâce au numéro de chantier et nom de chantier

Je fais cette méthode car si l'utilisateur rempli les text 4 à 7 avec des fautes et bien je ne pas parcourir les arborescences des dossiers pour créer un nouveau fichier de bon de commande

Si à la place des listbox 1,2 et 3 on doit faire une seule liste box qui liste les 3 valeurs, ça ne me dérange pas

Bonsoir,

Si l'utilisateur risque de faire des erreurs d'encodage dans les TextBox 4 à 7, il peut (me semble-t-il) tout aussi bien faire le même type d'erreur dans les TextBox 1 à 3

Pourquoi ne pas charger les données de ton "Liste Chantiers.xlsx" directement dans une seule ListBox (à 4 colonnes)?

Ceci étant posé, le fait que ces données figurent dans un autre fichier ne va pas te simplifier la vie, je le crains!

Je n'ai pas cherché à comprendre (pas le temps) la distinction entre les boutons "Nouvelle commande" et "Nouvelle commande + Bon"

À tester (pour ma proposition d'une seule ListBox):

  • dans le fichier Liste Chantier.xlsx, nommer une plage "ListeChantiers", qui fait référence à
    =DECALER(Feuil1!$A$2;;;NBVAL(Feuil1!$B:$B)-1;4) et refermer ce fichier
  • ajouter une nouvelle ListBox dans ton UserForm, qu'on nommerait "ListChantiers"
  • dans le code de ton UserForm, ajouter la procédure suivante:
    Private Sub UserForm_Activate()
    Set src = Workbooks.Open(Filename:="ton_chemin_d'accès\LISTE CHANTIER.xlsx", ReadOnly:=True)
    monTablo = src.Sheets(1).Range("ListeChantiers")
    ListChantiers.List = monTablo
    src.Close
    End Sub

Si l'utilisateur risque de faire des erreurs d'encodage dans les TextBox 4 à 7, il peut (me semble-t-il) tout aussi bien faire le même type d'erreur dans les TextBox 1 à 3

Si l'utilisateur fait des fautes de frappes dans les textbox 1 à 3 et bien la recherche ne lui renverra rien, donc il sera obligé de backspace et de corriger pour trouver quelquechose

Pourquoi ne pas charger les données de ton "Liste Chantiers.xlsx" directement dans une seule ListBox (à 4 colonnes)?

Ceci étant posé, le fait que ces données figurent dans un autre fichier ne va pas te simplifier la vie, je le crains!

Ok donc j'ai créer une listbox à 4 colonnes le résultat est pas mal

Je n'ai pas cherché à comprendre (pas le temps) la distinction entre les boutons "Nouvelle commande" et "Nouvelle commande + Bon"

Dans cette discussion le 1er ne sert à rien. En vrai il sert à faire un nouveau numéro de commande sans créer le bon de commande.

À tester (pour ma proposition d'une seule ListBox):

  • dans le fichier Liste Chantier.xlsx, nommer une plage "ListeChantiers", qui fait référence à
    =DECALER(Feuil1!$A$2;;;NBVAL(Feuil1!$B:$B)-1;4) et refermer ce fichier
  • ajouter une nouvelle ListBox dans ton UserForm, qu'on nommerait "ListChantiers"
  • dans le code de ton UserForm, ajouter la procédure suivante:
    Private Sub UserForm_Activate()
    Set src = Workbooks.Open(Filename:="ton_chemin_d'accès\LISTE CHANTIER.xlsx", ReadOnly:=True)
    monTablo = src.Sheets(1).Range("ListeChantiers")
    ListChantiers.List = monTablo
    src.Close
    End Sub

Pas mal du tout !!! Je bosse dessus pour le mettre en forme comme je le voulais, j'ajoute la fonction de recherche vu au début de ce topic et je reviens ici!

Merci mille fois

Bon voila je touche presque le but que je m'étais fixé

Problème: que je lance mes "TextBox1_Change() ", je suis obligé de ré-ouvrir le classeur qui contient "ListChantiers1", je n'ai pas réussi à le garder en mémoire pour pouvoir l'utiliser sur les différentes macro ( TextBox1_Change() , TextBox2_Change() et TextBox3_Change() )

Et pour finir il me manquera une fonction : quand un commence à remplir la textbox2 puis on remplit un bout de la textbox3, je voudrais que la recherche se fasse sur les deux textbox (2 et 3). Mais ça je devrais pouvoir y arriver!

Bonsoir,

À cette heure, je ne me lance pas dans des projets qui risquent de prendre du temps mais voici un élément de réponse (peut-être !?)

que je lance mes "TextBox1_Change() ", je suis obligé de ré-ouvrir le classeur qui contient "ListChantiers1"

... Tu noteras que j'avais signalé que tu ne te facilitais sans doute pas la tâche, en travaillant avec des données provenant de deux fichiers différents

Ceci dit, dans le bout de code que j'ai proposé, le contenu de la plage "ListeChantier" est chargée dans un tableau (astucieusement nommé "monTablo" ). Si tu déclares cette variable comme variable globale (en tête de module), son contenu restera disponible dans les autres procédures de ton UserForm et ce, même quand le fichier est refermé à la fin de la Sub UserForm_Activate.

Là-dessus, je te laisse creuser ... moi, je vais aller creuser sous la couette et j'hiberne pour quelques heures

Bonsoir,

À cette heure, je ne me lance pas dans des projets qui risquent de prendre du temps mais voici un élément de réponse (peut-être !?)

que je lance mes "TextBox1_Change() ", je suis obligé de ré-ouvrir le classeur qui contient "ListChantiers1"

... Tu noteras que j'avais signalé que tu ne te facilitais sans doute pas la tâche, en travaillant avec des données provenant de deux fichiers différents

Oui j'ai noté mais là c'est parce que je n'ai pas le choix sinon j'aurai integré directement la liste dans le même fichier

Ceci dit, dans le bout de code que j'ai proposé, le contenu de la plage "ListeChantier" est chargée dans un tableau (astucieusement nommé "monTablo" ). Si tu déclares cette variable comme variable globale (en tête de module), son contenu restera disponible dans les autres procédures de ton UserForm et ce, même quand le fichier est refermé à la fin de la Sub UserForm_Activate.

Là-dessus, je te laisse creuser ... moi, je vais aller creuser sous la couette et j'hiberne pour quelques heures

Ba voila c'est parfait, j'avais déjà demandé dans une formation excel comment on pouvait faire ça mais on m'avait dit que c'était compliqué voir infaisable ... Merci beaucoup à toi Maintenant je n'ai plus de question !

Rechercher des sujets similaires à "clique listbox"