Détection de changement de valeur dans une des TextBox de l'UserForm

Bonjour à tous,

Je suis en train de faire un bout de macro dans lequel, via un UserForm, je récupère et j'affiche des données dans un Frame "Liste des articles à mettre à jour" via des TextBox et des ComboBox situé à l'intérieur de ce Frame.

Je ne sais pas si ça peut avoir une importance pour la suite mais je préfère préciser que :

-> pour pouvoir effectuer des boucles sur les objets de mon Frame, les noms sont dépendants des lignes. Pour la première ligne il y a TextBox.10, TextBox.11, TextBox.12, TextBox.13, ComboBox.14,TextBox.15, ComboBox.16. Pour la deuxième TextBox.20, TextBox.21, etc. Les TextBox en italique en haut du frame ont un caractère alphabétique après le "TextBox." pour ne pas les compter dans mes boucles.

-> Toutes les valeurs contenus dans ces contrôles sont le reflet d'un tableau virtuel 2 dimensions que je fais évoluer en fonction de l'ajout ou de la suppression d'article par l'utilisateur. A chaque ajout/suppression, la macro met à jour le tableau virtuel, supprime tous les contrôles qui finissent par un numéro dans le Frame puis regénère tous les contrôles en fonction du tableau virtuel actualisé.

userform

Voilà pour la présentation dans les grandes lignes. Jusqu'ici, je m'en suis sorti malgré mon niveau débutant ^^ !

Mon problème actuel :

Une fois que l'utilisateur à fini de sélectionner les articles à afficher dans le Frame, il doit pouvoir modifier n'importe quel TextBox/ComboBox. Ce que j'aimerai, c'est pouvoir détecter dans le frame s'il y a eu un changement au niveau d'un contrôle, sans savoir lequel, puis pouvoir l'identifier pour changer la couleur du fond pour le mettre en valeur. Dans l'idée je vois comment faire en ajoutant un bouton, en bouclant sur tous les contrôles et en vérifiant la donnée actuelle avec l'ancienne donnée. Mais j'aimerai éviter de rajouter ce bouton et pouvoir détecter dès que la valeur d'un contrôle du Frame a changé, sans savoir si c'est possible... En gros, existe-t-il un moyen de détecter un changement de ".Value" pour n'importe quel contrôle ?

Merci d'avance à ceux qui se pencheront sur mon problème

Bonsoir,

je crois qu'il y a la détection "Enter" d'un contrôle, et un Afterupdate, donc l'idée est de mettre en mémoire, par exemple dans le Tag du contrôle la valeur de ce dernier quand on détecte l'entrée, et ensuite une fois modifier on vérifie la valeur avec celle du TAG : si = pas de modification, si différent alors modification et mise en couleur du contrôle.

Si vous avez beaucoup de contrôle dans le Frame cela risque de faire beaucoup de ligne, il faudra peut-être passer par un module de classe...

@ bientôt

LouReeD

Voici un fichier exemple, le textbox 1 et 4 sont gérés pas le 2 et 3, le principe :
4 valeurs ici d'origine = les valeurs qui seront données par votre code.

Si la valeur du textbox 1 ou/et 4 sont modifiées, alors à l'entrée de la souris dans le contrôle la valeur de ce dernier est mise en mémoire si cela n'a jamais était fait.
lorsque l'on sort du contrôle on vérifie sa valeur avec la mémoire : si égale on enlève la couleur, si différent on passe en rouge.

Comme cela si on change la valeur par erreur et que l'on revient à celle d'origine, alors le contrôle repasse en "sans couleur".

Autant votre code automatique peut simplifier cette procédure en inscrivant d'origine la valeur du contrôle dans le TAG...

Le fichier :

17tb-color.xlsm (18.25 Ko)

@ bientôt

LouReeD

Bonjour LouReed et merci d'avoir pris le temps !

Avec ta proposition, si je comprends bien, je dois contrôler si le tag = la value pour chaque TextBox mais de manière ciblée en vérifiant le Enter et le Exit pour chacune d'elles ? Malheureusement je vais avoir trop de TextBox et donc trop de lignes...

J'ai réfléchis à mon problème et avec les réponses que tu m'as apportées j'ai peut-être trouvée une solution mais j'aimerai savoir ce que quelqu'un d'expérimenté en pense :

Comme la détection de changement de Value de n'importe quelle TextBox dans un frame n'est pas possible, je pense que je vais lancer un event au passage de la souris sur le frame en question. Comme toutes les valeurs de mes TextBox sont le reflet d'un array 2D je connais toutes les valeurs de toutes mes TextBox. Lorsque la souris passe sur le Frame, je créer un nouveau array 2D dans mon event avec les valeurs actuelles que je compare avec mon autre array 2D puis s'il y a une différence je saurais retrouver la TexBox en question et la mettre en évidence. Est-ce que cela te semble faisable ?

Merci

Bonjour,

Comme l'a indiqué Loureed, la meilleure solution est d'utiliser un module de classe. Ci-joint un exemple avec le Frame2 d'un UserForm :

27exemple.xlsm (17.75 Ko)

Bonjour Thev !

Je n'ai jamais utilisé le module de classe encore, je ne vois même pas de quoi il s'agit ! J'essaye au maximum de faire avec ce que je connais mais si cette solution est toute indiquée alors je vais creuser un peu le sujet. Je pense que je risque de revenir vers vous après ma pèche aux infos.

Encore merci

Bon j'ai commencé à regarder les différents tutos sur les modules de classe : c'est clairement indiqué que c'est pour des codeurs expérimentés. J'ai tout de même essayé de décrypter mais j'ai trop de lacunes sur les bases étant autodidacte… Il me reste toute une partie de code à faire avant de revenir sur ce point qui est plus esthétique (mais important tout de même pour une bonne compréhension de l'outil).

J'essaierai de bricoler ce que thev m'a envoyé, j'ai fait une lecture pas à pas des différentes étapes mais je n'ai pas encore tout compris !

Je reviens vers vous au plus vite

Bonsoir f.vergneau

thev, bonsoir,

Ci joint un fichier qui prend des "raccourcis" afin de bien appréhender les modules de classe.
A savoir que tous les évènements des contrôles ne sont pas utilisables sous module de classe... Dont ceux qui nous intéressent comme le Exit ou le AfterUpdate

Le fichier :

L'idée est de créer un module de classe avec un nom TBXGrp pour "groupe des TextBox" qui seront gérés par les évènements.
Ensuite on dimensionne un tableau TBX() comme étant une nouvelle collection du module de classe.
Et pour finir on attribue les TextBox à ce tableau en spécifiant qu'ils font partis du groupe de TextBox à surveiller : Set TBX(Cpt).TBXGrp = Ctrl

Et comme le AfterUpdate ne marche pas on utilise l'évènement "Change", on fait les tests sur les valeurs du TextBox et du Tag correspondant et l'on met en rouge si différent. Le code actuel respecte la casse, donc LouReeD <> loureed !

@ bientôt

LouReeD

Rechercher des sujets similaires à "detection changement valeur textbox userform"