Mon formulaire VBA ne prend pas en compte les modifications effectuées
Bonjour à tous.
Je rencontre une difficulté que je n'arrive pas à comprendre.
J'ai créer un user form avec une listbox alimenté par Rowsource à l'ouverture de l'userform
Un clic sur une ligne de la list box laisse apparaitre les données dans des txtbox et combobox , avec :
Code:
1 2 3 4
| Private Sub LIST_PROS_Change()
USER_PROS.TXT_NUM.Value = USER_PROS.LIST_PROS.List(USER_PROS.LIST_PROS.ListIndex, colNUM_PROS - 4)
...
end sub |
lorsque je modifie les données, un bouton de commande doit permettre de modifier directement le classeur Excel :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Private Sub CMD_VALID_MODIFE_Click()
For i = 13 To fPROS
'Si le numéro PRO est le meme que celui du formulaire alors
If Cells(i, colNUM_PROS).Value = USER_PROS.TXT_NUM.Value Then
'Modifie les cellules de excel par les valeurs du formulaire
oPROS.Cells(i, colNOM_PROS).Value = USER_PROS.TXT_NOM_PROS.Value
oPROS.Cells(i, colTYPE_PROS).Value = USER_PROS.COMBO_TYPE_PROS.Text
. |
Bizarrement, seul la donnée NOM est modifiée, mais les autres textbox et combobox ne sont pas modifiés ;(
Je ne comprends absolument pas , c'est très bizarre que la TXT nom se modifie mais pas les autres….
Quelqu'un aurait une idée ça m'aiderait beaucoup je suis bloquée depuis des jours….
Merci à tous
LISTBOX_CHANGE rechargeait les données à chaque modif....
Bonjour à tous et merci pour vos commentaires .
J'ai modélisé les échanges entre un userform et une feuille Excel, ou plus précisément une table de données. Tu pourrais t'en inspirer.
Merci pour cet apport, je vais prendre le temps de lire pour voir comment améliorer mon fichier !
Avec ma technique, tu verras que je n'utilise pas de boucle For...Next. La tienne est coûteuse car elle va boucler sur toutes tes données pour finalement ne modifier qu'une ligne, même après avoir trouvé ladite ligne. Tu fais donc beaucoup mouliner VBA pour rien. Tu verras aussi que je n'utilise pas l'événement Initialize du userform, pas plus que le RowSource pour le combobox. Lier un combobox à une plage pose des problèmes en cas de mise à jour de ladite plage. Perso, je préfère alimenter le combobox par la procédure d'appel du userform.
Oui je fais un exit for et je pensais aussi sélectionner directement la ligne à modifier puisque la listbox est basé sur le tableau...je vais comment vous traitez cela pour améliorer le traitement.
Je ne sais pas comment alimenter le combo par la procédure d'appel du userform… je verrais ça. J'utilise une row source avec un tableau nommé qui utilise la fonction DECLALER pour prendre en compte les rajouts de données.
On peut supposer que oPros et que les index de colonnes sont déclarés au début de ton module de userform. Est-ce le cas? Que représente oPros? Une feuille, une plage? Les index de colonnes sont-ils bien valorisés?
oPROS désigne l'onglet PRO dans lequel se trouve la liste des prospects.
Les index de colonnes sont valorisée.
Ces informations sont déclarées en public et sont valorisés dans un module PARAMETRAGE que j'appelle avant de lancer une procédure.
Je suppose que le code que tu montres se trouve dans le module du formulaire UserPros. Dès lors, il n'est pas nécessaire de préfixer les contrôles.
Très bien, c'est vrai que j'ai tendance à mettre l'intégralité du nom … merci j'y penserai !
Tu dis "c'est très bizarre que la TXT nom se modifie mais pas les autres". Les lignes sont-elles exécutées? As-tu une erreur sur une ligne? Si oui, quelle erreur? sur quelle ligne? Si les variables sont bien valorisées, ton code devrait effectivement transmettre les données des contrôles aux formulaires. Mets un point d'arrêt sur la première ligne de la procédure du clic du bouton (un simple clic dans la marge à hauteur d'une ligne d'exécution met/enlève le point d'arrêt), puis lance ton formulaire. au clic, VBA s'arrêtera sur la procédure et tu pourras avancer en pas-à-pas (F8) pour contrôler l'exécution de chaque ligne…
Les lignes sont exécutés, il n'y a aucune erreurs blocantes (et pas de gestion d'erreur dans le code)
Ce qui est très bizarre, c'est que la valeur du txt ou du combo ne prend pas en compte la modification…la valeur du combo ou txt reste la valeur d'origine…. sauf pour la première ligne du code (je disais que seul la valeur TXTNOM était modifiée mais en fait non, seule la première ligne du code est prise en compte ! , si mon code commence par TXTNOM, TXTNOM sera changé mais pas les autres, s'il commence par une autre txt ou combo, c'est toujours la première ligne qui est pris en compte mais pas les autres….)
J'ai fais des lancements avec arret… et je vois bien (en mettant ma souris sur les différents TXT/COMBO ) que la valeur des TXT ou COMBO ne sont pas modifiés, hormis la 1er ligne du code…..
C'est très étrange car j'ai d'autres fichiers dans lesquelles il me semble avoir utilisé la même méthode, et ils fonctionnent…
Ha je viens tout juste de trouver l'erreur en vous répondant et en faisant un arrêt sur chaque ligne.
En fait la procédure LIST_PROS_Click rechargeait les valeurs ! Pour moi,LIST_PROS_Click était lancer seulement quand on cliquait sur une ligne de la listbox...mais en fait dés qu'une modification était fait dans le tableau d'origine (rowsource), il lançait la procedure….pour recharger les données (La procédure LIST_PROS_Click indique dans les txt et combo les valeurs des colonnes de la listbox….)
Donc dés que la première ligne était modifiée, LIST_PROS_Click rechargeait les données et donc supprimait les autres modifications que j'avais fait sur les txt et combo…
J'ai palier le problème en mettant un if … au début de LIST_PROS_Click… je sais pas si c'est la meilleur solution mais au moins je peux faire mes modifications…
Bref, je pense de toute façon que je vais tout reprendre en me servant de ton modele ….
Normalement, tu ne devrais pas avoir tout ce code dans l'événement clic (voir mon billet à ce sujet). Il est de loin préférable de détacher le code applicatif du code événementiel, car cela facilite la rédaction, la maintenance et l'évolution du code, ainsi que la gestion des erreurs (normalement, il faudrait toujours un On Error... sur une proc événementielle)...[/QUOTE]
Le code n'est pas dans l'évènement clic, l'évènement clic appelle la procédure MODIF qui est dans un module. Je l'ai indiquer comme ça pour faciliter la compréhension de ma demande.
Merci beaucoup pour votre aide au final c'est en bien vérifiant les modifications lors des arrêts que j'ai vu le souci… Je vais quand même aller voir mes anciens fichiers pour lesquelles je n'avais jamais rencontré ce problème….
Merci encore pour votre aide et j'espère avoir été claire dans les explications de résolution !