Masquer des colonnes si toutes les lignes sont à 0

Bonjour,

sur le fichier Excel joint, j'aimerai masquer les colonnes dont tous les montants sont à 0. J'ai le code VBA ci-dessous mais le problème est qu'il masque également des colonnes avec du texte. Le code devra être utilisé sur d'autres fichiers Excel donc pas la possibilité de limiter à une plage numérique spécifique :

Sub Masquercolonnesvides()
Dim col As Range, cell As Range, NonZero As Boolean
For Each col In ActiveSheet.UsedRange.Columns
NonZero = False
For Each cell In col.Cells
If IsNumeric(cell.Value2) And cell.Value2 <> 0 Then
NonZero = True
Exit For
End If
Next
col.EntireColumn.Hidden = Not NonZero
Next
End Sub

Merci d'avance pour votre retour.

Bonsoir,

une proposition en ne testant que la ligne 9 de la feuille Format :

Sub Masquercolonnesvides()
    Dim Cel As Range
    For Each Cel In Range("A9:AH9")
        If IsNumeric(Cel) And Cel = 0 Then
            Cel.EntireColumn.Hidden = True
        Else
            Cel.EntireColumn.Hidden = False
        End If
    Next
End Sub

Avec les deux cas dans le cas où une valeur passerait à autre chose de 0 lors de modification ailleurs dans le classeur...

@ bientôt

LouReeD

