ComboBox1_Change exécuté seulement après la fin de la saisie / UserForm

22classeur1.xlsm (20.29 Ko)

Bonjour,

J'ai cherché des solutions sur le forum. Je n'en ai pas trouvé mais c'est possible qu'il y en ai déjà un sur le sujet. C'est mon premier post.

J'utilise un UserForm avec un champ TextBox et une liste modifiable sur cette application simplifiée. La complication est que les deux sont des entrées potentielles (Je ne peux pas transformer la TextBox en Label) et qu'elles influent l'une sur l'autre.

Mon problème est plus simple mais il est important que vous sachiez que le code et le classeur que je vous joins est une grande simplification du code original.

En fait, j'aimerai trouver une solution pour décaler l'exécution de ComboBox_Change à la fin de la saisie de l'utilisateur.

Il faut qu'on puisse marquer du texte dans la TextBox et que l'on choisisse (en écrivant) le l'index qu'on souhaite modifier/ajouter (je n'ai pas refait le code de l'ajout / modification pour ne pas m'embêter avec les simplifications). Il y a un problème lors de l'écriture de l'index 25 par exemple puisqu'à un moment, 2 est écrit et remplace donc la valeur de TextBox.

Le problème est que je ne peux pas utiliser Application.OnTime puisque je suis dans un UserForm et je ne peux pas déplacer la macro dans un module standard car j'utilise des fonctions (non représentées ici) et de objets propres à l'UserForm. Je ne peux pas utiliser Application.Wait car ça freeze l'affichage.

Je cherche donc une solution à mon problème. Et si vous avez un moyen plus rapide en temps d'exécution de faire ce que fait ce miniprogramme, je suis prenneur (j'ai utilisé la même façon de faire dans le programme complet).

Dernière chose : est-ce qu'il y a une doc détaillée et complète de la fonction Application.Match et application.WorksheetFunction.Match.

Je ne sais pas quels type elle prend en entrée : ça marche avec Application.Match un s As String et T() As String. Je crois que ça marche aussi avec avec cell As Range e Range As Range.

Merci pour vos suggestions et le temps que vous me consacrez.

Voici mon code :

Option Explicit

Private Sub ComboBox1_Change()
  Dim T() As String, U As Variant, V As String, k As Long, cell As Range
'Déclaration des variables

  V = Me.ComboBox1.Value
'V : la valeur

  ReDim T(WorksheetFunction.CountA(Range("plage")) - 1)
  k = 0
  For Each cell In Range("plage")
    T(k) = cell.Value
    k = k + 1
  Next cell
'Création du tableau T représentant les cellules de la plage "plage" (ici A1 à A24)

  U = Application.Match(V, T, 0)
'Regardons le rang de la valeur V dans le tableau (dans la plage : plage)

  If Not IsError(U) Then
'Si V est dans la plage :

    TextBox1.Value = Cells(U, 2).Value
'La valeur correspondante est stockée dans textbox

  End If
End Sub

bonjour,

Je ne vois pas pourquoi tu utilise un combo puisque tu ne t'en sers pas...

Un deuxième TextBox ferait aussi bien l'affaire.

Dans le modèle joint je t'ai rajouté un deuxième TextBox ça me semble bien sufisant, mébon... j'ai quand même laissé le combo !

A+

34theo-vg.xlsm (19.41 Ko)

Bonjour,

Merci pour ta réponse rapide.

J'ai besoin de la ComboBox parce que j'utilise la liste dans le programme complet.

Merci en tout cas d'avoir un peu amélioré la lisibilité du code et sa rapidité d'exécution.

Cependant, je trouve très contraignant d'avoir à cliquer dans un autre champ pour quitter le focus de la ComboBox et donc d’exécuter l'actualisation.

N'y a-t-il aucun moyen d'actualiser le formulaire (ici remplir TextBox1) quelque chose comme 0.5 sec après le dernier caractère saisi ?

Un peu comme un programme qui s'exécute en parallèle de la saisie utilisateur et qui chronomètre :

  • Quand l'utilisateur saisi un caractère, lance le programme, lance le chrono
  • Si l'utilisateur saisi un autre caractère reset le chrono
  • Si le chrono arrive à 0.5 sec, lance le programme d'actualisation et s'arrête.
Je n'ai pas trouvé de moyen de faire s'exécuter une macro sans figer l'interface pour l'utilisateur.

N'y a-t-il aucun moyen de faire ça ?

