Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

sami1814

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

  • Planning.xlsm
    20.2 KB · Affichages: 28
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

sylvanu

XLDnaute Barbatruc
Supporter XLD
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

  • Planning.xlsm
    19.4 KB · Affichages: 11

sami1814

XLDnaute Nouveau
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 édition:

Efgé

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

patricktoulon

XLDnaute Barbatruc
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
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
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:

ChTi160

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

ChTi160

XLDnaute Barbatruc
Re
tu dis : "une version canadienne" d'office ou Windows ?

j'ai un office 365 (abt) depuis près d'un An (19/05/2021)
et
Windows 10 de mon nouveau PC Acer Aspire A517-52G .
donc je ne crois pas Lol
jean marie
 

Efgé

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

  • Planning_3.xlsx
    12 KB · Affichages: 8
Dernière édition:

patricktoulon

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

Discussions similaires

Réponses
5
Affichages
92
Réponses
12
Affichages
519
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…