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
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