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 :

Répétition d'action sur la condition "change" de plusieurs combobox. [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Par défaut Répétition d'action sur la condition "change" de plusieurs combobox.
    Bonjour à tous,

    je viens vers vous car je suis entrain de faire un userform permettant de générer un devis sur une trame.

    après diverses informations sur mon userform, j'ai créé un tableau de la façon suivante:

    comboboxRef | TextBoxDesignation | |TextBox |TextBoxPrixUnitaire | Etc.

    cette ligne ce répète tout de même 16 fois, et c'est là qu'est mon problème.
    j'ai créé la condition suivante pour la première ligne, cependant je ne sais pas comment faire pour que ça se répète sur les 15 autres sans copier 15 fois le même code.

    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
     
    Private Sub ComboBoxRef1_Change()
    On Error Resume Next
    Dim I As Integer
     
        For I = 1 To [bdref].Rows.Count
            If ComboBoxRef1.Text = [bdref].Cells(I, 1) Then
                TextBoxDesignation1 = [bdref].Cells(I, 2)
                TextBoxPU1 = [bdref].Cells(I, 3)
            End If
        Next I
    TextBoxRemise1 = 0
    TextBoxQu1 = 1
    TextBoxPR1 = TextBoxPU1 - (TextBoxPU1 * (TextBoxRemise1 / 100))
    TextBoxPT1 = TextBoxPR1 * TextBoxQu1
        If ComboBoxRef1 = "" Then
            TextBoxRemise1 = ""
            TextBoxQu1 = ""
            TextBoxPT1 = ""
            TextBoxPR1 = ""
        End If
    End Sub
    Pouvez-vous m'aider SVP ??? je sais qu'il y a une solution permettant d'effectuer cette opération à chaque événement "change" de toute mes combobox mais mes limites m'en empêchent.

    Par avance merci pour votre aide

  2. #2
    Membre régulier
    Homme Profil pro
    apprentis
    Inscrit en
    Janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : apprentis
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 7
    Par défaut
    bonjour essaye d'utiliser sa pour pouvoir incrémenter le textbox donc passer au suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for k = 1 to 16
     Me.Controls("TextBoxDesignation" & k)
    Next
    pour te donner quelque chose de ce style :
    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
    Private Sub ComboBoxRef1_Change()
    On Error Resume Next
    Dim I, k As Integer
    for k = 1 to 16
        For I = 1 To [bdref].Rows.Count
            If Me.Controls("ComboBoxRef" & k).Text = [bdref].Cells(I, 1) Then
                Me.Controls("TextBoxDesignation" & k) = [bdref].Cells(I, 2)
                Me.Controls("TextBoxPU" & k) = [bdref].Cells(I, 3)
            End If
        Next I
    Me.Controls("TextBoxRemise" & k) = 0
    Me.Controls("TextBoxQu" & k) = 1
    Me.Controls("TextBoxPR" & k) = Me.Controls("TextBoxPU" & k) - (Me.Controls("TextBoxPU" & k)  * (Me.Controls("TextBoxRemise" & k)/ 100))
    Me.Controls("TextBoxPT" & k) = Me.Controls("TextBoxPR" & k) * Me.Controls("TextBoxQu" & k)
        If Me.Controls("ComboBoxRef" & k)ComboBoxRef1 = "" Then
            Me.Controls("TextBoxRemise" & k) = ""
            Me.Controls("TextBoxQu" & k) = ""
            Me.Controls("TextBoxPT" & k) = ""
            Me.Controls("TextBoxPR" & k) = ""
        End If
    next
    End Sub
    a toi de modifier le début de ta fonction, pour que sa fonctionne correctement avec ce que je t'ai rajouter (notamment dans ton premier if).

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Par défaut
    Bonjour jeremygr,

    Merci pour ton aide, elle va beaucoup m'aider pour mon projet.
    Mais mon problème ne ce situe pas là.
    je pense que je me suis mal exprimé, surtout dans l'intitulé (Répétition d'action sur la condition "change" de plusieurs combobox).

    en faite, j'ai posté le code pour :
    ComboBoxRef1_Change()
    et je dois faire la même chose pour ComboBoxRef 2 à 16.

    Mercatog dans l'un de ces postes à aidé quelqu'un avec un module de classe ici.

    mais j'ai beau essayé de le modifier, je n'arrive pas à l'adapter.

    je pense qu'il faut créer un module de classe reprenant le code de ma comboboxref1 et ensuite rappeler cette fonction pour l’exécuter à chaque fois qu'une combobox est changée.

    si tu vois ce que j'essaye de faire.
    ci-joint un mon fichier.
    ps: j'y ai juste enlevé les matrices qui appartiennent à ma société, et tu verras qu'il y a plusieurs fois l'élément comboboxref1_change puis comboboxRef2 etc...
    merci.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    A mettre dans le module de ta Form :
    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
     
    Dim Combo() As New Classe1
     
    Private Sub UserForm_Initialize()
     
        Dim Ctrl As Control
        Dim I As Integer
        Dim Y As Integer
     
        'stockage des combo dans le tableau
        For Each Ctrl In Me.Controls
     
            If TypeName(Ctrl) = "ComboBox" Then
     
                'ici, éventuellement le remplissage des combos...
     
                I = I + 1
     
                ReDim Preserve Combo(1 To I)
     
                Set Combo(I).GrpCombo = Ctrl
     
            End If
     
        Next Ctrl
     
    End Sub
    A mettre dans le module de classe appelé "Classe1" et adapte selon tes besoins en utilisant les propriétés et méthodes des combos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public WithEvents GrpCombo As ComboBox
     
    Private Sub GrpCombo_Click()
     
       MsgBox "La valeur du combo " & GrpCombo.Name & " est : " & GrpCombo.Text
     
    End Sub
    Hervé.

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Par défaut
    Bonjour Theze,

    merci pour ton aide,

    cependant peux tu m'expliquer un peu plus le principe STP ?

    ton code me renvoi une erreur variable non défini sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve Combo(1 To I)
    Si j'ai bien compris, dans la classe je dois remettre le code correspondant à "ComboBoxRef1_Change()"...
    Mais en adaptant pour toutes mes ComboBox.

    je ne comprend pas non plus quand tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If TypeName(Ctrl) = "ComboBox" Then
    j'ai n'ai pas de combobox s'appelant juste ComboBox, est-ce que ce code va choisir toutes les combobox de ma Form ?

    merci.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    La ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If TypeName(Ctrl) = "ComboBox" Then
    permet de ne prendre en considération que les ComboBox et évite les autres contrôles qui peuvent se trouver sur la Form. "ComboBox" est le nom type des ComboBox pour le compilateur et la fonction "TypeName" retourne un String indiquant quel type de contrôle, d'où la comparaison.

    Ce code crée un gestionnaire d'évènement dans un module de classe afin de gérer les différents ComboBox qui y seront rattachés. "GrpCombo" représente le ComboBox qui appelle l'évènement donc, ici tu modifie juste les propriétés, méthodes et évènements. Pour l'évènement "Change" c'est comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public WithEvents GrpCombo As ComboBox
     
    Private Sub GrpCombo_Change()
     
        MsgBox "La valeur du combo " & GrpCombo.Name & " est : " & GrpCombo.Text
     
    End Sub
    Tu as dû remarquer que quand tu as collé le code ci-dessus dans le module de classe et en sélectionnant "GrpCombo" dans le ComboBox situé au dessus du champ, le ComboBox de droite indique les évènements pouvant être utilisés.

    Dans le module de la Form, on déclare un tableau qui va contenir tous les ComboBox auxquels ont veut rattacher l'évènement "Private Sub GrpCombo_Change()" de la classe Classe1 (Combo()<-- les parenthèses signifies que c'est un tableau) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim Combo() As New Classe1
    Au lancement de la Form, on boucle sur tous les contrôles se trouvant sur cette dernière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For Each Ctrl In Me.Controls
    Sile contrôle en cours est de type "ComboBox", on incrémente le compteur, on rajoute une dimension au tableau en conservant les ComboBox déjà présents et on y stocke le ComboBox en cours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If TypeName(Ctrl) = "ComboBox" Then
     
            I = I + 1
     
            ReDim Preserve Combo(1 To I)
     
            Set Combo(I).GrpCombo = Ctrl
    Quand tu écrit Set "Combo(I).GrpCombo = Ctrl" en entrant le point, l'intellisense doit te proposer "GrpCombo".


    Hervé.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/06/2008, 15h54

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