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 :

Boucle FOR dans Union de Columns [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2025
    Messages : 13
    Par défaut Boucle FOR dans Union de Columns
    Bonjour à tous,

    Je cale sur un point de mon code malgré pas mal de recherches, alors je me lance pour mon premier post :

    J'ai une feuille sur laquelle je peux avoir besoin de faire une "remise à zéro", càd supprimer toutes les données renseignées par l'utilisateur, en conservant toutes les mises en forme, les formules etc. Jusque là ok, aucun problème.

    Par soucis de lisibilité, j'ai un certain nombre de colonnes que j'ai groupées (via le bouton "grouper" de la section "plan"), mais que l'utilisateur peut choisir d'afficher ou non, s'il en a besoin ou non : AA:AE, AM:AV, BL:BM, BQ, BS, BU, BW et DB.

    Lors de la remise à zéro, je veux que ces colonnes soient masquées (comme si on appuyait sur le petit "-" de notre plan, au-dessus des titres de colonnes). J'arrive à le faire avec un ensemble de colonnes contiguës :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With ActiveSheet.Columns("AA:AE")
    If Not .Hidden Then
        .Hidden = True
        Else: .Hidden = True
    End If
    End With
    Mon problème est que j'aimerais "standardiser" la chose, ou du moins la rendre plus propre, sans avoir à taper 8 fois ce morceau de code pour les 8 ensembles que j'ai nommés plus haut. J'ai essayé de définir une Union de ces colonnes, mais je ne maitrise pas cette commande et du coup ma boucle FOR ne fonctionne pas dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Set plage = Union(Columns("AA:AE"), Columns("AM:AV"), Columns("BL:BM"), Columns("BQ"), Columns("BS"), Columns("BU"), Columns("BW"), Columns("DB"))
    For Each Columns In plage
    If Not .Hidden Then
            .Hidden = True
            Else: .Hidden = True
        End If
    Next
    Ce code me renvoie une "Erreur de compilation: Variable requise. Impossible de l'affecter à cette expression"

    Quelqu'un aurait-il une piste ?

    Merci d'avance !

    Moulinois

  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 168
    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 168
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Exemple d'une procédure qui affiche ou masque les colonnes de la feuille active
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function Show_Hide(Optional Flag As Boolean)
     Dim t As Variant
     Dim e As Byte
     t = Array("A:D", "AA:AE", "AM:AV", "BL:BM")
     For e = LBound(t) To UBound(t)
       Columns(t(e)).EntireColumn.Hidden = Flag
     Next
    End Function
    Code de la procédure appelante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub TestShow_Hide()
      Show_Hide Flag:=True ' Masque les colonnes
    End Sub
    et pour afficher Show_Hide

    [EDIT]

    Pour en faire une fonction générique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function Show_Hide(cList As Variant, Optional Flag As Boolean)
     Dim e As Byte
     For e = LBound(cList) To UBound(cList)
       Columns(cList(e)).EntireColumn.Hidden = Flag
     Next
    End Function
    Procédure appelante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub TestShow_Hide()
      Dim t As Variant
      t = Array("A:D", "AA:AE", "AM:AV", "BL:BM")
     
      Show_Hide cList:=t , Flag:=True
    End Sub
    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
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 165
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Pour commencer une remarque sur ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Not .Hidden Then
        .Hidden = True
        Else: .Hidden = True
    End If
    Si dans un If on fait la même chose dans le Then que dans le Else (en l'absence de Elseif), alors le If ne sert à rien

    Ensuite si vous avez groupé vos colonnes avec les outils du plan (bouton Grouper onglet Données groupe Plan), il y a moyen de se placer dans un niveau du plan particulier qui masquerait toutes les colonnes groupées d'un coup, avec un code du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1

  4. #4
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2025
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2025
    Messages : 13
    Par défaut
    Oh super ! Merci pour vos réponses super rapides !

    Je me range à la proposition de tototiti2008 car en effet bien que non contiguës, j'ai positionné ces groupes de colonnes sur le même niveau du plan, donc avec cette fonction showlevels que je ne connaissais pas (pourquoi je n'ai même pas pensé à passer par le plan...) il est en effet très facile d'accéder au niveau de plan qui m'intéresse, et en plus j'aime bien c'est net et ça tient en une ligne.

    Philippe je garde ta réponse sous le coude qui pourra peut-être me servir plus loin...

    Merci en tout cas pour votre rapidité et vos retours !

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

Discussions similaires

  1. boucle "for" dans "do while"
    Par oranoutan dans le forum C#
    Réponses: 13
    Dernier message: 05/06/2007, 21h13
  2. Une boucle for dans un switch case?
    Par Death83 dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2006, 14h05
  3. Boucle For dans un TDBGrid
    Par Latipolia dans le forum C++Builder
    Réponses: 28
    Dernier message: 14/06/2005, 12h12
  4. boucle for dans un if...
    Par SylverFox dans le forum Débuter
    Réponses: 3
    Dernier message: 11/08/2004, 16h57
  5. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07

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