Masquer les lignes et les colonnes contenant que des 0 dans un tableau

Bonjour,

j'ai la macro opérationnelle suivante qui me permet de masquer les colonnes et les lignes nulles :

ub Masquer()

For i = 14 To 543
If WorksheetFunction.Sum(Range("F" & i & ":AD" & i)) = 0 Then
Rows(i & ":" & i).EntireRow.Hidden = True
End If
Next i
For j = 6 To 30
If WorksheetFunction.Sum(Range(Cells(30, j), Cells(543, j))) = 0 Then
Range(Columns(j), Columns(j)).EntireColumn.Hidden = True
End If
Next j
End Sub

Cependant, s'il y a des montants qui s'annulent sur une colonne (par exemple +100k sur une ligne et -100k sur une autre) la colonne est masquée. Je ne souhaite pas que cette colonne soit masquée.

Est-ce qu'il existe une formule pour dire "contient au moins un montant non nul ?" j'ai besoin de conserver cette colonne car elle contient des informations.

merci encore de votre aide!

excellente journée,

Julie

Bonjour,

Peut-être en comptant le nombre de 0 sur la plage au lieu de sommer :

Sub MASQUER()
Dim i%, j%
For i = 14 To 543
    If WorksheetFunction.Sum(Range("F" & i & ":AD" & i)) = 0 Then Rows(i & ":" & i).EntireRow.Hidden = True
Next i
For j = 6 To 30
    If WorksheetFunction.CountIf(Range(Cells(30, j), Cells(543, j)), 0) <> 0 Then Range(Columns(j), Columns(j)).EntireColumn.Hidden = True
Next j
End Sub

Ainsi si NB.SI de 0 est différent de 0 (donc 0 trouvé) alors on masque la colonne, sinon (donc 0 non trouvé, donc une valeur est trouvée) on ne masque pas.

Cdlt,

merci pour votre réponse mais cela me fait un truc étrange des lignes avec que des zéros restent apparentes et certaines colonnes non nulles, pour le coup, ont disparu.

Mon but initial est que les colonnes et les lignes qui comportent que des zéros soient masquées.

Mais la macro que j'ai masque celles qui contiennent que des zéro ET (malheureusement) celles dont la somme fait 0.

merci encore,

Julie

Bonjour,

Lorsque vous dites 0 c'est 0 ou c'est vide ? Car pour un NB.SI la différence est réelle contrairement à une SOMME qui renverra 0 quelque soit le cas.

Car dans votre exemple je n'ai que des lettres ou des cellules vides. Ici si je comprend vous souhaiteriez masquer F, I, K et 18, 22.
Si c'est bien ça alors :

Sub MASQUER_()
Dim i%, j%
Application.ScreenUpdating = False
For i = 14 To 543
    If WorksheetFunction.CountIf(Range("F" & i & ":AD" & i), "><""") = 0 Then Rows(i & ":" & i).EntireRow.Hidden = True
Next i
For j = 6 To 30
    If WorksheetFunction.CountIf(Range(Cells(30, j), Cells(543, j)), "><""") = 0 Then Range(Columns(j), Columns(j)).EntireColumn.Hidden = True
Next j
Application.ScreenUpdating = True
End Sub

Où "><""" compte le nombre de cellule différent de vide, donc égale à quelque chose. Donc si c'est égal à 0, donc si aucune cellule n'est pleine alors on masque.

Cdlt,

Ergotamine,

merci encore de votre temps!

Qd je dis 0 c'est bien zéro, toutes mes cellules contiennent des montants (cf excel ci-joint).

je vous ai mis mon problème : la colonne FL=F05 est masquée alors que j'ai deux lignes non nulles la 213 et 228.
j'ai essayé avec votre option sans succès, je copie colle peut etre mal...

Julie

Bonjour,

C'est dommage vous aviez inscrit votre solution dans la ligne 12 de votre classeur sur le NB.SI à utiliser, il suffisait de modifier mon code pour mettre les bons arguments, ici :

Sub MASQUER_()
Dim i%, j%
Application.ScreenUpdating = False
For i = 14 To 543
    If WorksheetFunction.CountIf(Range("F" & i & ":AD" & i), "<>0") = 0 Then Rows(i & ":" & i).EntireRow.Hidden = True
Next i
For j = 6 To 30
    If WorksheetFunction.CountIf(Range(Cells(30, j), Cells(543, j)), "<>0") = 0 Then Range(Columns(j), Columns(j)).EntireColumn.Hidden = True
Next j
Application.ScreenUpdating = True
End Sub

Cdlt,

sans VBA, c'est tellement évident ...

Je pense que mon problème est lié à la structure assez différente de votre macro à celle initiale. J'ai mis en rouge les éléments différents. J'ai essayé d'adapter sans vraiment connaitre les règles, pas facile.

'Option Explicit

Dim i&, j& ( je pense que c'est important de le garder la pour le sub Affichertout)

Sub Masquer()
Application.ScreenUpdating = False

For i = 14 To 543
If WorksheetFunction.Sum(Range("F" & i & ":AD" & i, "<>0")) = 0 Then
Rows(i & ":" & i).EntireRow.Hidden = True

Next i
For j = 6 To 30
If WorksheetFunction.Sum(Range(Cells(30, j), Cells(543, j)), "<>0") = 0 Then
Range(Columns(j), Columns(j)).EntireColumn.Hidden = True

Next j

Application.ScreenUpdating = True

End Sub

Sub AfficherTout()
Rows("14:543").EntireRow.Hidden = False
Range(Columns(6), Columns(30)).EntireColumn.Hidden = False
End Sub'

J'ai le message d'erreur suivant : "Next sans For"

Merci encore :)

julie

Bonjour,

En effet j'essaie d’optimiser au maximum mes macros de façon à ce qu'elles soient le plus concises possibles, ce qui n'est pas tjs la bonne démarche car j'utilise des raccourcis qui peuvent sembler sans importance alors qu'il y a une signification.

Les tests conditionnels IF s'écrivent de deux façons : Soit sur la même ligne avec la condition et le résultat si vrai, dans ce cas le End If n'est pas nécessaire (Cf. ma macro plus haut), soit sur plusieurs lignes mais dans ce cas il faut terminer par un End If (Cf ma macro ci-dessous).

Donc votre code deviendrait :

Sub Masquer()
Application.ScreenUpdating = False
For i = 14 To 543
    If WorksheetFunction.CountIf(Range("F" & i & ":AD" & i, "<>0")) = 0 Then
        Rows(i & ":" & i).EntireRow.Hidden = True
    End If
Next i
For j = 6 To 30
    If WorksheetFunction.Sum(Range(Cells(30, j), Cells(543, j)), "<>0") = 0 Then
        Range(Columns(j), Columns(j)).EntireColumn.Hidden = True
    End If
Next j
Application.ScreenUpdating = True
End Sub

Sub AfficherTout()
Rows("14:543").EntireRow.Hidden = False
Range(Columns(6), Columns(30)).EntireColumn.Hidden = False
End Sub

Dans votre code vous écriviez le test conditionnel sur 2 lignes sans le terminer par un End If. D'où le message d'erreur, on ne peut passer a un Next Sans For. Le If/EndIf doit être ouvert et fermé au sein de la boucle For/Next.

En espérant que mes explications soient claires.

Cdlt,

il me met une erreur au Countif :'(

il me dit argument non facultatif

désolée de vous déranger encore mais j'ai bien fait copier/coller de votre solution!

jspr y arriver !!

Bonjour,

C'est de ma faute j'ai été trop fainéant pour retester désolé et du coup j'ai pas vu les erreurs de parenthèses !

Sub Masquer_()
Application.ScreenUpdating = False
For i = 14 To 543
    If WorksheetFunction.CountIf(Range("F" & i & ":AD" & i), "<>0") = 0 Then
        Rows(i & ":" & i).EntireRow.Hidden = True
    End If
Next i
For j = 6 To 30
    If WorksheetFunction.CountIf(Range(Cells(30, j), Cells(543, j)), "<>0") = 0 Then
        Range(Columns(j), Columns(j)).EntireColumn.Hidden = True
    End If
Next j
Application.ScreenUpdating = True
End Sub

Cdlt,

Parfait ça marche !

merci !!

Rechercher des sujets similaires à "masquer lignes colonnes contenant que tableau"