Cacher des colonnes hors d'une fourchette de dates

Bonjour

J'ai 53 Colonnes avec en entête la date du début de semaine donc C2=01/01/2015, D2=08/01/2015, E2=15/01/2015 .... etc et au-dessous de chaque date, j'ai le numéro de la semaine en utilisant la fonction WEEKNUM (je travaille avec Excel en anglais)

J'ai deux cellules qui ont comme valeur la date de début A1 d'un projet et la date de fin B1

Je voudrais pouvoir via VBA cacher les colonnes qui ne sont pas comprises entre les deux dates, et ceux pour éviter qu le tableau soit très long pour seulement quelques semaines de projet

Je sais très bien cacher des colonnes à la main, mais pas les quelques dizaines d'utilisateurs qui vont devoir utiliser le fichier Excel. Donc un bouton avec "cacher les colonnes" et un autre "faire apparaitre toute les colonnes" sera plus pratique pour tous

Par avance merci de toute aide proposée

Thierry

Bonjour,

Regarde le fichier joint

J'y ai mis un bouton bascule (ToogleButton)

Si les dates sont correctes dans les cellules A2 et B2 (cellules non vides, et B2>A2), alors tu masques automatiquement les semaines non concernées

Puis le bouton passe au vert, et tu peux ré-afficher toutes les colonnes

Bonne soirée

Merci cousinhub, ca ma tout l'aire d'etre vraiment superbe

je vais essayer d'importer ca dans ma feuille, je me pertmetrer de revenir vers vous si j'ai des questions

Bon Week End

Re bonjour

j'ai donc deux questions:

les dates commence sur la 5eme colonne (colonne E), les 4 premieres colonnes on des données qui doivent toujours apparaitre, mais je ne vois pas ou changer pour que le code cache seulement les colonnes avec des dates ??

Mes dates de debut et fin de projet sont en C1 et C2, ca j'arrives a modifier le code par contre ou dois je modifier le code pour que la macro fasse les tests sur une ligne different que lq ligne 2,par example la ligne 4 (date de E4 a BE4)??

encore un grand merci pour votre aide

Private Sub ToggleButton1_Click()
Dim NumSem1 As Byte, NumSem2 As Byte
Dim NbCol As Long
With Me.ToggleButton1
    If Not IsDate(Me.Range("A2")) Or Not IsDate(Me.Range("B2")) Then
        Cells.EntireColumn.Hidden = False
        MsgBox "Il faut des dates en A2 et B2!"
        .Caption = "Masquer": .BackColor = 255
        Exit Sub
    End If
    If Me.Range("A2") = "" Or Me.Range("B2") = "" Or Me.Range("A2") > Me.Range("B2") Then
        Cells.EntireColumn.Hidden = False
        MsgBox "Il faut des dates, et que la fin soit supérieure au début!"
        .Caption = "Masquer": .BackColor = 255
        Exit Sub
    End If
    If .Caption = "Afficher" Then
        Cells.EntireColumn.Hidden = False
        .Caption = "Masquer": .BackColor = 255
    Else
        NumSem1 = Application.WeekNum(Me.Range("A2"), 2): NumSem2 = Application.WeekNum(Me.Range("B2"), 2)
        NbCol = Me.Cells(2, Columns.Count).End(xlToLeft).Column
        If NumSem1 = 1 Then
            If NbCol - NumSem2 - 2 > 0 Then Columns(NumSem2 + 3).Resize(1, NbCol - NumSem2 - 2).Hidden = True
        Else
            Columns(3).Resize(1, NumSem1 - 1).Hidden = True
            If NbCol - NumSem2 - 2 > 0 Then Columns(NumSem2 + 3).Resize(1, NbCol - 2 - NumSem2).Hidden = True
        End If
        .Caption = "Afficher": .BackColor = 65280
    End If
End With
End Sub

'65280 vert
'255 rouge

Bonjour,

Le plus simple serait que tu mettes un exemple, avec la structure exacte de ton fichier de travail, sans données confidentielles.

@ te relire

Bonjour

voila le fichier en cours de construction

Amicalement

Thierry

61test-file.xlsm (24.08 Ko)

Re-,

Modifie le code ainsi :

