| ||||||||
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é | ||||||||
Astucien ![]() | Je vais essayer, faut que je me remette en tête les histoires de ListBox...
| |||||||
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.
| |||||||
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. 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é. 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). 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, Modifié par Debrief le 28/06/2019 18:09 | |||||||
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. | |||||||
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. | |||||||
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. - Ce n'est pas le cas dans la nouvelle version où la recherche est effectuée dès le 1er caractère entré. - 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. - 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 | |||||||
Petit astucien ![]() | Merci beaucoup. | |||||||
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) et aussi avec: 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. .../... 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(): 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: Ainsi si l'utilisateur est venu de la recherche avec la touche <Entrée> il pourra y revenir avec la même touche. 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: Cordialement,
Modifié par Debrief le 30/06/2019 18:25 | |||||||
Publicité | ||||||||
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. | |||||||
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. J'ai donc modifié les déclarations selon la recommandation: #If VBA7 Then
Declare PtrSafe Sub...
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 | |||||||
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. | |||||||
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.
| |||||||
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. | |||||||
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. | |||||||
Astucien ![]() | Allez, encore un petit essai, j'avais oublié deux changements Long -> LonPtr. | |||||||
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é | ||||||||
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. | |||||||
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+
| |||||||
|
Les bons plans du moment PC Astuces | Tous les Bons Plans | |||||||||||||||
|