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 :

Simplification et harmonisation d'un code répétitif [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Mai 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2017
    Messages : 66
    Par défaut Simplification et harmonisation d'un code répétitif
    Bonjour à toutes et tous,

    Pour remplir un questionnaire, j'ai un UserForm multipage qui comporte 108 Optionbutton associés deux par deux qui déclenchent chacun l'affichage de deux CheckBox. Le choix d'un bouton va transférer le contenu d'une cellule dans un ListBox1 et la coche d'un ou deux CheckBox va transférer le contenu d'une ou deux cellules dans un second ListBox. On arrive à la fin à un listing avec questions à gauche (ListBox1) et ainsi à 216 possibilités dans le ListBox2 des réponses.

    J'utilise actuellement le code suivant pour le premier couple de boutons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub OptionButton1_Click()
        ListBox1.AddItem (Sheets("Feuil1").Range("A1"))
        CheckBox1.Caption = (Sheets("Feuil1").Range("N1"))
        CheckBox2.Caption = (Sheets("Feuil1").Range("N2"))
    End Sub
    Private Sub OptionButton2_Click()
        ListBox1.AddItem (Sheets("Feuil1").Range("A3"))
        CheckBox1.Caption = (Sheets("Feuil1").Range("N3"))
        CheckBox2.Caption = (Sheets("feuil1").Range("N4"))
    End Sub
    et ainsi de suite pour les suivants. Et pour l'alimentation du ListBox2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub CheckBox1_Click()
        ListBox2.AddItem CheckBox1.Caption
    End Sub
    Private Sub CheckBox2_Click()
        ListBox2.AddItem CheckBox2.Caption
    End Sub
    et ainsi de suite pour les suivants, ce qui représente une liste interminable laquelle est parfaitement fonctionnelle, mais ça ne me semble pas très "élégant" et j'imagine que des experts ont sans doute trouvé une autre voie pour le même résultat.

    J'avais imaginé quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To 108
    If Me.Controls("OptionButton" & i) = True Then
    CheckBox1.Caption = (Sheets("Feuil1").Range("N1"))
    CheckBox2.Caption = (Sheets("Feuil").Range("N2"))
    Mais je ne vois pas comment réaliser une commande globale qui ne répéterait pas 100 fois le même code ni comment ordonner l'ensemble.

    merci par avance pour votre expertise

    Bono1664

  2. #2
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 909
    Par défaut
    Bonjour,

    Pour ce genre de chose, personnellement, j'utilise un tableau de "paramètres" dans Excel.
    En colonne, je mets généralement quelque chose du genre "Nom du Contrôle", "CheckBox 1", "CheckBox 2", "Valeur à afficher" etc...

    Dans ton code, en gros, tu exploiterais le nom du contrôle événement et tu parcours ton tableau pour savoir quelle ligne utilisée (en te basant sur la colonne "Nom du Contrôle").

    De ce fait, chaque contrôle événement aurait une procédure du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub chk_1()
    call MiseAJourControl(chk_1)
    end sub
     
    sub MiseAJourControl(ctrl as Control)
    ' Parcourt du tableau etc
    end sub
    Cela te permets, en plus, de tout paramétrer sur Excel plutôt que dans le code (qui, au final, fera une dizaine de lignes uniques pour tous plutôt que 5 lignes par contrôle).

    Cordialement,

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Mai 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Consultant
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2017
    Messages : 66
    Par défaut Simplification et harmonisation d'un code répétitif
    Bonjour Gado2600,

    merci pour cette réponse, mais je n'en comprends pas bien l'application pratique : j'ai déjà dans ma fiche de paramètre les 108 lignes de propositions (colonne A suivies chaque fois une ligne vide) et en face les 216 lignes de réponses (colonne B).

    Après, je suis dans le brouillard...

  4. #4
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 909
    Par défaut
    Bonjour,

    L'objectif en fait, est de n'avoir qu'un seul et unique code à modifier pour tous tes objets.
    En gros, si tu as besoin de rajouter une ligne de code pour gérer un cas imprévu, tu devras le faire X fois (X étant le nombre de contrôles avec Evènement).
    Là, tu ne rajouterais la ligne qu'une seule fois, dans un code qui regroupe l'événement de tous tes contrôles.

    De plus, en termes de gestion de paramètres, tu as un tableau sur lequel tu peux intégrer des formules et donc rendre ton système "dynamique" (notamment dans le cas où tu changes une donnée de place, grâce à des formules comme "ADRESSE").

    Mais ce n'est qu'une suggestion par rapport à mes méthodes de travail dessus. Je pense qu'il peut en avoir d'autres.

    Cordialement,

  5. #5
    Membre actif Avatar de zipbox
    Homme Profil pro
    Excel VBA
    Inscrit en
    Juillet 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Excel VBA

    Informations forums :
    Inscription : Juillet 2004
    Messages : 49
    Par défaut
    Bonjour,

    voici un exemple avec 5 Boutons et 5 TextBox sur un UserForm, avec 1 procédure unique :

    on va détecter le nom du bouton, et cela va lancer une action,
    écrire le texte du TextBox associé au Bouton,
    avec une adresse paramétrable, via des données issues d'une feuille de notre classeur.
    on peut changer l'adresse, sans passer par le code VBA,

    pour cela, il faut utiliser un module de classe (j'ai découvert cela dans la FAQ)



    dans un classeur, on ajoute un module de classe (nom : Classe1)
    voici le code du module de classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Option Explicit
     
    Public WithEvents GroupeBtn As MSForms.CommandButton
     
    Private Sub GroupeBtn_Click()
      '
      Call btn_clic(GroupeBtn.Name)
      '
    End Sub
    on ajoute un UserForm (Userform1) :

    on a 5 CommandButtons (CommandButton1 à CommandButton5), 5 TextBox (TextBox1 à TextBox5)

    Nom : mc1.jpg
Affichages : 408
Taille : 21,3 Ko

    on ajoute ce module à l'UserForm

    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
     
    Option Explicit
     
    Dim Btn() As New Classe1
     
    Private Sub UserForm_Initialize()
      '
      Dim i As Integer
      '
      For i = 1 To 5
        '
        ReDim Preserve Btn(1 To i)
        '
        Set Btn(i).GroupeBtn = Me.Controls(i - 1)
        '
      Next i
      '
    End Sub
    on ajoute un module normal (Module1) :

    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
     
    Option Explicit
     
    Sub Test()
      '
      UserForm1.Show
      '
    End Sub
     
    Sub btn_clic(btn_name As String)
      '
      Const f As String = "Feuil2" ' indiquer le nom de la feuille ou se trouve les adresses
      '
      Dim n As Integer, r As String
      '
      n = Mid(btn_name, 14) ' CommandButton1 : n = 1
      '
      r = Sheets(f).Cells(n, 1).Value ' exemple dans la cellule A1 de la Feuil2 on a le texte : Feuil1!B2
      '
      Range(r).Value = UserForm1.Controls("TextBox" & n).Value
      '
    End Sub
    Pour notre exemple de 5 Boutons, nous devons indiquer dans l'onglet : "Feuil2", nos 5 adresses :

    Nom : mc2.jpg
Affichages : 452
Taille : 11,1 Ko


    voilà, l'idée ... à adapter pour tes 108 OptionButton et 2 ListBox ...


  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour
    est ce que le optionbouton1 correspont a "n1" le 2 a "n2" le 3 a "n3" etc.......?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. [XL-2007] Code répétitif pour combobox
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/09/2013, 16h42
  2. Comment s'implifier des codes répétitifs
    Par guy59960 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/08/2012, 16h54
  3. alléger un code répétitif
    Par adriennoob dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/05/2010, 16h53
  4. [XL-2003] Simplification d'un bout de code répétitif
    Par neiluj26 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/06/2009, 17h48
  5. code répétitif
    Par aroune dans le forum Langage
    Réponses: 9
    Dernier message: 06/11/2005, 18h52

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