IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Mon formulaire VBA ne prend pas en compte les modifications effectuées


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Sousou, bonjour le forum,

    Je sais que la politique de ce forum est contre les pièces jointes. Mais mon niveau ne me permet malheureusement pas d'envisager une réponse sans voir ton fichier pour en tester les codes. Si un balèze d'ici passe (et ils sont nombreux) tu auras vite une réponse. Ces gars là sont capable de trouver la solution à ton problème rien qu'en lisant l'intitulé de ton post... Moi, il me faudrait le fichier...

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    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.


    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.

    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?

    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.

    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...

    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)...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Re,

    Hé hop... Tout simplement ahurissant !

  5. #5
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut 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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/10/2019, 00h21
  2. [XL-2007] Excel VBA ne prend pas en compte mes criteres de filtrage et aucun message d'erreur
    Par coco.on.off dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 12/08/2014, 14h11
  3. [AC-2000] Requète de sous formulaire ne prend pas en compte les changements
    Par switchON dans le forum VBA Access
    Réponses: 11
    Dernier message: 26/05/2011, 09h49
  4. [Wamp] Wampserver ne prend pas en compte les modifications
    Par rajensias dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 10
    Dernier message: 08/12/2009, 14h45
  5. Parfois le mdw ne prend pas en compte les modifications
    Par minot83 dans le forum Sécurité
    Réponses: 6
    Dernier message: 21/05/2009, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo