× Aidez la recherche contre le COVID-19 avec votre ordi ! Rejoignez l'équipe PC Astuces Folding@home
 > Tous les forums > Forum Bureautique
 Afficher mes recherches dans une ListBoxSujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
jo.nat1
  Posté le 28/06/2019 @ 07:26 
Aller en bas de la page 
Petit astucien

Bonjour à tous, voilà je ne connais pas grand-chose en VBA Excel, alors je m’adresse à vous.

Dans mon classeur, j’ai mis Bouton pour appeler un UserForm, jusque-là tout va bien, mais c’est que ça se corse.

Dans l’UserForm, j’ai une « TextBox » ou je rentre un code et un bouton recherche.

A partir de là je voudrais qu’il recherche se Code dans tout le classeur (donc plusieurs code identique) et qu’il me les inscrivent dans ListBox avec les lignes correspondant colonne B et C.

Donc dans la listBox, je dois avoir Nom de l’onglet Code demandé Localisation du défaut et Cause probable.

Je sais bien, c’est beaucoup vous demandez, mais là je suis vraiment à côté de la plaque.

Je vous en remercie par avance.

Si joint mon fichier. https://www.cjoint.com/c/IFCfyplikE4

Merci.

Publicité
Debrief
 Posté le 28/06/2019 à 12:07 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Je vais essayer, faut que je me remette en tête les histoires de ListBox...

jo.nat1
 Posté le 28/06/2019 à 13:19 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour Debrief.

J'espère que tu va arrivé et je te remercie pour le service que tu vas me rendre.

Merci beaucoup.

Debrief
 Posté le 28/06/2019 à 17:48 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Quelques explications...

1 - Ton UserForm1 est devenu non modal. Ça veut dire qu'il n'est pas bloquant quand il est affiché.

2 - Le bouton de recherche est supprimé car la recherche s'effectue automatiquement dès la 2ème caractère saisi dans la TextBox du code cherché.

3 - Il est assez difficile voire impossible de gérer correctement le .SetFocus si on utilise des MsgBox. J'ai donc créé une TextBox d'information dans le UserForm1 pour les messages.

4 - J'ai renoncé à utiliser la fonction TB_Code_Exit() car elle est appelée lors de plusieurs évènement ce qui rend difficile de capter <Entrée> sur la TextBox du code cherché. Idem pour les KeyUp() ou KeyDown() qui inhibent le .SetFocus.
C'est aussi la raison pour laquelle je suis parti sur des recherches automatiques.

5 - Il est possible de double-cliquer sur un item de la ListBox1 pour afficher la feuille correspondante avec la ligne du code correspondant sélectionnée. Le Userform1 est seulement caché, pas déchargé.
Pour ça, j'ai ajouté une colonne dans la ListBox1 (largeur 0 pour la rendre invisible) du numéro de ligne dans la feuille du code listé.
Ça permet de voir tout le texte qui peut être tronqué sur la ListBox1.

6 - Les largeurs de colonnes de la ListBox1 sont paramétrées en % de la largeur totale de la ListBox1. Tu peux adapter selon tes besoins. Il vaux mieux être un tout petit peu en dessous de 100% au total pour ne pas avoir de scroll bar horizontale dans la ListBox1.

