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 :

Evenement Userform non désiré et bloquant un autre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Chargé d'affaires commerciales
    Inscrit en
    Janvier 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaires commerciales
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 62
    Par défaut Evenement Userform non désiré et bloquant un autre
    Bonjour à vous,

    Je viens à vous pour avoir un petit oeil externe sur un bout de code qui me donne du fil à retordre depuis quelques heures. Je bute dessus et j'ai du mal à prendre du recul pour trouver le problème.

    Explications !
    Je programme un gros module d'export de données comptable depuis un logiciel de compta, qui envoie un récap à des chargés de projet de leurs facturations en cours.
    Ce programme fonctionne par l'intermédiaire d'un complément, pour lequel j'ai un Userform "Setup", qui permet notamment de modifier, supprimer et ajouter des chargés de projet, suivant les arrivées et départs dans l'entreprise.

    Mon problème est le suivant, mon bouton d'enregistrement des valeurs modifées ne marche pas. Pourtant c'est du basique de chez basique, on affecte la valeur de la Textbox à une cellule, point final. Cela marche très bien dans le cas de l'ajout d'un chargé de projet : toutes mes cellules se remplissent comme voulu. Mais dans le cadre d'une modification de valeurs déjà saisies, mon bouton d'enregistrement fait des siennes.

    J'ai un peu creusé, et je pense que le soucis provient d'un évenement que je ne vois pas, qui se déclenche en plein milieu de mon Private Sub CommandSave_click, puisque la première ligne s'effectue bien, mais pas la suite.

    Je vous joins le code ainsi qu'une capture anonymisée, si vous avez des idées de ce qui pose problème ...

    Si ce n'est pas assez clair, n'hésitez pas à me demander de reformuler, c'est la fin de la journée là :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    Public nb, ind As Integer
    Private Sub CommandCancel_Click()
        Unload Me
    End Sub
     
    Private Sub CommandDelete_Click()
        ThisWorkbook.Sheets("Liste").Rows(ind).Delete
        Call UserForm_Initialize
    End Sub
     
    Private Sub CommandEdit_Click()
     
    If TextBoxPrenom.Enabled = False Then
     
        TextBoxPrenom.Enabled = True
        TextBoxNom.Enabled = True
        TextBoxInit.Enabled = True
        TextBoxMail.Enabled = True
        TextBoxAgence.Enabled = True
        TextBoxFACTU1.Enabled = True
        TextBoxFACTU2.Enabled = True
        TextBoxRA1.Enabled = True
        TextBoxRA2.Enabled = True
    Else
        TextBoxPrenom.Enabled = False
        TextBoxNom.Enabled = False
        TextBoxInit.Enabled = False
        TextBoxMail.Enabled = False
        TextBoxAgence.Enabled = False
        TextBoxFACTU1.Enabled = False
        TextBoxFACTU2.Enabled = False
        TextBoxRA1.Enabled = False
        TextBoxRA2.Enabled = False
    End If
     
    End Sub
     
    Private Sub CommandFile_Click()
        On Error Resume Next
        Application.FileDialog(msoFileDialogFilePicker).Show
        TextBoxFile.Value = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
    End Sub
     
    Private Sub CommandNew_Click()
     
        TextBoxPrenom.Value = ""
        TextBoxNom.Value = ""
        TextBoxInit.Value = ""
        TextBoxMail.Value = ""
        TextBoxAgence.Value = ""
        TextBoxFACTU1.Value = ""
        TextBoxFACTU2.Value = ""
        TextBoxRA1.Value = ""
        TextBoxRA2.Value = ""
     
        TextBoxPrenom.Enabled = True
        TextBoxNom.Enabled = True
        TextBoxInit.Enabled = True
        TextBoxMail.Enabled = True
        TextBoxAgence.Enabled = True
        TextBoxFACTU1.Enabled = True
        TextBoxFACTU2.Enabled = True
        TextBoxRA1.Enabled = True
        TextBoxRA2.Enabled = True
        ind = nb + 1
     
    End Sub
     
    Private Sub CommandSave_Click()
     
        ThisWorkbook.Sheets("Param").Range("A2").Value = TextBoxFile.Value
        With ThisWorkbook.Sheets("Liste")
            .Range("B" & ind).Value = TextBoxPrenom.Value
            .Range("A" & ind).Value = TextBoxNom.Value
            .Range("D" & ind).Value = TextBoxInit.Value
            .Range("E" & ind).Value = TextBoxMail.Value
            .Range("F" & ind).Value = TextBoxAgence.Value
            .Range("G" & ind).Value = TextBoxFACTU1.Value
            .Range("H" & ind).Value = TextBoxFACTU2.Value
            .Range("I" & ind).Value = TextBoxRA1.Value
            .Range("J" & ind).Value = TextBoxRA2.Value
        End With
     
        'Call UserForm_Initialize
    End Sub
     
    Private Sub ListBoxCP_Click()
        ind = ListBoxCP.ListIndex + 2
        With ThisWorkbook.Sheets("Liste")
            TextBoxPrenom.Value = .Range("B" & ind).Value
            TextBoxNom.Value = .Range("A" & ind).Value
            TextBoxInit.Value = .Range("D" & ind).Value
            TextBoxMail.Value = .Range("E" & ind).Value
            TextBoxAgence.Value = .Range("F" & ind).Value
            TextBoxFACTU1.Value = .Range("G" & ind).Value
            TextBoxFACTU2.Value = .Range("H" & ind).Value
            TextBoxRA1.Value = .Range("I" & ind).Value
            TextBoxRA2.Value = .Range("J" & ind).Value
        End With
    End Sub
     
     
    Private Sub UserForm_Initialize()
     
        TextBoxFile.Value = ThisWorkbook.Sheets("Param").Range("A2").Value
     
        With Setup
            .Width = 431
            .Height = 490
        End With
     
        ' Remplissage Listbox
        nb = ThisWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
        ListBoxCP.RowSource = "[PointFactuSOLAB.xlam]Liste!C2:C" & nb
     
        TextBoxPrenom.Enabled = False
        TextBoxNom.Enabled = False
        TextBoxInit.Enabled = False
        TextBoxMail.Enabled = False
        TextBoxAgence.Enabled = False
        TextBoxFACTU1.Enabled = False
        TextBoxFACTU2.Enabled = False
        TextBoxRA1.Enabled = False
        TextBoxRA2.Enabled = False
    End Sub
    Nom : Sans titre.png
