XL 2019 VBA - Afficher/Masquer des jours de la semaine

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

S

sami1814

Guest
Bonjour à toutes et tous,

Je suis ultra novice en VBA et j'ai besoin d'aide.

Je suis en train de créer un planning des jours et des semaines en fonction du 1er jour d'un mois (en A1).

Maintenant, ce que je veux faire c'est Afficher ou Masquer une colonne en fonction des valeurs de D4:AH4 ("" ou 1)

Dans la cellule D4, j'ai créé cette formule pour y afficher "" ou 1 :
=SI(OU(D3="Samedi";D3="Dimanche");"";1)

Le code ci-dessous fonctionne uniquement si les cellules D4:AH4 contiennent des valeurs 1 ou rien (pas ""). Etant donné que la formule renvoie "", le code bug vu que "" <> rien.

VB:
Sub Afficher()

Dim cel As Range
For Each cel In Range("D4:AH4").SpecialCells(xlCellTypeBlanks)
cel.EntireColumn.Hidden = False
Next

End Sub

Sub Masquer()

Dim cel As Range
For Each cel In Range("D4:AH4").SpecialCells(xlCellTypeBlanks)
cel.EntireColumn.Hidden = True
Next

End Sub

Auriez-vous une solution pour remplacer .SpecialCells(xlCellTypeBlanks) par un autre paramètre ?

Merci d'avance 😁
 

Pièces jointes

Solution
Bonjour Sami,
Une possibilité :
VB:
Sub Afficher()
Dim cel As Range
    For Each cel In Range("D4:AH4")
        If cel <> 1 Then cel.EntireColumn.Hidden = False
    Next
End Sub
Sub Masquer()
    Dim cel As Range
    For Each cel In Range("D4:AH4")
        If cel <> 1 Then cel.EntireColumn.Hidden = True
    Next
End Sub
Une autre en supprimant la ligne 4 inutile :
Code:
Sub Afficher2()
    Application.ScreenUpdating = False
    Range("D:AH").EntireColumn.Hidden = False
End Sub
Sub Masquer2()
    Application.ScreenUpdating = False
    Dim cel As Range
    For Each cel In Range("D3:AH3")
        If cel = "Samedi" Or cel = "Dimanche" Then cel.EntireColumn.Hidden = True
    Next
End Sub
Bonjour Sami,
Une possibilité :
VB:
Sub Afficher()
Dim cel As Range
    For Each cel In Range("D4:AH4")
        If cel <> 1 Then cel.EntireColumn.Hidden = False
    Next
End Sub
Sub Masquer()
    Dim cel As Range
    For Each cel In Range("D4:AH4")
        If cel <> 1 Then cel.EntireColumn.Hidden = True
    Next
End Sub
Une autre en supprimant la ligne 4 inutile :
Code:
Sub Afficher2()
    Application.ScreenUpdating = False
    Range("D:AH").EntireColumn.Hidden = False
End Sub
Sub Masquer2()
    Application.ScreenUpdating = False
    Dim cel As Range
    For Each cel In Range("D3:AH3")
        If cel = "Samedi" Or cel = "Dimanche" Then cel.EntireColumn.Hidden = True
    Next
End Sub
 

Pièces jointes

Salut sylvanu !

Merci pour ces 2 solutions ! Exactement ce que je recherchais !

Bon weekend à toi 😁


EDIT: par contre quand je modifie la date (1er jour d'un mois), les jours restent pareils, c'est normal à cause du VBA ?
 
Dernière modification par un modérateur:
Bonjour à tous

EDIT: par contre quand je modifie la date (1er jour d'un mois), les jours restent pareils, c'est normal à cause du VBA ?

La formule n'est pas bonne. Il faut utiliser :
=NOMPROPRE(SI($B$1="";"";TEXTE(D6;"jjjj")))

Si tu utilises en $D$3 =TEXTE(JOUR(D6);"jjjj") tu demande à avoir le format texte de la date 1 puis de la date 2.
Tes jours ne changeant jamais (toujours 1 puis 2 etc.) ton texte ne changera jamais. Il faut utiliser la date entière.

Cordialement
 
déjà vous me modifie cela
en ca
=NOMPROPRE(SI($B$1="";"";TEXTE(JOURSEM(D6;1);"jjjj")))
et on etends la formule jusqu'au besoins dans la ligne 3

et pour le vba perso je m'attaque direct a la date en ligne 6
pas la peine de faire des pirouiette avec les noms

VB:
Sub Afficher()
    Range("D4:AH4").EntireColumn.Hidden = False
End Sub

Sub Masquer()
    Dim cel As Range, joursemaine
    For Each cel In Range("D6:dH6").Cells
        If IsDate(cel) Then
            joursemaine = Weekday(cel, vbUseSystemDayOfWeek)
            If joursemaine = 7 Or joursemaine = 6 Then Columns(cel.Column).Hidden = True
        End If
    Next
End Sub
pour info les vrais jours ca doit donner ceci
1620474275485.png
 
Dernière édition:
Bonjour sami1814
Bonjour le Fil
Histoire de vous saluer Lol
Pourquoi pas ?
VB:
If joursemaine > 5 Then
une question
dans cette formule
Code:
=NOMPROPRE(SI($B$1="";"";TEXTE(JOURSEM(D6;1);"jjjj")))
ne devrait il pas dans (JOURSEM(D6;1)) y avoir si le lundi est le premier jour de la semaine un 2 à la place du 1 ?
Lol
Bonne fin de journée
jean marie
 
Dernière édition:
Re
Ah???????
j'ai pourtant fait cela :
VB:
=NOMPROPRE(SI($B$1="";"";TEXTE(JOURSEM(D6;1);"jjjj")))
et on étends la formule jusqu'au besoins dans la ligne 3
et j'obtiens Samedi au lieu de Vendredi le 01/01/2021
Excuse y'a un Chimilimblick Lol
jean marie
 
Re à tous
il faudrait peut être arrêter de fumer la moquette
sur quelle planète le 01/01/2021 est un dimanche
Il faudrait peut-être lire les messages précédents avant de donner des leçons…
Après chacun voit midi à sa porte 🙄

Ceci étant posé, je propose une version sans VBA
J'attends les formulistes pour simplifier ma pauvre proposition...


Cordialement
 

Pièces jointes

Dernière édition:
bizarre
d’aussi loin que je me souvienne sur les versions francaises(french) et non (canadian)
c'est 1 pour lundi et 7 pour dimanche

la fonction vba weekday par contre c'est 2 car vba a été concu en US
peut etre ont il supprimé cette différence sur les office recents comme 365
en tout cas chez moi 2007 ,2013,2016 en 32 bits c'est 1
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
418
  • Question Question
Microsoft 365 Probléme VBA
Réponses
8
Affichages
233
Réponses
3
Affichages
240
Retour