XL 2016 VBA For Each dans un For Each

Waldhari

XLDnaute Nouveau
Bonjour,

Je me permets de vous solliciter car je voudrais écrire une macro ayant ce comportement :
Masquer les lignes 21 à 1110 dont la valeur en colonne U est égale à 0, et ce pour toutes les feuilles exceptées celles exclues dans la condition "If".

La macro fonctionne correctement (en partie) car elle ne se lance que que sur la feuille active.
Ma boucle pour la faire tourner sur toutes les feuilles exceptées certaines ne fonctionne pas et je n'arrive pas à comprendre pourquoi.

VB:
Sub MasquerLignesZero()
    Dim Ws As Worksheet
    Dim c As Range
    For Each Ws In Worksheets
    If Ws.Name <> Sheets(1).Name And Ws.Name <> Sheets(2).Name And Ws.Name <> Sheets(3).Name And Ws.Name <> Sheets(4).Name And Ws.Name <> Sheets(5).Name And Ws.Name <> Sheets(6).Name And Ws.Name <> Sheets(7).Name And Ws.Name <> Sheets(18).Name And Ws.Name <> Sheets(19).Name Then
          
        For Each c In Range("U21:U1110")
          c.EntireRow.Hidden = (c = 0)
        Next c

    End If
    Next Ws
End Sub

Il doit y avoir une subtilité mais elle m'échappe.

Pourriez-vous m'aider ?

Je vous remercie par avance
 
Solution
C'est parfait, merci à tous.

Je mets du coup ici la macro modifiée selon vos retours, et qui fonctionne parfaitement :)

VB:
Sub MasquerLignesZero()
    Dim Ws As Worksheet
    Dim c As Range
    For Each Ws In Worksheets
    If Ws.Name <> Sheets(1).Name And Ws.Name <> Sheets(2).Name And Ws.Name <> Sheets(3).Name And Ws.Name <> Sheets(4).Name And Ws.Name <> Sheets(5).Name And Ws.Name <> Sheets(6).Name And Ws.Name <> Sheets(7).Name And Ws.Name <> Sheets(18).Name And Ws.Name <> Sheets(19).Name Then
        With Ws
            For Each c In .Range("U21:U1110")
                c.EntireRow.Hidden = (c = 0)
            Next c
        End With
    End If
    Next Ws
End Sub

cp4

XLDnaute Barbatruc
Bonjour,

Je me permets de vous solliciter car je voudrais écrire une macro ayant ce comportement :
Masquer les lignes 21 à 1110 dont la valeur en colonne U est égale à 0, et ce pour toutes les feuilles exceptées celles exclues dans la condition "If".

La macro fonctionne correctement (en partie) car elle ne se lance que que sur la feuille active.
Ma boucle pour la faire tourner sur toutes les feuilles exceptées certaines ne fonctionne pas et je n'arrive pas à comprendre pourquoi.

VB:
Sub MasquerLignesZero()
    Dim Ws As Worksheet
    Dim c As Range
    For Each Ws In Worksheets
    If Ws.Name <> Sheets(1).Name And Ws.Name <> Sheets(2).Name And Ws.Name <> Sheets(3).Name And Ws.Name <> Sheets(4).Name And Ws.Name <> Sheets(5).Name And Ws.Name <> Sheets(6).Name And Ws.Name <> Sheets(7).Name And Ws.Name <> Sheets(18).Name And Ws.Name <> Sheets(19).Name Then
         
        For Each c In Range("U21:U1110")
          c.EntireRow.Hidden = (c = 0)
        Next c

    End If
    Next Ws
End Sub

Il doit y avoir une subtilité mais elle m'échappe.

Pourriez-vous m'aider ?

Je vous remercie par avance
Bonjour,

Un fichier aurait été le bienvenu.
Remplace les Sheets(x).Name par le nom de la feuille en dur.
exemple si le nom de la feuille Sheet(1) est "MonOnglet"
écris alors if ws.name <> "MonOnglet" ça devrait fonctionner.

A+
 

Waldhari

XLDnaute Nouveau
Bonjour,
Essayez
For Each c In Ws.Range("U21:U1110")

Aaaah merci c'était ce bout qui manquait effectivement :)

Bonjour,

Un fichier aurait été le bienvenu.
Remplace les Sheets(x).Name par le nom de la feuille en dur.
exemple si le nom de la feuille Sheet(1) est "MonOnglet"
écris alors if ws.name <> "MonOnglet" ça devrait fonctionner.

A+

Est-ce que ce n'est pas mieux de laisser comme je l'ai fait ? Si les noms des onglets sont modifiés ça ne perturbera pas la macro, ou je me trompe ?

Merci bcp à vous deux
 

yal

XLDnaute Occasionnel
Bonjour
Il faudrait préciser sur quelle feuille travailler.
VB:
Sub MasquerLignesZero()
    Dim Ws As Worksheet
    Dim c As Range
    For Each Ws In Worksheets
    If Ws.Name <> Sheets(1).Name And Ws.Name <> Sheets(2).Name And Ws.Name <> Sheets(3).Name And Ws.Name <> Sheets(4).Name And Ws.Name <> Sheets(5).Name And Ws.Name <> Sheets(6).Name And Ws.Name <> Sheets(7).Name And Ws.Name <> Sheets(18).Name And Ws.Name <> Sheets(19).Name Then
        With Ws 
            For Each c In .Range("U21:U1110")
                  c.EntireRow.Hidden = (c = 0)
            Next c

        End If
    end with
    Next Ws
End Sub
 

Waldhari

XLDnaute Nouveau
C'est parfait, merci à tous.

Je mets du coup ici la macro modifiée selon vos retours, et qui fonctionne parfaitement :)

VB:
Sub MasquerLignesZero()
    Dim Ws As Worksheet
    Dim c As Range
    For Each Ws In Worksheets
    If Ws.Name <> Sheets(1).Name And Ws.Name <> Sheets(2).Name And Ws.Name <> Sheets(3).Name And Ws.Name <> Sheets(4).Name And Ws.Name <> Sheets(5).Name And Ws.Name <> Sheets(6).Name And Ws.Name <> Sheets(7).Name And Ws.Name <> Sheets(18).Name And Ws.Name <> Sheets(19).Name Then
        With Ws
            For Each c In .Range("U21:U1110")
                c.EntireRow.Hidden = (c = 0)
            Next c
        End With
    End If
    Next Ws
End Sub
 

RF13

XLDnaute Nouveau
Bonjour,
J'arrive un peu après la bataille, mais comme j'ai testé une modification je la propose ci-dessous (dans une forme un peu plus simple pour les tests) :

Sub MasquerLignesZero()
Dim Ws As Object, c As Range, feuille As String
Application.ScreenUpdating = False
feuille = ActiveSheet.Name
For Each Ws In Worksheets
If Ws.Name <> Sheets(1).Name And Ws.Name <> Sheets(2).Name And Ws.Name <> Sheets(3).Name Then
Ws.Activate
For Each c In Range("A1:A36")
c.EntireRow.Hidden = (c = 0)
Next c
End If
Next Ws
Sheets(feuille).Activate
Application.ScreenUpdating = True
End Sub
 

Discussions similaires

Réponses
7
Affichages
292
Réponses
1
Affichages
119
Réponses
4
Affichages
151

Statistiques des forums

Discussions
311 720
Messages
2 081 915
Membres
101 837
dernier inscrit
Ugo