Aide sur macro qui doit masquer des colonnes

laurent67

XLDnaute Junior
Bonjour à tous,

novice en macro, j'ai essayé en utilisant des sources de code trouvé sur le forum et avec l'aide de l'enregistreur de macro inclus dans excel de construire une nouvelle macro, mais voila elle ne fonctionne pas.
Pourriez vous y jeter un oeil.

Sub MasqueColonne(Utilisateur As String)
Dim Col As Byte, i As Byte, Lig As Integer, sh As Worksheet

With Sheets("parametrage") 'dans la feuille paramétrage comme on va boucler de la colonne 4 à la dernière colonne, on stocke le n° de la dernière colonne :
Col = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column 'on cherche colonne A le nom d'utilisateur saisi et on stocke son numéro de ligne
Lig = .Columns(1).Cells.Find(Utilisateur, lookat:=xlWhole).Row 'boucle à partir de 4 car Feuil1 toujours affichée
For i = 3 To Col
If UCase(.Cells(Lig, i)) = "1" Then
'si on trouve un "1" dans la cellule
With Sheets(.Cells(1, i).Value) 'avec la feuille dont le nom est en 1ere ligne (septembre, octobre ...) exclus (paramétrage et Synthèse)
Columns("O:U").Select 'sélectionne les colonnes O à U
Selection.EntireColumn.Hidden = True 'Masque les colonnes sélectionnées
End With
Else
End If
Next i
End Sub


Merci d'avance.

PS le fichier est en pièce jointe au cas ou vous en auriez besoin
id : ADMIN - mdp : admin
 

Pièces jointes

  • Etat de presence.xlsm
    96 KB · Affichages: 10
Dernière édition:

pierrejean

XLDnaute Barbatruc
Bonjour Laurent67

A tester:
VB:
Sub MasqueColonne(Utilisateur As String)
Dim Col As Byte, i As Byte, Lig As Integer, sh As Worksheet

With Sheets("parametrage") 'dans la feuille paramétrage
    'comme on va boucler de la colonne 4 à la dernière colonne, on stocke le n° de la dern colonne :
    Col = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
    'on cherche colonne A le nom d'utilisateur saisi et on stocke son num de ligne
    Lig = .Columns(1).Cells.Find(Utilisateur, lookat:=xlWhole).Row
    'boucle à partir de 4 car Feuil1 toujours affichée
    For i = 3 To Col
        If UCase(.Cells(Lig, i)) = "1" Then 'si on trouve un "1" dans la cellule
            With Sheets(.Cells(1, i).Value) 'avec la feuille dont le nom est en 1ere ligne
                .Columns("O:U").EntireColumn.Hidden = True 'Masque les colonnes selectionnées
            End With
        Else
        End If
    Next i
  End With
End Sub
 

laurent67

XLDnaute Junior
Bonjour pierrejean,

merci pour ton aide effectivement le code fonctionne parfaitement.

Une bizarrerie, le code ne s'appliquait qu'à la feuille novembre et pas aux autres feuilles avec les mêmes paramétrage dans la feuille du même nom. après un dupliquer de la feuille novembre et un renommage en bonne et du forme tout fonctionne super bien.

Un grand merci pour ton aide .
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil,

Avec une autre syntaxe, normalement le résultat est le même
(je te laisse tester)
VB:
Sub MasqueColonne(Utilisateur As String)
Dim Col As Byte, i As Byte, Lig As Long, sh As Worksheet
With Sheets("parametrage") 'dans la feuille paramétrage
'comme on va boucler de la colonne 4 à la dernière colonne, on stocke le n° de la dern colonne :
Col = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
'on cherche colonne A le nom d'utilisateur saisi et on stocke son num de ligne
Lig = .Columns(1).Cells.Find(Utilisateur, lookat:=xlWhole).Row
'boucle à partir de 4 car Feuil1 toujours affichée
For i = 3 To Col
Sheets(.Cells(1, i).Text).Range("O:U").EntireColumn.Hidden = .Cells(Lig, i) = 1  'Masque les colonnes selectionnées
Next i
End With
End Sub
Pour infos: Il n'y a pas de majuscules ou de minuscules pour les chiffres, donc ici on peut se passer d'utiliser Ucase
If UCase(.Cells(Lig, i)) = "1" Then
 

laurent67

XLDnaute Junior
Bonjour Staple1600,

merci pour ta proposition que je viens de lire.
la syntaxe semble plus simple. Cependant j'ai complété le code entre temps et j'avoue que je ne saispas comment adapter la syntaxe que tu me proposes.

voici le code avec les compléments

Sub AfficheFeuilles(Utilisateur As String)
Dim Col As Byte, i As Byte, Lig As Integer, sh As Worksheet, LCAse As String

With Sheets("parametrage") 'dans la feuille paramétrage
'comme on va boucler de la colonne 4 à la dernière colonne, on stocke le n° de la dern colonne :
Col = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
'on cherche colonne A le nom d'utilisateur saisi et on stocke son num de ligne
Lig = .Columns(1).Cells.Find(Utilisateur, lookat:=xlWhole).Row
'boucle à partir de 4 car Feuil1 toujours affichée
For i = 3 To Col
If UCase(.Cells(Lig, i)) = "1" Or UCase(.Cells(Lig, i)) = "0" Then 'si la valeur de la cellule est différente de 0 ou 1
Sheets(.Cells(1, i).Value).Visible = True 'on affiche la feuille
Else
Sheets(.Cells(1, i).Value).Visible = xlSheetVeryHidden 'sinon on la masque
End If
If UCase(.Cells(Lig, i)) = "1" Then 'si la valeur de la cellule est "1"
With Sheets(.Cells(1, i).Value) 'avec la feuille dont le nom est en 1ere ligne
.Columns("O:U").EntireColumn.Hidden = False 'on affiche les colonnes sélectionnés (O:U)
End With
Else
If UCase(.Cells(Lig, i)) = "0" Then 'si on trouve un "0" dans la cellule
With Sheets(.Cells(1, i).Value) 'avec la feuille dont le nom est en 1ere ligne
.Columns("O:U").EntireColumn.Hidden = True 'Masque les colonnes selectionnées
'protège par mdp l'affichage des colonnes "O:U"
.Protect Password:="admin19", DrawingObjects:=True, contents:=True, AllowInsertingRows:=True, AllowFormattingRows:=True _
, AllowFormattingCells:=True, AllowSorting:=True, AllowFiltering:=True, UserInterfaceOnly:=True
.EnableSelection = xlNoRestrictions
End With
End If
End If
Next i
End With
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 070
Messages
2 085 045
Membres
102 766
dernier inscrit
Awiix