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 du code source : Incrémenter les références aux ComboBox et adresses de cellules


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut Simplification du code source : Incrémenter les références aux ComboBox et adresses de cellules
    Bonjour à tou(te)s,

    Excel est l'outil central de mon activité au quotidien. Bien que je ne sois pas (du tout) développeur, je m’essaie néanmoins à l'utilisation de VBA pour me faciliter certaines tâches rébarbatives. J'ai ainsi pu créer un classeur qui me permet de renseigner une feuille de calcul via l'utilisation d'un UserForm, ce dernier renfermant un (très) grand nombre de TextBox, ComboBox ou de CheckBox. Leurs valeurs sont récupérées et placées aux adresses prévues sur la feuille de calcul, et tout marche parfaitement bien.

    Mon problème est que je vais devoir retoucher une partie de mon code pour l'ajout de quelques fonctionnalités, mais celle-ci (cette partie) avoisine les 800 lignes et bien qu'elle soit commentée correctement, n'ayant pas appliqué de méthodes propres aux développeurs (et pour cause, je n'en suis pas...) j'avoue que la tâche est particulièrement fastidieuse.

    Par simplicité, et méconaissance, j'ai codé l'intégralité des références comme dans l'extrait ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub CommandButton1_Click()
     
    ComboBox1.value = range("A1").value
    ComboBox2.value = range("A2").value
    ComboBox3.value = range("A3").value
    ComboBox4.value = range("A4").value
    ComboBox5.value = range("A5").value
    ComboBox6.value = range("A6").value
    ComboBox7.value = range("A7").value
    ComboBox8.value = range("A8").value
    ComboBox9.value = range("A9").value
    ComboBox10.value = range("A10").value
     
    End Sub
    Ma question est donc la suivante : est-il possible d'améliorer le code ci-dessus en réduisant le nombre de lignes par l'emploi d'une incrémentation, à quelque chose comme poser ComboBox(n).value = range("A"n) puis incrémenter les références aux objets et aux adresses des cellules par (n+1) ? Ce n'est pas tant le concept d'incrément qui me pose problème mais la manière dont cette incrémentation doit être écrite (sa syntaxe) au regard des adresses et autres numéros de série des ComboBox...

    En vous remerciant par avance.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 174
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La lecture de ce tutoriel Utiliser les contrôles dans un UserForm, en VBA Excel et tout particulièrement le chapitre I-B. Boucler sur les contrôles contenus dans la Forme vous apportera la réponse à votre question même s'il est préférable de passer par un module de classe lorsque l'on a autant de contrôles
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut
    Bonsoir Philippe,

    je vous remercie grandement pour les liens que vous m'avez conseillés. Il m'ont été d'une grande aide pour réorienter ma recherche de solution.

    Je vous avouerais que, de prime abord, j'ai été un peu perdu devant certains éléments de syntaxe mais en creusant la question, j'ai pu aller un peu plus loin que dans l'exemple indiqué (boucles sur les contrôles) pour répondre exactement à mon besoin. Le résultat obtenu est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub CommandButtonExporter_Click()
    Dim x As Integer
    Dim y As Integer
     
    For x = 107 To 126
    For y = 28 To 47
         Range("B" & y).Value = Me.Controls("ComboBox" & x).Value
        Next y
        Next x
    End Sub
    Ce n'est sûrement pas ce qui se fait de mieux en termes de codage mais cela fonctionne parfaitement.

    Encore merci à vous.

    Bonne soirée.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut
    Bonsoir à tou(te)s,

    il me semblait que j'avais pu résoudre ce problème, mais je constate que ça ne fonctionne plus. Cela veut-il dire que ça n'a jamais fonctionné ? Probablement. Je viens de me rendre compte que seule la valeur du dernier ComboBox était prise en compte, ce que je ne m'explique pas...

    Je joins un fichier exemple et je vous explique à nouveau mon problème :

    Il s'agit là d'une version pour l'occasion, il n'y a qu'un onglet et un mini UserForm avec un groupe de 9 ComboBox et 3 CheckBox.

    Les valeurs des ComboBox 1 à 3 son prises dans l'onglet "Feuil1" dans la plage "A2:A4".
    Les valeurs des ComboBox 4 à 6 son prises dans l'onglet "Feuil1" dans la plage "B2:B4".
    Les valeurs des ComboBox 7 à 9 son prises dans l'onglet "Feuil1" dans la plage "C2:C4".

    Le bouton "Grille de saisie" lance le UserForm.

    Le but : utiliser les listes déroulantes pour composer le UserForm puis cliquer sur le bouton "Exécuter" du UserForm pour remplir le tableau "A7:d9"

    Pour info, la colonne "D" réagit au click sur le CheckBox associé mais, n'ayant pas encore trouvé de moyen simple (autre que coder en dur les références de chacun des contrôles) je ne l'ai pas mis dans le code.

    Le code associé est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub CommandButtonExporter_Click()
     
    Dim a As Integer
    Dim b As Integer
     
    For a = 7 To 9
    For b = 1 To 3
     
        Range("A" & a).Value = Me.Controls("ComboBox" & b).Value
        Next b, a
     
    End Sub
    La valeur de "a" doit me permettre d'incrémenter les numéros de cellule, et la valeur de "b" celle des numéros de Combobox.

    Question #1 : Pourquoi seule la valeur du ComboBox3 est recopiée, et qui plus est, dans toutes les cellules cibles ?

    Question #2 : Pourriez-vous m'expliquer d'un point de vue logique (comme je l'ai dit, je ne suis pas développeur...) pourquoi doit-on faire un Next qui commence par "b" alors que "a" est déclarée en premier et est la première référence (celle de la cellule) écrite dans le code ?

    Je vous avoue que je coince totalement. Comment faire en sorte que le contenu de chaque contrôle puisse être inscrit dans la cellule qui est sensée lui correspondre ?

    Je pensais que l'exemple indiqué par Philippe dans son précédent post qui portait sur une seule variable pouvait être appliqué ainsi pour deux variables. Manifestement, ce n'est pas la bonne méthode.

    Si l'un ou l'une parmi vous pouvait m'aiguiller vers un début de réponse, je lui en saurai gré.

    Bien à vous.
    Fichiers attachés Fichiers attachés

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut
    Question #1 : Pourquoi seule la valeur du ComboBox3 est recopiée, et qui plus est, dans toutes les cellules cibles ?
    Je pense qu'une partie de la réponse se trouve dans le message de These, en particulier :

    Dans deux boucles imbriquées, la boucle interne tournera de 1 à m pour chaque tour de la boucle externe (boucle principale) de 1 à n.
    Si je ne dit pas de bêtise, la boucle sur le ComboBox tournera jusqu'à 3 pour chaque tour de la boucle sur l'adresse de la cellule. Ce serait donc pour ça que seule la valeur entrée dans le ComboBox3 est affichée sur chacune des cellules qui, elles, sont parcourues normalement.

    Quant à l'ordre des Next, cela a sûrement un lien avec cette histoire de boucle externe et interne.

    Je vais continuer à chercher de mon côté. Peut-être du côté des principes élémentaires de l'algo ?

    Bon dimanche.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Par défaut
    Cette fois, je pense que c'est bon...

    À l'occasion de ma première réponse à Philippe (que je remercie encore), je n'avais (très probablement) entré qu'une seule et même valeur dans mes ComboBox, ce qui m'a empêché de déceler cette erreur de boucle. Ayant laissé la mise à jour du projet de côté quelques jours, c'est en faisant plus tard un test sur de vraies valeurs que je me suis rendu compte de ma méprise.

    Voici le code que j'ai modifié pour faire fonctionner mes groupes de ComboBox et contourner le souci d'incrément de l'indice de ces derniers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub CommandButtonExporter_Click()
     
    Dim a As Integer, b As Integer
     
        a = 1
        For b = 7 To 9
            Range("A" & b).Value = Me.Controls("ComboBox" & a).Value
            a = a + 1
        Next b
     
    End Sub
    Reste maintenant à résoudre le problème des CheckBox. Pour le moment, je me sers d'un If... Then. Je ne suis pas satisfait du résultat mais je vais continuer de chercher une solution plus clean. À l'occasion, je me permettrai de vous solliciter...

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

Discussions similaires

  1. Cleanup VBA avant import code source (MS APC)
    Par Orbeaman dans le forum Général VBA
    Réponses: 0
    Dernier message: 27/09/2019, 14h39
  2. protection du code source par un mot de passe
    Par babababa dans le forum Général Java
    Réponses: 1
    Dernier message: 07/06/2018, 14h32
  3. Réponses: 1
    Dernier message: 09/10/2017, 15h29
  4. avoir un code source par défaut à la création d'un projet
    Par mitherkiller dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 18/02/2007, 15h05

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