7 - Il est possible, de la feuille affichée après double-clic dans la ListBox1 de revenir à l'accueil en double-cliquant n'importe où sur cette feuille (voir gestion de l'évènement en Workbook).
Cette possibilité est indiquée par un message temporaire (1 seconde). Ce n'est utile que les premières fois pour connaître cette astuce. Pour des utilisateurs au courant, tu peux supprimer l'appel au message.
L'activation de la feuille Accueil ré-affiche alors le UserForm1 caché en l'état d'avant l'affichage de la feuille (voir gestion de l'évènement en feuille Accueil).

8 - Dans la recherche des codes on utilise un tableau qu'on redimensionne au fur et à mesure des besoins pour stocker les codes trouvés. Tu t'étonneras peut-être d'y trouver un 2ème tableau qu'on charge à partir du 1er ce qui peut sembler redondant. C'est dû au fait que le 1er ne peut être redimensionné que sur sa dernière dimension, et que le 2ème doit inverser les dimensions pour un chargement direct de la ListBox1.

Voilà le fichier -> https://www.cjoint.com/c/IFCqh27UEOq (2ème version pour corriger un bug)

Si tu as des remarques n'hésite pas, je corrigerai selon tes besoins.

Cordialement,
D.



Modifié par Debrief le 28/06/2019 18:09
jo.nat1
 Posté le 28/06/2019 à 18:00 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Merci beaucoup pour ton aide, avec tout ce que tu me dit, je n'aurais pas pu trouvé tout seul, moi qui croyait que c'était plus facile que ça, je vois que c'est du boulot.

Je tant remercie, je télécharge le fichier et je te redit ça.

Milles mercis.

jo.nat1
 Posté le 28/06/2019 à 18:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Debrief, je ne chargerais rien, c'est super comme ça, maintenant je vais pouvoir agrandir ma base de données.

Bon, pour que personnes touche au VBA, il va falloir que je lui mettre un mot de passe.

Je te remercie beaucoup et je te salut bien bas

Mercis.

Debrief
 Posté le 28/06/2019 à 21:44 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Si tu dois ajouter des données, voici une version plus performante qui ne scanne les feuilles que si nécessaire, gardant en mémoire le résultat du scan précédent pour une recherche sur le minimum de caractères de recherche, en l'occurrence pour un sous-système.

Fichier -> https://www.cjoint.com/c/IFCtJzk3P6q

Certaines choses m'ont échappé sur la version précédente, pour info.

- En modifiant en UCase() le texte de la TextBox de recherche on provoque un appel récursif à la fonction de Change()... puisqu'on change le texte.
Un Application.DisableEvents n'a aucun effet (!) et il faut donc recourir à une astuce pour ne pas se faire avoir.
Ça n'a pas eu d'effet sur la version précédente car on ne déclenchait la recherche qu''à partir de 2 caractères et seul le 1er est alphabétique donc impacté par le UCase().

- Ce n'est pas le cas dans la nouvelle version où la recherche est effectuée dès le 1er caractère entré.
On peut d'ailleurs modifier ce nombre minimum en paramètre si la performance devenait faible, mais mes tests ne le montrent pas.

- D'autre par l'initialisation du UserForm dans la version précédente est sans effet car ce n'est pas le bon nom de fonction.
Heureusement car je n'arrive pas à faire un .SetFocus qui fonctionne dans cette fonction, donc supprimée car inutile.

- Quant à la hauteur inconstante de la ListBox dans le UserForm selon les résultats, ça m'échappe totalement, ce sont des caprices d'Excel et je n'ai pas pu en forcer la hauteur à ma guise. Faut faire avec !

Edit: La version précédente corrigée est finalement quasi-aussi performante que la V2. Je te laisse choisir :) https://www.cjoint.com/c/IFCt14aJufq



Modifié par Debrief le 28/06/2019 21:55
jo.nat1
 Posté le 29/06/2019 à 06:03 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Merci beaucoup.

Debrief
 Posté le 30/06/2019 à 18:23 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Je me suis intéressé à un problème connu des ListBox: l'absence de la gestion du Scroll dans la liste de la ListBox. Un petit défi personnel !

La gestion du Scroll vertical dans liste avec les touches:

- Haut (Clavier: flèche inclinée à gauche)
- Bas (Clavier: touche 'Fin')
- Page précédente (Clavier: flèche haut barrée)
- Page suivante (Clavier: flèche bas barrée)
- Ligne précédente (Clavier: flèche haut)
- Ligne suivante (Clavier: flèche bas)

et aussi avec:
- La roue de la souris

est une fonction manquante dans Excel. Seul l'ascenseur est disponible et c'est bien dommage !

.../...

J'ai pu trouver sur un doc Microsoft, un code abscons qui permet cependant de gérer le Scroll de manière efficace.
Testé et ajouté au code, la 1ère difficulté était résolue.

.../...

La 2ème difficulté tenait au fait que, pour la recherche des codes OBD, on doit pouvoir toujours compléter ou réduire le code cherché dans sa zone de saisie sans avoir à la sélectionner préalablement (pour la rapidité et le confort) alors que pour que le Scroll soit opérationnel, c'est la ListBox qui doit être active et avoir le Focus !

C'est pourquoi, lorsque la ListBox est active (tout le temps sauf si vide), on doit intercepter les touches du clavier tapées par l'utilisateur avec Sub ListBox1_Keydown():
- Si c'est une touche relative au Scroll -> on laisse passer pour laisser agir les absconses fonctions de Scroll.
- Si c'est une touche relative à un caractère Alphanumérique ou un Backspace -> on l'intercepte et on l'utilise pour adapter le code cherché dans sa zone de saisie.
- La touche <Entrée> est également interceptée pour avoir le même effet qu'un double-clic sur la ligne sélectionnée -> afficher la feuille et la ligne du code sélectionné dans la ListBox.

Cette approche explique pourquoi on ne voit pas le curseur dans la zone de saisie du code (le Focus est sur la ListBox) mais que la frappe sur une touche 0-9 & A-Z vient malgré tout compléter (ou Bacskpace vient réduire) le code dans sa zone de saisie et générer la recherche correspondante.

.../...

Pour le retour de la feuille et ligne affichées correspondant à celle de la ligne de la ListBox sur laquelle un double-clic ou la touche <Entrée> a été actionné, j'ai préféré placer un petit UserForm qui permet:
- Un affichage permanent de l'information pour le retour à la recherche.
- L'interception des touches <Entrée>, <Echap> et du double-clic pour le retour à la recherche.

Ainsi si l'utilisateur est venu de la recherche avec la touche <Entrée> il pourra y revenir avec la même touche.
Idem s'il a utilisé le double-clic, un clic permettra de revenir. C'est de l'ergonomie.

Voici le fichier -> https://www.cjoint.com/c/IFEqubdXRTy

J'ai joint les 2 modes de recherche dans 1 seul fichier avec une constante préprocesseur pour le choix:
#Const MéthodeRecherche = 1 'Parcours systématique des feuilles
'#Const MéthodeRecherche = 2 'Conserve en mémoire le résultat d'une recherche précédente sur le nombre minimum de caractères de recherche

Cordialement,
D.



Modifié par Debrief le 30/06/2019 18:25
Publicité
jo.nat1
 Posté le 01/07/2019 à 07:26 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

bonjour Debrief

Merci pour tout ce que tu fait, par contre j'ai une erreur, mais cela viens de moi car je n'est pas signalé que mon système et en 64 bits.

je te met un imprime écran.

https://www.cjoint.com/c/IGbfyJy1Hd4

mais cela n'est pas grave.

Merci.

Debrief
 Posté le 01/07/2019 à 07:57 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour jo.nat1,

En effet ce n'est pas bien grave. Je ne connaissais pas cette affaire de VBA 64bits qui demande un mot-clé spécial PtrSafe.
Voir https://docs.microsoft.com/fr-fr/office/vba/Language/Concepts/Getting-Started/64-bit-visual-basic-for-applications-overview

J'ai donc modifié les déclarations selon la recommandation:

#If VBA7 Then 
Declare PtrSafe Sub...
#Else Declare Sub...
#EndIf

Le fichier -> https://www.cjoint.com/c/IGbgJUKWDLr

D.

Edit: Si tu veux que des touches aient un effet spécial (comme la touche 'Suppr" que j'ai ajoutée pour vider le code cherché) ... dis-le. Ça m'est maintenant facile à mettre en place.



Modifié par Debrief le 01/07/2019 08:36
jo.nat1
 Posté le 01/07/2019 à 13:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

j'ai téléchargé le classeur, mais il erreur.

Sur l'userform quand je veut recherche un code(dès la premier frappe) il met une erreur.

ci-joint de photos.

https://www.cjoint.com/c/IGblNkeJGe4

https://www.cjoint.com/c/IGblOqgMT14

voilà. A+

Mais te casse pas trop la tête l'avant dernier classeur est trè bien.

Merci beaucoup.

Debrief
 Posté le 01/07/2019 à 14:32 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Tu n'es pas obligé d'utiliser cette dernière version bien sûr. Mais j'aimerais que tu m'aides à la mettre au point sous Office 64 Bits dont c'est la 1ère fois que je découvre les contraintes.

Ce faisant, je vois que les "Hooks" d'objets sont passés de Long à LongPtr et j'ai corrigé les déclarations sous #If VBA7 Then pour en tenir compte.

Essaie cette version https://www.cjoint.com/c/IGbmFnLivmr et STP dis-moi ce qui se passe...

D.

jo.nat1
 Posté le 01/07/2019 à 15:35 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

1) le bouton effacer sur userForm, efface après 2 clics