Affichages : 167
Taille : 27,9 Ko

    Bien à vous,

    Matthieu

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour mattgui,

    A priori "Ind" n'est pas redéfini au moment de la sauvegarde... je pense que le souci est là 🤔

    Voici la sub corrigée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub CommandSave_Click()  ' Penser à remettre cette ligne
      ind = ListBoxCP.ListIndex + 2
      '
      ThisWorkbook.Sheets("Param").Range("A2").Value = TextBoxFile.Value
      With ThisWorkbook.Sheets("Liste")
        .Range("B" & ind).Value = TextBoxPrenom.Value
        .Range("A" & ind).Value = TextBoxNom.Value
        .Range("D" & ind).Value = TextBoxInit.Value
        .Range("E" & ind).Value = TextBoxMail.Value
        .Range("F" & ind).Value = TextBoxAgence.Value
        .Range("G" & ind).Value = TextBoxFACTU1.Value
        .Range("H" & ind).Value = TextBoxFACTU2.Value
        .Range("I" & ind).Value = TextBoxRA1.Value
        .Range("J" & ind).Value = TextBoxRA2.Value
      End With
      'Call UserForm_Initialize
    End Sub
    A+

  3. #3
    Membre éclairé
    Homme Profil pro
    Chargé d'affaires commerciales
    Inscrit en
    Janvier 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaires commerciales
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 62
    Par défaut
    Bonjour Bruno,

    Merci de t'être penché sur mon problème, effectivement j'ai pensé à cette redéfinition de "ind", mais étant donné que la variable est déclarée comme public et qu'elle n'est pas censée bouger dans l'ordre d'apparition des événements, le problème ne vient pas de là. Dans le doute j'ai tout de même essayé de la redéfinir :p

    Ce qui est surprenant, c'est que même en enlevant à la fin de ce sub l'appel au UserForm_Initialize, la ListBox se remet automatiquement à jour. Je pense qu'un événement se produit contre mon gré, mais je n'arrive pas à déterminer lequel.

    Bonne journée,

    Matthieu

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public nb, ind As Integer
    Le type de nb n'est probablement pas celui que tu crois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call UserForm_Initialize
    Heu WTF ???
    Quelles bonnes raisons as-tu d'appeler cette fonction manuellement ?
    UserForm_initialise est appelée automatiquement lors de l'initialisation du formulaire justement, en aucun cas tu ne dois l'appeler manuellement.
    Si tu as besoin des opérations dans cette dernière, c'est qu'il te manque une fonction quelque part (Reset() par exemple).

    De plus, la fonction UserForm_initialise viole le SRP, elle assigne des données relatives au formulaire et à la feuille.

    Enfin, les rôles de tes variables ne sont pas clairement définit, tu les utilises joyeusement dans un contexte puis dans un autre (ligne de travail, indice d'une listbox ect ...), et comme elles sont globales, tu ne sais pas qui les as utilisées pour quelle raison ni quand.

    A mon avis, tu n'as pas besoin de variable globales.
    Fait toi une fonction qui te retourne le nombre de lignes de la feuille, et tu seras sûre d'avoir une valeur toujours à jour.
    Quand à la ligne de travail, mieux vaut la recalculer avant chaque utilisation.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Re,

    Sans fichier il va être compliqué de déterminer ce qui se passe 🤔

    En revanche tu nous parles d'une ListBox, ne serait t'elle pas liée à la base par la propriété "RowSource" ?
    Si c'est le cas, ne cherches pas plus loin

    A+

  6. #6
    Membre éclairé
    Homme Profil pro
    Chargé d'affaires commerciales
    Inscrit en
    Janvier 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaires commerciales
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 62
    Par défaut
    Bonjour à tous les deux et merci d'avoir pris le temps d'investiguer !

    Heu WTF ???
    Quelles bonnes raisons as-tu d'appeler cette fonction manuellement ?
    UserForm_initialise est appelée automatiquement lors de l'initialisation du formulaire justement, en aucun cas tu ne dois l'appeler manuellement.
    Si tu as besoin des opérations dans cette dernière, c'est qu'il te manque une fonction quelque part (Reset() par exemple).
    Alors oui effectivement, j'ai besoin de recharger mon code d'initialisation de mon Userform. C'est la première fois que j'ai besoin de réaliser ce typ d'action et étant "autodidacte" sur VBA, je suis aller au plus simple selon moi. Je me note d'un côté : c'est pas bien de faire ça .
    J'ai tout rebasculé dans une fonction à côté, que j'appelle maintenant dès que j'en ai besoin.

    De plus, la fonction UserForm_initialise viole le SRP, elle assigne des données relatives au formulaire et à la feuille.
    Là, je n'ai pas compris, je suis preneur d'explications supplémentaires si tu as le temps.

    Enfin, les rôles de tes variables ne sont pas clairement définit, tu les utilises joyeusement dans un contexte puis dans un autre (ligne de travail, indice d'une listbox ect ...), et comme elles sont globales, tu ne sais pas qui les as utilisées pour quelle raison ni quand.
    Dans ma tête, c'est clair, sur le papier un peu moins mais j'en suis à l'étape du brouillon. J'ai tout redéfini proprement, cependant le caractère global de "ind" est important selon moi car je récupère sa valeur au moment de la sélection et je souhaite la récupérer en appuyant sur le bouton "Save".

    En revanche tu nous parles d'une ListBox, ne serait t'elle pas liée à la base par la propriété "RowSource"
    Si c'est le cas, ne cherches pas plus loin
    Effectivement, j'affectais les valeurs avec cette méthode. Je l'ai changée par une boucle utilisant la méthode AddItem, ça marche déjà beaucoup mieux. Je ne savais pas que cette méthode pouvait poser problème dans ces circonstances, merci du tuyau.

    Merci à tous les deux pour votre aide !

    Bonne soirée,

    Matthieu

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Citation Envoyé par mattgui Voir le message
    Là, je n'ai pas compris, je suis preneur d'explications supplémentaires si tu as le temps.
    https://en.wikipedia.org/wiki/Single...lity_principle

    Citation Envoyé par mattgui Voir le message
    Dans ma tête, c'est clair, sur le papier un peu moins mais j'en suis à l'étape du brouillon. J'ai tout redéfini proprement, cependant le caractère global de "ind" est important selon moi car je récupère sa valeur au moment de la sélection et je souhaite la récupérer en appuyant sur le bouton "Save".
    Definit l'accès de ces variables en privé, car la, elles sont visible depuis l'extérieur du formulaire, ce qui n'est certainement pas ce que tu souhaites (laccès est publique par défaut).

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

Discussions similaires

  1. [XL-2016] Comment afficher un userForm non modal sur une autre fenêtre ?
    Par Patrice740 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/07/2016, 19h06
  2. Ouvrir un second userform non bloquant
    Par vbword dans le forum VBA Word
    Réponses: 7
    Dernier message: 01/04/2011, 13h41
  3. [XL-2003] Probléme de lancement non désiré de macro événementielle à l'initialisation du UserForm
    Par melouille56 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/01/2010, 12h30
  4. [JLabel] Redimensionnement auto non désiré
    Par SamRay1024 dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 21/05/2004, 18h13
  5. [BPW]Dialogues non modaux exécutés depuis un autre dialogue
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 07/12/2003, 11h14

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