Macro - Masquer ligne si une des cellules de la plage <>0

Bonsoir à tous,

J'ai tenté de faire une macro sans succès, est ce que quelqu'un pourrait me filer un coup de pouce

J'ai tenté de bidouiller un code à partir d'une macro enregistée en pas à pas... mais ca ne fonctionne pas.

Je suis sure que je me suis compliqué la vie, et qu'un code plus simple peux fonctionner mais je suis encore un bitos en VBA 8)

Le but de ma macro est de lire les lignes 8 à 1900, et si dans la ligne qui est lue, la valeur en colonne D n'est pas 0, ni dans la colonne E, ni F etc jusqu'à la colonne U, alors la ligne reste visible, en revanche, si j'ai un 0 dans toutes les colonnes de D à U, il faudrai que la ligne se masque.

Merci d'avance pour votre aide.

Si besoin je peux mettre le code de ma premiere macro mais a mon avis c'est plus à porter confusion qu'a aider

Bonsoir Christucci,

si j'ai bien compris...

Cette macro cache la ligne si un zéro apparaît sur la ligne entre D et U.

Pas très bien compris s'il fallait une ligne complète de zéro ou si un seul suffisait pour cacher la ligne... qui devra bien réapparaître un jour, non??

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Application.ScreenUpdating = False
'
For x = 8 To 1900
    For y = 4 To 21    'colonnes de D à U
        If Cells(x, y) = 0 Then
            Rows(x).Hidden = True
            Exit For
        End If
    Next
Next
'
Application.ScreenUpdating = True
'
End Sub

A+

Bonsoir,

Il me semble que je n'ai pas tout à fait compris la même chose.

En annexe, mon essai.

Cordialement.

69classeur1.xlsm (19.37 Ko)

Bonjour, merci à vous deux.

Curulis, je n'ai pas réussis à exécuter ta macro, quel est la différence entre le SUB et PRIVATE SUB?

J'ai besoin de masquer les ligne en appuyant sur un bouton, je n'ai pas trouvé la macro dans la liste avec F8.

Je m'en suis bien mieux sortis avec la macro d'Yvouille.

Sub Masquer()
Dim i As Integer

Application.ScreenUpdating = False

For i = 8 To 1900
    If WorksheetFunction.Sum(Range("D" & i & ":U" & i)) = 0 Then Rows(i).EntireRow.Hidden = True
Next i

End Sub

J'avais le même résultat avec ma macro, j'avais enregistrer pas a pas, en filtrant, ajoutant une autre colonne pour faire la somme puis en filtrant et critèrisant sur le résultat <> de 0, mais c'était long à s'exécuter, ca plantais de temps en temps, d'ou ma demande ici.

Merci beaucoup Yvouille

Juste une autre demande, en fait, si j'ai -1 dans la colonne E et +1 en F, la somme de la ligne fait zero et elle se masque, un moyen existe-il d'y remédier ?

Merci d'avance

Salut,

Je te propose une solution très ''bricolée'' pour résoudre ton problème. Je vais placer une demande en parallèle afin de tenter d'améliorer cette solution ; tu peux suivre le sujet si ça t'intéresse.

Amicalement.

NB : Si tu avais fourni un fichier-modèle, on aurait gagné 2 messages

40classeur1-v2.xlsm (19.77 Ko)

Bonjour,

J'essaierais ainsi (non testé, car pas de fichier...) :

Sub Test()
    Dim lgn, i%, k%
    Application.ScreenUpdating = False
    With ActiveSheet
        For i = 8 To 1900
            lgn = .Range("D" & i).Resize(, 18).Value
            For k = 1 To 18
                If lgn(1, k) < 0 Then lgn(1, k) = -lgn(1, k)
            Next k
            If WorksheetFunction.Sum(lgn) = 0 Then .Rows(i).Hidden = True
        Next i
    End With
End Sub

Cordialement.

Salut Christrucci,

Je t'avais promis d'aller chercher une solution sur le Forum. La voici :

For i = 8 To 1900
    If Evaluate("SUMPRODUCT(ABS(D" & i & ":U" & i & "))") = 0 Then Rows(i).EntireRow.Hidden = True
Next i

Bonnes salutations.

47classeur1-v3.xlsm (19.61 Ko)
Yvouille a écrit :

Salut Christrucci,