Merci LouReeD pour ce retour. Malheuresement difficulté supplémentaire (sinon ce n'est pas drôle), selon l'établissement extrait sur Excel le nombre de salariés ne sera pas toujours le même et donc la ligne du total ne sera pas toujours en ligne 9 ...

Bonsoir Stv.v, bienvenue sur XLP ,

On parle de macro.

On nous fournit un fichier .xlsx sans macro. On ne nous dit pas quelles sont les feuilles à traiter.

C'est un peu "léger" comme données du problème, non ?

Bonsoir,

Ah mince, désolé je ne maitrise pas le sujet ^^. Je remets le fichier en pj avec la macro (j'espère, je l'ai enregistré sur ce classeur cette fois). Et il n'y a que la première feuille à traiter, j'ai supprimé toutes les autres.

Et bien alors on recherche la dernière ligne utilisée de la feuille, ainsi que la dernière colonne, ceci nous permet de connaitre la zone à tester et masquer les colonnes où la cellule est égale à 0 :

Sub Masquercolonnesvides()
    Dim Cel As Range, DerLig As Long
    DerLig = Range("A" & Rows.Count).End(xlUp).Row
    For Each Cel In Range("A" & DerLig & ":AH" & DerLig)
        If IsNumeric(Cel) And Cel = 0 Then
            Cel.EntireColumn.Hidden = True
        Else
            Cel.EntireColumn.Hidden = False
        End If
    Next
End Sub

Bon ici je n'ai fait que rechercher la dernière ligne
Mais je pense que le nombre de colonne quant à lui sera plus ou moins équivalent, non ?
Ce code s'applique à la feuille active.

Votre fichier en retour :

@ bientôt

LouReeD

Je comprend la macro, mais cela ne fonctionne pas totalement. Sur le fichier elle masque également des colonnes dont le total est positif, par exemple la colonne K et L.

Re,

Un essai. Cliquez sur un bouton au choix.

Sub MasquerColonnesAzero()
Dim col As Range, valeur, Afficher As Boolean, estData As Boolean
   Application.ScreenUpdating = False                 ' on fige l'écran - plus rapide
   ActiveSheet.UsedRange.EntireColumn.Hidden = True   ' toutes les colonnes utilisées sont masquées
   For Each col In ActiveSheet.UsedRange.Columns      ' pour chaque colonne utilisée
      Afficher = False                          ' afficher = indicateur d'affichage
      estData = False                           ' estData = indicateur de la ligne des titres
      For Each valeur In col.Value2             ' pour chaque valeur dans la colonne
         If estData Then                        ' si c'est une ligne de data alors on l'examine
            If valeur <> "" Then                ' on ne traite que les lignes qui ne sont pas vides
               If Not IsNumeric(valeur) Then    ' si la valeur n'est pas un nombre alors
                  Afficher = True               ' afficher = True (on affichera la colonne)
                  Exit For                      ' on sait que la colonne sera à afficher: sortie de la boucle
               ElseIf valeur <> 0 Then    ' c'est un nombre différent de 0 : on doit afficher la colonne
                  Afficher = True         ' indicateur d'affichage à True
                  Exit For                ' on sait que la colonne sera à afficher: sortie de la boucle
               End If
            End If
         Else                 ' ce n'est pas une ligne de data (en fait c'est le titre de la colonne)
            estData = True    ' les prochaines lignes seront des lignes de data à examiner
         End If
      Next valeur
      If Afficher Then col.EntireColumn.Hidden = False   ' on démasque le colonne si elle doit être affichée
   Next col
End Sub

Sub ToutAfficher()
   ActiveSheet.Columns.Hidden = False
End Sub

Oui en fait il faut ajouter "+1" sur la ligne de détermination de la dernière ligne de la colonne A car la ligne 12 colonne A est vide.

Si c'est TOUJOURS le cas alors un +1 suffit, sinon :

Sub Masquercolonnesvides()
    Dim Cel As Range, DerLig As Long
'    DerLig = Range("A" & Rows.Count).End(xlUp).Row + 1
    DerLig = Range("A1").CurrentRegion.Rows.Count
    For Each Cel In Range("I" & DerLig & ":AH" & DerLig)
        If IsNumeric(Cel) And Cel = 0 Then
            Cel.EntireColumn.Hidden = True
        Else
            Cel.EntireColumn.Hidden = False
        End If
    Next
End Sub

Ou bien faire la recherche de la dernière ligne sur une colonne dont on est sur qu'il y aura une donnée sur cette dernière cellule...

@ bientôt

LouReeD

Immense merci mafraise ! La macro répond exactement à ce que je recherchais ! :)

Merci aussi LouReeD, ta réponse me sera utile pour d'autres macros similaires :)

Bonne soirée à vous 2.

Je n'avais pas saisie qu'il pouvait y avoir des + et des -, donc la somme en ligne jaune = 0 mais la colonne n'a pas que des 0 !
Correction du code en conséquence :

Sub Masquercolonnesvides()
    Dim Cel As Range, DerLig As Long, DerCol As Integer, Col As Integer
    ' dernière ligne
    DerLig = Range("A" & Rows.Count).End(xlUp).Row
    ' dernière colonne
    DerCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    For Col = 9 To DerCol ' colonne I à la dernière
        ' si le nombre de 0 égal le nombre de ligne de données
        If Application.CountIf(Range(Cells(2, Col), Cells(DerLig, Col)), 0) = DerLig - 1 Then
            ' on masque
            Cells(1, Col).EntireColumn.Hidden = True
        Else
            ' sinon on montre
            Cells(1, Col).EntireColumn.Hidden = False
        End If
    Next Col
End Sub

Par colonne, on compte les 0, s'il y en a autant que de ligne de données on masque, sinon on montre.

@ bientôt

LouReeD

Bonjour à toutes et tous,
Je passais par là, sur un sujet résolu !... 😉
Cdlt.

Public Sub HideColumns()
    Main True
End Sub

Public Sub ShowColumns()
    Main False
End Sub

Private Sub Main(bln As Boolean)
Dim lCols As Long, lRow As Long, lCol As Long
    With ActiveSheet
        lCols = .UsedRange.Columns.Count
        'derniere ligne non vide colonne C
        lRow = .Cells(.Rows.Count, 3).End(xlUp).Row
        For lCol = lCols To 10 Step -1
            If bln Then
                .Cells(lCol).EntireColumn.Hidden = .Cells(lRow, lCol).Value = 0 = True
            Else
                .Cells(lCol).EntireColumn.Hidden = False
            End If
        Next lCol
    End With
End Sub

Bonjour,

Jean-Eric bonjour,

C'est ce que je disais : si la dernière ligne correspond à la somme de la colonne, alors il peut très bien y avoir 0 mais avec deux données dans la colonne (-3 et 3 par exemple)

C'est pourquoi j'ai changé mon code, et que celui de ma fraise correspond à la demande me semble t il, non ?

Mon deuxième code laisse apparent une colonne qui aurait une cellule non renseigné je crois.

Mais j'aime bien la structure de votre code

@ bientôt

LouReeD

Re,
@LouReed,
J'aime que tu aimes !... 🤪

@ bientôt

LouReeD

Rechercher des sujets similaires à "masquer colonnes toutes lignes"