Private Sub ToggleButton1_Click()
Dim NumSem1 As Byte, NumSem2 As Byte
Dim NbCol As Long
With Me.ToggleButton1
    If Not IsDate(Me.Range("B3")) Or Not IsDate(Me.Range("B4")) Then
        Cells.EntireColumn.Hidden = False
        MsgBox "Il faut des dates en B3 et B4!"
        .Caption = "Masquer": .BackColor = 255
        Exit Sub
    End If
    If Me.Range("B3") = "" Or Me.Range("B4") = "" Or Me.Range("B3") > Me.Range("B4") Then
        Cells.EntireColumn.Hidden = False
        MsgBox "Il faut des dates, et que la fin soit supérieure au début!"
        .Caption = "Masquer": .BackColor = 255
        Exit Sub
    End If
    If .Caption = "Afficher" Then
        Cells.EntireColumn.Hidden = False
        .Caption = "Masquer": .BackColor = 255
    Else
        NumSem1 = Application.WeekNum(Me.Range("B3"), 2): NumSem2 = Application.WeekNum(Me.Range("B4"), 2)
        NbCol = Me.Cells(4, Columns.Count).End(xlToLeft).Column
        If NumSem1 = 1 Then
            If NbCol - NumSem2 - 4 > 0 Then Columns(NumSem2 + 5).Resize(1, NbCol - NumSem2 - 4).Hidden = True
        Else
            Columns(5).Resize(1, NumSem1 - 1).Hidden = True
            If NbCol - NumSem2 - 4 > 0 Then Columns(NumSem2 + 5).Resize(1, NbCol - 4 - NumSem2).Hidden = True
        End If
        .Caption = "Afficher": .BackColor = 65280
    End If
End With

End Sub

Bon W-E

Merci beaucoup, je vais aussi comparer les code pour comprendre

Bonne fin de semaine

Thierry

Encore une petite question

la function subtotal(109,range) fait la somme des valeur dans les colonnes cachées !!!

y a t'il un moyen de faire la la somme des cellule visible seulement ?? je voudrais faire une comparaison entre somme total contre somme cellule visible uniquement pour mettre une alarme si certaine montant sont budgetés en dehors des dates du projet (difference entre les deux)

par avance merci

Re-,

Euh, pour moi, Sous.Total (en français), avec l'argument 109, donne la somme des cellules visibles lorsque tu affiches un filtre, ou que tu masques des lignes (ou colonnes)...

donc, pas facile de répondre à ta question...

Bonne journée

vraiment bizarre, j'ouvre un nouveu fichier je fais dans A1 =subtotal(109,A2:A10) je rentre des valeurs quelconques dans A2 jusque dans A10, je cache manuellement 1 colonne pas de changement !!!!

subtotal=sous.total

la je bloque

Re-,

Effectivement, si tu masques la colonne J, tu auras toujours la même valeur dans les cellules de la colonne A...

Et j'ai fait une erreur dans mon précédent post, la fonction Sous.Total ne s'applique qu'aux lignes filtrées (ou masquées), et non aux colonnes....

Tu peux néanmoins mettre une fonction personnalisée, afin de calculer les valeurs "visibles" de la ligne qui va bien...

Regarde cet exemple (sur ton fichier réel), et dans le module1, la fonction personnalisée "sub_tot(Plg as range)"

Bon courage

38test-file-1-v2.xlsm (37.85 Ko)

Merci cousinhub, je regardes ca

++

Thierry

Bonjour cousinhub

J'espère que vous avez passé une bonne fin de semaine

J'ai enregistré les deux macros suivante pour cacher ou afficher les lignes vides dans le tableau, qui en addition avec la réduction du nombre de colonnes me donne un beau tableau avec seulement le nécessaire

Sub Hide_line()
'
' Hide_line Macro
'

'
    ActiveSheet.Range("$A$6:$C$60").AutoFilter Field:=1, Criteria1:="<>"
End Sub
Sub Show_line()
'
' Show_line Macro
'

'
    ActiveSheet.Range("$A$6:$C$60").AutoFilter Field:=1
End Sub

Comment mettre ces deux macros dans un bouton toggle ?? Je sais faire ca avec un bouton standard, mais pas toogle

Par avance merci pour toute aide apportée

Bien à vous

Thierry

Bon j'y suis arrivé !!

Private Sub ToggleButton2_Click()

    If ToggleButton2.Value = True Then
            ActiveSheet.Range("$A$6:$C$60").AutoFilter Field:=1, Criteria1:="<>"

    Else
            ActiveSheet.Range("$A$6:$C$60").AutoFilter Field:=1

    End If
End Sub

plus qu'a rajouter le changement de couleur et de libélé

Rechercher des sujets similaires à "cacher colonnes hors fourchette dates"