Le moyen le plus simple qui me viendrait à l'esprit est avec Application.OnTime mais il faudrait pouvoir l'utiliser avec une macro à l'intérieur du UserForm, je pense qu'il doit y avoir un moyen en trouvant la bonne syntaxe pour la déclarer (surement à l'aide du chemin d'accès que je n'ai pas trouvé en cherchant sur internet)

Merci pour votre aide.

Bonjour,

Désolé pour le double post.

Je voulais dire que je suis toujours vivant et que j'attends toujours une réponse au problème.

Le sujet est en train de disparaître dans les méandres du forum :/

Merci pour votre contribution même si vous ne résolvez pas le problème d'un coup.

Théo

Bonsoir,

Je trouve cette idée... farfelue aussi je n'ai pas répondu à la question pour ne pas être désagréable !

A+

Bonjour,

Mes idées peuvent être farfelues (je ne sais pas à laquelle/lesquelles tu fais allusion).

Je n'ai plus vraiment d'espoir quant à la résolution de mon problème.

Il me reste une unique question :

Préférez vous en règle générale que je vous partage mes recherches et mes conclusions personnelles sur le problème comme je l'ai fait (je sais que c'est un peu long comme post) ou que je ponde un problème avec un classeur joint (3 phrases et basta) ?

ex :

Bonjour,

Y a-t-il une solution sur une combobox pour actualiser la liste en fonction de ce qu'on écrit dedans seulement à la fin de notre saisie (sans avoir à cliquer dans un autre champ à la fin de notre saisie ce qui est équivalent à cliquer sur un bouton pour actualiser la liste)

Exemple classeur joint.

Bonjour, Salut Galopin !

Après examen, le problème que tu indiques n'apparaît nulle part !

De toute façon, tel que tu le décris, il ne pourrait résulter que d'une erreur de programmation...

Et à ce moment là, il te faut revoir ton code.

Mais encore faudrait-il que le problème dse produise !

bonjour,

[Ferrand] :

[Théo]

C'est parfois bien de sortir les questions de leur contexte. A condition d'être suffisamment expérimentée pour être capable, en isolant le problème, de conserver de l’intérêt à la question. C'est à dire d'en conserver la finalité.

J'ai déjà répondu à la question en t'indiquant que la réponse à la question est de ne pas utiliser de Combo dans cette situation.

Si on tient vraiment à le faire, l'évènement qui examine une saisie dans sa totalité est l'évènement Exit communément admis par la communauté des développeurs Excel. En général après appui sur la touche [Entrée] ou [Tabulation].

Le temps étant par essence une notion très volatile et relative, vouloir rajouter rajouter un évènement sur la base de OnTime me parait saugrenu (Je ne sais pas si ce mot est plus adapté ou moins vexant...) l'intention n'étant pas d'indiquer que c'est impossible , mais que ça me parait personnellement sans intérêt pour justifier que j'y consacre plus de temps.

Sur la bonne manière de poser les questions dans un forum :

D'une manière générale s'il n'y a pas à priori de bonne ou de mauvaise question, il suffit que la situation soit suffisamment explicite pour en justifier l'exposé. Après... vouloir justifier une question en élaborant une hypothèse sur la manière d'y parvenir (ou pas) me semble inutile. La communauté des intervenants habituels me semble suffisamment qualifié pour élaborer la meilleure réponse possible à un problème.

Je veux dire par là que nous pouvons corriger plus ou moins facilement des erreurs basées sur des manières de faire connues ; Pas celles basées sur la manière inconnue (souvent mauvaise parce que basée sur la propre inexpérience des questionneurs) donc que vous n'arrivez pas à mettre au point pour y parvenir. Aussi nous essayons en général de réorienter vers des concepts connus.

Après... On peut toujours sortir des grandes théories du style :

Ils ne savaient pas que c'était impossible alors ils l'ont fait...

On pourrait peut-être résoudre le problème de la démographie ou de la faim dans le monde en allant cultiver nos champs sur Mars...

Bon là... Heu... Je suis incompétent ! ...Et plutôt assez réfractaire aux idées qui consiste à prendre le contrepied des usages traditionnels.

[EDIT] Après relecture j'ajoute que dans sa formulation courte votre questionnement prend une autre signification :

Y a-t-il une solution sur une combobox pour actualiser la liste

La réponse est NON : un combo ne permet pas de modifier la liste. Ni en la modifiant, ni par ajout, ni par suppression. (Heu... à ma connaissance !)

Je me méfie toujours des réponses carrées. Il y a toujours un petit marrant qui essaie de me prouver le contraire !