Je t'avais promis d'aller chercher une solution sur le Forum. La voici :

For i = 8 To 1900
    If Evaluate("SUMPRODUCT(ABS(D" & i & ":U" & i & "))") = 0 Then Rows(i).EntireRow.Hidden = True
Next i

Bonnes salutations.

M A G N I F I Q U E !

Merci beaucoup !

Le code est encore plus court, j'y comprend rien mais ca marche super

MERCI

Christrucci a écrit :

.. j'y comprend rien ...

Si ça t'intéresse de comprendre, je veux bien encore t'offrir de mon temps et t'expliquer au mieux, mais je ne veux pas non plus perdre mon temps si tu te contentes de la solution sans comprendre (ce que je comprendrais ).

A toi de dire.

Yvouille a écrit :
Christrucci a écrit :

.. j'y comprend rien ...

Si ça t'intéresse de comprendre, je veux bien encore t'offrir de mon temps et t'expliquer au mieux, mais je ne veux pas non plus perdre mon temps si tu te contentes de la solution sans comprendre (ce que je comprendrais ).

A toi de dire.

Oh au contraire, ca fait quelque temps que je fais du VBA mais j'ai appris "à l'arrache" en regardant et lisant le forum à droite à gauche.

Si cela ne te prend pas trop longtemps je veux bien une explication à ce code merci

Salut,

La fonction ABS() renvoie le nombre sans son signe, donc ABS(1) + ABS(-1) = 1 + 1 = 2.

On aurait donc pu placer une formule dans la colonne V qui indiquerait le total absolu de la plage D:U correspondante avec la formules matricielle {=SOMMEPROD(ABS(D8:U8))} en V8 et incrémentée vers le bas afin de contrôler si le résultat était 0 ou non – comme dans le fichier ci-joint – et utiliser cette valeur de la colonne V afin de savoir s’il faut masquer une ligne ou non.

Ces formules dans la colonne V auraient pu être placées provisoirement par l’intermédiaire de la macro et effacées à la fin du code. La ligne de code pour la cellule V8 par exemple aurait été

Range("V8").FormulaArray = "=SUMPRODUCT(ABS(RC[-18]:RC[-1]))"

Ou

Range("V8") = Evaluate("SUMPRODUCT(ABS(D8:U8))")

La première des deux lignes de code ci-dessus place une formule dans la cellule V8, ce qui peut passablement alourdir le fichier si une grande quantité de lignes Excel sont traitées alors que la deuxième inscrit le résultat d’un calcul.

Afin de ne pas devoir inscrire le résultat de ce calcul dans la colonne V, on peut l’utiliser directement dans la macro par exemple pour la ligne 8 par l’instruction

If Evaluate("SUMPRODUCT(ABS(D8:U8))") = 0 Then ……

Afin de pouvoir utiliser cette instruction dans une boucle For i = x to x/Next, il faut juste remplacer les références à la ligne (8) par une variable (i), sans se tromper avec les signes " et ().

For i = 8 to 1900
       If Evaluate("SUMPRODUCT(ABS(D" & i & ":U" & i & "))") = 0 Then …..
Next

Pour ce travail je me suis rendu compte par la suite qu'il n'aurait pas été nécessaire de travailler avec des formules matricielles, une formule normale =SOMMEPROD(ABS(D8:U8)) aurait fonctionné la même chose.

Cordialement.

NB : ce n'est pas la peine de reprendre à chaque fois tout le message précédent, il est inscrit juste en-dessus.

12classeur1-v4.xlsm (14.82 Ko)

Merci Yvouille pour toutes ces explications

MFerrand a écrit :

Bonjour,

J'essaierais ainsi (non testé, car pas de fichier...) :

Sub Test()
    Dim lgn, i%, k%
    Application.ScreenUpdating = False
    With ActiveSheet
        For i = 8 To 1900
            lgn = .Range("D" & i).Resize(, 18).Value
            For k = 1 To 18
                If lgn(1, k) < 0 Then lgn(1, k) = -lgn(1, k)
            Next k
            If WorksheetFunction.Sum(lgn) = 0 Then .Rows(i).Hidden = True
        Next i
    End With
End Sub

Cordialement.

J'ai testé cela fonctionne aussi très bien Merci

Bonsoir,

Merci de le confirmer...

Rechercher des sujets similaires à "macro masquer ligne plage"