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 :

Comment améliorer un code comprenant trop de GoTo


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Par défaut Comment améliorer un code comprenant trop de GoTo
    Bonjour,

    J'ai un UserForm permettant de sélectionner le ou les onglet(s) Mois que l'on souhaite imprimer.

    Nom : Imprimer mois.jpg
Affichages : 207
Taille : 58,1 Ko

    J'ai essayé de faire une boucle afin d'améliorer le code ci-dessous, car il contient beaucoup trop de GoTo (bien que cela fonctionne ainsi).

    Selon si le mois comporte 31, 30 ou 28(29) jours cela affiche et masque certaines colonnes

    Si quelqu'un à une idée je suis preneur. Je suis débutant dans en programmation.

    Merci d'avance et salutation

    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
    126
     
    Private Sub Bouton_Imprimer_Click()
     
        If CB_1.Value = True Then
            UnprotectSheet
            Worksheets("Janvier").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Janvier").PrintOut 'PrintPreview
            Worksheets("Janvier").Range("CM:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois2
        End If
    Mois2:
        If CB_2.Value = True Then
            UnprotectSheet
            Worksheets("Février").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Février").PrintOut 'PrintPreview
            Worksheets("Février").Range("CG:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois3
        End If
    Mois3:
        If CB_3.Value = True Then
            UnprotectSheet
            Worksheets("Mars").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Mars").PrintOut 'PrintPreview
            Worksheets("Mars").Range("CM:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois4
        End If
    Mois4:
        If CB_4.Value = True Then
            UnprotectSheet
            Worksheets("Avril").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Avril").PrintOut 'PrintPreview
            Worksheets("Avril").Range("CL:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois5
        End If
    Mois5:
        If CB_5.Value = True Then
            UnprotectSheet
            Worksheets("Mai").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Mai").PrintOut 'PrintPreview
            Worksheets("Mai").Range("CM:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois6
        End If
    Mois6:
        If CB_6.Value = True Then
            UnprotectSheet
            Worksheets("Juin").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Juin").PrintOut 'PrintPreview
            Worksheets("Juin").Range("CL:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois7
        End If
    Mois7:
        If CB_7.Value = True Then
            UnprotectSheet
            Worksheets("Juillet").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Juillet").PrintOut 'PrintPreview
            Worksheets("Juillet").Range("CM:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois8
        End If
    Mois8:
        If CB_8.Value = True Then
            UnprotectSheet
            Worksheets("Août").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Août").PrintOut 'PrintPreview
            Worksheets("Août").Range("CM:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois9
        End If
    Mois9:
        If CB_9.Value = True Then
            UnprotectSheet
            Worksheets("Septembre").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Septembre").PrintOut 'PrintPreview
            Worksheets("Septembre").Range("CL:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois10
        End If
    Mois10:
        If CB_10.Value = True Then
            UnprotectSheet
            Worksheets("Octobre").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Octobre").PrintOut 'PrintPreview
            Worksheets("Octobre").Range("CM:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois11
        End If
    Mois11:
        If CB_11.Value = True Then
            UnprotectSheet
            Worksheets("Novembre").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Novembre").PrintOut 'PrintPreview
            Worksheets("Novembre").Range("CL:CR").EntireColumn.Hidden = True
            ProtectSheet
        Else
            GoTo Mois12
        End If
    Mois12:
        If CB_12.Value = True Then
            UnprotectSheet
            Worksheets("Décembre").Range("CG:CR").EntireColumn.Hidden = False
            Worksheets("Décembre").PrintOut 'PrintPreview
            Worksheets("Décembre").Range("CM:CR").EntireColumn.Hidden = True
            ProtectSheet
        End If
     
     
        Reset_Imprimer_Mois
        Worksheets("2018").Bouton_Menu = True
        Imprimer_Mois.Hide
    End Sub

  2. #2
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Tel qu'est rédigé votre code, les Goto et les labels associés sont totalement inutiles.
    Vous pouvez vous contenter de les supprimer.

    Cordialement

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    D'accord avec Ben : tes Goto sont absolument inutiles.

    PS : ne pas oublier de supprimer les Else aussi.

    Perso, ça fait plusieurs années que je code en VBA (voir même plusieurs décennies si on ajoute mes années VB et, plus loin encore, Quick Basic) et je n'ai JAMAIS mis de GoTo dans mes codes. Depuis que le Basic est devenu un langage structuré (par contamination du C et du Pascal) pouvant faire appel à des boucles, des sous-programme, je n'ai plus utilisé de GoTo.

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Robert
    Pourquoi t'encombrer d'un array ?
    Regarde (en nommant les feuilles "janvier", "février", etc ... donc sans majuscules, les mois n'en portant pas).
    Tu vas comprendre la raison de ce message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 1 To 12
        If Me.Controls("CB_" & i).Value Then
          f_ouvrir = MonthName(i)
          MsgBox f_ouvrir
        End If
      Next
    Amitiés

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    entièrement d'accord avec Ben_L!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Bouton_Imprimer_Click()
    Dim M
    M = Array("" ,"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre")
    For i = 1 To 12
        If Me.Controls("CB_" & i).Value Then
            UnprotectSheet
            Worksheets(M(i)).Range("CG:CR").EntireColumn.Hidden = False
            Worksheets(M(i)).PrintOut 'PrintPreview
            Worksheets(M(i)).Range("CM:CR").EntireColumn.Hidden = True
            ProtectSheet
        End If
    Next
    End Sub

  6. #6
    Invité
    Invité(e)
    Par défaut
    bonjour UmParia,
    par expérience je sais que c'est pas toujours évidant de procéder par MonthName!

    je m'affranchi de ça en ne laissant as le système le faire pour moi!

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Oui Robert
    Mais là, on sait comment il a nommé ses feuilles (on le voit dans son code).
    Mais tu as raison : alea de portabilité si exécuté sur une machine avec version non française

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Perso, je n'utilise jamais les noms littéraux des mois dans des onglets. Il est plus sage de mettre leur numéro : "01", "02", etc.
    Si on veut, par la suite, faire sur eux un traitement VBA ou même une simple synthèse y accédant à coups de INDIRECT(), ça pose beaucoup moins de problèmes.

    Idem pour les jours de la semaine.

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 70
    Par défaut
    Etant débutant en VBA je vous remercie pour vos réponse. Tout fonctionne parfaitement

    MERCI

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Menhir
    C'est une bonne méthode.
    Il est également possible de faire face à tous les cas de figure (langues de version différentes) sans perdre ni la convivialité du nommage des onglets en toutes lettres, ni l'aspect pratique de la boucle "For i" avec des checkboxes nommées CB_1, CB_2, etc ...
    Il suffit de mettre dans la propriété tag de chacune des chekboxes CB_n la chaîne de caractères de nommage de l'onglet et d'utiliser cette propriété pour savoir quelle feuille est concernée.
    Amitiés

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

Discussions similaires

  1. [XL-2007] Comment améliorer mon code pour ajout et modification de user code
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/08/2014, 14h16
  2. [WD15] Comment améliorer mon code LanceAppli
    Par papydev dans le forum WinDev
    Réponses: 13
    Dernier message: 20/08/2010, 12h17
  3. [Sécurité] Comment amélioré mon code ?
    Par Nadd dans le forum Langage
    Réponses: 14
    Dernier message: 03/03/2006, 20h13

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