Masquer des colonnes depuis des variables

Bonsoir à tous,

Je sollicite votre aide afin d'améliorer une macro sur Excel que je suis en train de faire.

Mon but est de masquer et afficher des colonnes et des lignes selon le besoin des données à afficher, sur plusieurs onglets. Selon l'onglet, le nombre de colonnes à masquer ou à afficher varie.

Aujourd'hui mon code ressemble à cela, pour ce qui est de masquer les colonnes faisant apparaitre le budget:

Sub masquer_colonnes_budget()

Sheets("Restit Zones").Range("f:g,q:r,ab:ac,am:an,ax:ay,bi:bj,bt:bu").EntireColumn.Hidden = True

Sheets("Total Zones").Range("f:g").EntireColumn.Hidden = True

Sheets("Zone 1").Range("f:g").EntireColumn.Hidden = True

Sheets("Zone 2").Range("f:g").EntireColumn.Hidden = True

Sheets("Zone 3").Range("f:g").EntireColumn.Hidden = True

Sheets("Zone 4").Range("f:g,q:r,ab:ac,am:an,ax:ay,bi:bj").EntireColumn.Hidden = True

Sheets("Zone 5").Range("f:g").EntireColumn.Hidden = True

Sheets("Zone 6").Range("f:g,q:r,ab:ac,am:an,ax:ay").EntireColumn.Hidden = True

End Sub

J'ai créé autant de macros pour masquer et afficher les données selon les différents besoins de vues.

Mais le problème est que le fichier risque d'évoluer, avec des nouveaux onglets par exemple. Ce qui m'oblige à repasser sur chacune des macros et de les modifier.

Je souhaiterais donc plutôt utiliser des variables paramétrables pour aller chercher les colonnes et lignes à masquer puis à afficher, et une boucle qui mettrait à jour tous les onglets.

Et je n'arrive pas à faire cela toute seule.

Je joins à mon message un exemple de mon besoin

11exemple.xlsm (41.94 Ko)

Il y a un onglet paramètres avec les colonnes à masquer selon les onglets "Zones".

Si l'un de vous peut me dire comment coder depuis des variables paramétrables, cela m'aiderait énormément.

Je vous remercie par avance de votre aide.

Bien cordialement,

Rose

Bonsoir,

Sub MasquerAfficher(LC As String, msq As Boolean)
    Dim F, ListCL, CL, i%, j%, k%, lgn As Boolean
    With [LgnCol]
        For i = 1 To 20
            If .Cells(1, i) = LC Then
                k = i: Exit For
            End If
        Next i
    End With
    If i > 20 Then Exit Sub
    If k > 10 Then lgn = True
    F = [Ong]: ListCL = [Ong].Offset(, k)
    Application.ScreenUpdating = False
    For i = LBound(F) To UBound(F)
        With Worksheets(F(i, 1))
            CL = Split(ListCL(i, 1), ";")
            For j = 1 To UBound(CL)
                If lgn Then
                    .Rows(CL(j)).Hidden = msq
                Else
                    .Columns(CL(j)).Hidden = msq
                End If
            Next j
        End With
    Next i
    Application.ScreenUpdating = True
End Sub

Voilà une proposition pour remplacer toutes les procédures actuelles et celles à venir .

Cette procédure unique est lancée avec 2 paramètres : l'identification de la zone à masquer ou afficher et une valeur booléenne (True pour masquer, False pour afficher).

Exemples :

MasquerAfficher "Budget", True pour masquer Budget

MasquerAfficher "Dépenses", False pour afficher Dépenses

Il a fallu un peu réaménager les paramètres :

En col. A la liste des onglets (lignes 3 à 10)

La plage A3:A10 est nommée Ong

Les colonnes B à K sont réservées pour les indications de colonnes à masquer ou afficher, les colonnes L à U pour les lignes

En ligne 2 tes indentifiants : Budget, MF.... Dépenses, Expenses 3...

La plage B2:U2 est nommée LgnCol

Les zones 'colonnes' et 'lignes' occupent chacune 10 colonnes : cela laisse de la place pour des ajouts, mais également : la plage LgnCol va permettre de trouver la colonne où trouver les références à masquer ou afficher, le rang dans la plage indique le décalage par rapport à la plage Ong, et si ce décalage est supérieur à 10 on traite des lignes, sinon c'est des colonnes.

Les colonnes sont listées individuellement, séparées par des points virgules, pour les lignes les groupes sont maintenus et séparés aussi par des points virgules. Ces listes de références commencent toutes par un point virgule (lors de l'exécution on transforme la chaîne en tableau avec le séparateur ; ce qui garantit un tableau même pour une seule réf. qu'on traite à partir de l'indice 1)

J'ai par ailleurs remplacé tes boutons de formulaires par des activeX, plus commodes avec cette méthode.

Le déroulement de la macro découle de cette organisation. Si tu lances par exemple avec "Budget", True :

La liste d'onglet est affectée à la variable F. Le décalage de budget est 1 (col. B), La liste des réf. pour chaque onglet est affectée à la variable ListCL. On boucle sur les onglets (F, mêmes indices pour ListCL) : pour chaque onglet on transforme les réf. en tableau CL, on parcourt ce tableau pour masquer (paramètre True au lancement) des colonnes (variable lgn restée à False, le décalage étant inférieur à 10)...

Cordialement.


Bonsoir MFerrand,

Merci infiniment pour ton temps et ta réponse! Je suis impressionnée par ta rapidité!

Je vais étudier tout ça et essayer de l'appliquer à mon fichier.

Je te donne des nouvelles très vite pour te dire si j'y arrive! (et pour valider la résolution).

Merci!!

Bonne soirée.

Bien cordialement,

Rose

Rechercher des sujets similaires à "masquer colonnes variables"