2) recherche d'un code via userform TB_Code cela marche, mais le classeur se referme tout seul.

même si tu es dans la LB et tu clique sur la ligne pour allée sur l'onglet de feuille.

Debrief
 Posté le 01/07/2019 à 19:02 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Ok, là je ne peux pas faire grand chose sans tester et je n'ai pas d'environnement de test 64 bits sous la main.

On va en rester là. Dommage.

Debrief
 Posté le 02/07/2019 à 09:19 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Allez, encore un petit essai, j'avais oublié deux changements Long -> LonPtr.

https://www.cjoint.com/c/IGchrESfkE3

jo.nat1
 Posté le 03/07/2019 à 08:11 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

salut Debrief, cela fonctionne bien, je l'ai essayé rien d'anormal.

C'est dommage que tu n'a pas d'environnement 64 bits.

donc je peut mettre en résolu.

A+ est merci beaucoup pour ton aide, car sans toi j'aurais abandonné.

Publicité
Debrief
 Posté le 03/07/2019 à 09:24 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Cool, sacré coup de chance de l'avoir fait fonctionner en 64 bits sans pouvoir tester directement !

Merci pour tes essais et retours. C'est la 1ère fois que je suis confronté à cette histoire de 64 bits et donc j'ai appris quelque chose.

Bonne continuation et reviens à PC Astuces en cas de problème.