Il vous permet seulement de saisir un élément étranger. Libre à vous -après- de mettre en place une routine qui incorpore ce nouvel élément à la liste ou qui le supprime. (pour une modification c'est encore plus compliqué...)

Sur ces grandes considérations, que j'espère avoir été suffisamment explicites, je vous souhaite une bonne journée.

A+

Bonjour MFerrand,

Je convient que le problème ne ressort pas au premier coup d’œil et est noyé dans le charabia de mon post. Cependant, il y est mentionné et est bel et bien réel.

Le code n'est pas complet car il y a des infos sensibles sur le programme original et que ce n'était pas relevant de reprendre toute la structure pour exhiber local.

Je n'ai recopié ici que partie du code (omettant le bouton ajout par exemple)

Le principe est que l'on peut modifier/ajouter/supprimer des lignes de la colonne B.

Le problème apparaît quand l'on essaye d'ajouter un champ (imaginons le bouton ajouter) en commençant par remplir la textbox et que l'on veut le placer en position 25 par exemple. En écrivant 25, on commence par écrire 2 dans la combo ce qui écrase la valeur de la textbox.

Cependant, une autre fonctionnalité du userform est de récupérer le champ au rang x en écrivant x dans la combo et en récupérant le champ dans la textbox.

Il faut une solution qui puisse faire cohabiter les deux fonctionnalités.

La solution de Galopin fonctionne parfaitement (au détail près d'avoir à quitter le focus).

Bonjour Galopin,

Vos remarques ne sont pas vexantes.

Je pense avoir les bases de VBA mais je reconnais être novice.

C'est juste un peu frustrant quand on me répond

Je trouve cette idée... farfelue aussi je n'ai pas répondu à la question pour ne pas être désagréable !

sans parler du vrai sujet. Ça ne me dérange pas qu'on me dise que mes idées sont débiles mais il suffisait de me dire qu'il n'y avait pas d'autre solution et j'aurai clos le sujet.

Pour éclaircir le sujet du pourquoi j'utilise une combo :

Dans le classeur, la colonne a est une clé unique constituée de nombres. En réalité c'est une clé unique constitué de chaines de caractères. la liste combo permet de faire une liste de suggestion en fonction de ce que l'on écrit dans la combo en temps réel.

Voilà pourquoi j'ai besoin que ce soit une combo.

J'ai pris en compte vos remarques et j'y ferai attention lors de mes éventuels prochains posts.

J'en conclu pour le sujet initial que l'utilisation de ComboBox_Exit est la plus adaptée au problème.

Je vous remercie

Théo

J'ai bien noté que Galopin avait tenté de te diriger vers une orientation un peu plus rationnelle !

Mais comme cela n'a guère l'air de faire effet d'une part, et que d'autre part tu nous présentes un Userform muni d'une Combo dépourvue de liste et d'une TextBox en nous racontant un problème ésotérique, qui n'a aucune chance de se manifester là-dedans même au prix de nombreuses invocations cabalistiques , il me semblait peut-être judicieux de revenir à une position plus terre à terre, ou brut de décoffrage, au choix !

Sans exclure l'idée que tu pourrais te foutre du monde, peut-être à ton insu , il te faut te replacer devant ton programme à écrire ! Au départ, tu dois savoir exactement ce que tu veux faire pour pouvoir le traduire en code selon la méthodologie que tu estimes la plus adéquate (si tu ne sais pas exactement, c'est retour à l'étape précédente... ).

Là quand cela fonctionne comme prévu, tu peux te dire que tu avais fait les bons choix (sans éliminer l'idée que d'autres auraient pu également fonctionner...) Quand ce n'est pas le cas, tu commences par chercher pourquoi et comment la chose ne va pas où tu voudrais, sans inventer de raisons et en testant chacun des éléments mis en jeu. Que tu trouves les raisons ou non (mais les trouver te fera avancer plus vite vers une solution), tu sais qu'il te faudra procéder autrement. Après avoir fait le tour des propriétés et méthodes des différents objets que tu manipules, des syntaxes à utiliser pour chaque, si rien ne veut marcher, il te faut alors revenir à la phase conceptuelle pour tout reprendre à zéro, quitte à modifier le cas échéant l'objectif ou l'étape par laquelle tu voulais initialement passer.

Rien ne t'empêche bien sûr de questionner ! Un intervenant un peu plus chevronné pourra peut-être t'indiquer une voie à laquelle tu n'avais pas pensé. Mais en tout état de cause, lorsque tu signales un problème que tu souhaites surmonter, il convient avant toute chose que tu montres le problème, la situation dans laquelle il se produit, de façon qu'on puisse circonscrire et analyser les divers éléments qui y contribuent. Tant que ton illustration ne montre pas quand et comment le problème se produit, il n'y a pas de problème !

Bonjour,

Personnellement je trouve que c'est assez clair :

En fait, j'aimerai trouver une solution pour décaler l'exécution de ComboBox_Change à la fin de la saisie de l'utilisateur.

Il faut qu'on puisse marquer du texte dans la TextBox et que l'on choisisse (en écrivant) le l'index qu'on souhaite modifier/ajouter (je n'ai pas refait le code de l'ajout / modification pour ne pas m'embêter avec les simplifications). Il y a un problème lors de l'écriture de l'index 25 par exemple puisqu'à un moment, 2 est écrit et remplace donc la valeur de TextBox.

Le problème se vérifie sur le classeur !!!

D'ailleurs Galopin a compris mon problème.

Je ne comprends pas ce qui te gênes.

Si tu trouves que c'est assez clair, tu fais avec !

Pour ma part je suis totalement réfractaire aux velléités d'un demandeur de téléguider ma réponse. Je constate le problème, comme St Thomas ! , et je recherche les moyens d'aboutir à la situation souhaitée à partir de la situation de départ, dès lors qu'on me les indique clairement.

Et pour cela j'utilise le langage VBA à ma disposition, pas un langage que j'invente...

Tu devrais donc savoir, même étant novice, qu'une procédure d'évènement se lance à la survenance de l'évènement, et c'est d'ailleurs pour cela qu'on en utilise ! Et que si elle se lance à un moment où on ne le voudrait pas, c'est que l'on s'est trompé d'évènement, ce que d'ailleurs Galopin t'a déjà dit explicitement.

Et s'étant trompé, on commence par modifier ce sur quoi l'on s'est fourré sans y avoir assez réfléchi...

Ce qui ne change rien au fait, c'est l'autre aspect de la discussion, que si je n'ai pas un fichier qui me montre le problème (en action), et dans lequel je puisse opérer mes tests et autres petites choses... je ne bouge pas le petit doigt !

Bonjour d'abord,

Cette discussion est complètement stérile.

Ce sera donc mon dernier post stérile dans un sujet résolu.

Premièrement, je veux bien qu'on aurait pu faire plus clair, on peut toujours faire mieux.

Cependant, je trouve que c'est assez clair et compréhensible.

Le problème est détaillé dans le post et la marche à suivre aussi. (3 caractères à écrire dans le userform, je peux pas les écrire à ta place pitié, tu peux le faire )

J'ai déjà noté aussi qu'il ne faut pas (et que je ne referai pas) exposer le résultat de ses recherche . Je tiens à préciser que même si je l'ai fait, je l'ai fait à titre indicatif, ne forçant personne à utiliser mes pistes de recherche !!!

je recherche les moyens d'aboutir à la situation souhaitée à partir de la situation de départ, dès lors qu'on me les indique clairement.

Qu'on me les indique clairement de quoi les moyens ? tu te contredis là.

Ou alors c'est la situation de départ ? C'est pas clair. Le français le français.

Tu devrais donc savoir, même étant novice, qu'une procédure d'évènement se lance à la survenance de l'évènement, et c'est d'ailleurs pour cela qu'on en utilise ! Et que si elle se lance à un moment où on ne le voudrait pas, c'est que l'on s'est trompé d'évènement

Je ne savait pas qu'il y avait un événement exit et c'est pour ça que c'est un forum non ?

Ensuite on peut très bien mettre des conditions d'exécution au début d'une procédure événementielle pour justement modifier ses conditions d'exécution. Je suis peut-être novice mais je sais que ce n'est pas tout noir ou tout blanc.

Et s'étant trompé

C'est le principe du forum encore une fois.

On commence par modifier ce sur quoi l'on s'est fourré sans y avoir assez réfléchi...

Le français, le français

Modifier quoi ? comme je l'ai dit, je trouve ça assez clair.

Ensuite, j'y ai réfléchi et je pense que mes recherches l'ont prouvé.......... . Je n'ai juste pas votre connaissance et maîtrise du langage VBA. Merci de ne pas m'insulter. Je suis peut-être nul en VBA mais je ne suis pas con. Je ne connaissait pas la procédure événementielle exit et je ne pensait pas que quelque chose de ce genre existait, ça ne veut pas dire que je n'ai pas réfléchi au problème. D'ailleurs, la méthode exit ne répond pas exactement à ce que je recherchais. C'est ce qui s'en rapproche le plus c'est tout.

T'as vu moi aussi je peux mettre plein d'émotes agaçantes.

Cordialement

Théo

Rechercher des sujets similaires à "combobox1 change execute seulement fin saisie userform"