D.

jo.nat1
 Posté le 03/07/2019 à 17:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Salut Debrief, c'est à moi de te remercié car tu ma beaucoup aidé pour mon classeur.

Donc je te remercie mille fois.

A+

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Les bons plans du moment PC Astuces

Tous les Bons Plans
89,79 €SSD Western Digital Blue 1 To à 89,79 € livré
Valable jusqu'au 29 Novembre

Amazon Allemagne fait une promotion sur le SSD Western Digital Blue 1 To qui passe à 85,21 € (avec la TVA ajustée). Comptez 4,58 € pour la livraison en France soit un total de 89,79 € livré. On le trouve ailleurs à partir de 120 €. Ce SSD à mémoire TLC offre des vitesses de 545 Mo/s en lecture et 525 Mo/s en écriture. 

Vous pouvez utiliser votre compte Amazon France sur Amazon Allemagne et qu'il n'y a pas de douane. Si vous êtes perdu en allemand, vous pouvez traduire le site en anglais.


> Voir l'offre
46,27 €SSD Crucial BX500 480 Go à 46,27 € livré
Valable jusqu'au 28 Novembre

Amazon Allemagne propose actuellement le nouveau SSD Crucial BX500 480 Go à 41,65 € (avec la TVA ajustée). Comptez 4,62 € pour la livraison en France, soit un total de 46,27 € livré alors qu'on le trouve ailleurs à plus de 55 €. Ce SSD offre des débits de 540 Mo/s en lecture et 500 Mo/s en écriture. Le SSD est accompagné du logiciel Acronis true image qui vous permettra de transférer tout le contenu de votre ancien disque dur sur le SSD. Il est garanti 3 ans. 

Vous pouvez utiliser votre compte Amazon France sur Amazon Allemagne et il n'y a pas de frais de douane. Si vous êtes perdu en allemand, vous pouvez traduire le site en anglais.


> Voir l'offre
147,99 €Disque dur externe Western Digital My Book 8 To USB 3.0 à 147,99 €
Valable jusqu'au 28 Novembre

Amazon propose actuellement le disque dur externe Western Digital My Book 8 To USB 3.0 à 147,99 € livré gratuitement. On le trouve ailleurs à partir de 190 €. Grâce à la connectique USB 3.0 (compatible USB 2.0), ce disque dur vous offrira d'excellents débits pour vos transferts et vos sauvegardes. Pour info, le disque dur n'est pas soudé et vous pouvez le récupérer pour le mettre dans un PC.


> Voir l'offre

Sujets relatifs
Afficher tableau dans une ListBox sur une autre feuille
Ne pas afficher 00 dans Excel 2007
Afficher un rang dans cellules filtrées
Comment afficher un nombre négatif dans un Total ?
Ne pas afficher les titres dans Word 2007
macro afficher masquer lignes tableau dans word 2010
listbox dans une macro
Choisir dans liste déroulante le stagiaire à afficher
Recherches multiples dans un PDF
Afficher résultat cellule dans textBox sans virgule
Plus de sujets relatifs à Afficher mes recherches dans une ListBox
 > Tous les forums > Forum Bureautique