Cacher des lignes si la SOMME de ces lignes est vide

Bonjour,

Je suis toujours embêtée pas la mise en forme de mon modèle de fiche de production.

Cette fiche contient la liste des articles référencés, avec leurs caractéristiques.

Il y a des entêtes pour séparer chaque type de support.

Et une ligne vide en fin de section pour que les opérateurs puissent annoter lors de la production.

J'ai déjà une macro me permettant de cacher les lignes vides individuellement mais pas les entêtes et lignes de séparation.

Maintenant je cherche un moyen pour masquer l'entête et la ligne d'annotation si aucun des articles de la section concerné n'est à produire. J'ai eu beau chercher je n'ai pas trouvé de moyen de cacher des lignes spécifiques si la somme d'une plage est vide.

Help please.

Bonjour

Dans vos codes Masquer, la variable Valeur est toujours égale à 2. Il y a une raison ? A moins que vous ayez d'autres fichiers où 2 devient autre chose vous pourriez mettre --> Cells(nblgn, 2)

Sinon est-ce qu'en utilisant votre premier code comme ci-dessous, cela correspond à votre demande ?

Sub MasquerLigneNida11()
Dim Debutlgn As Byte, Finlgn As Byte, valeur As Byte, nblgn as byte
Debutlgn = 6
Finlgn = 6
valeur = 2
For nblgn = Debutlgn To Finlgn
    If Cells(nblgn, valeur).Value < 1 Then
        Cells(nblgn, valeur).EntireRow.Hidden = True
        Cells(nblgn - 1, valeur).EntireRow.Hidden = True
    End If
Next nblgn
End Sub

ou ceci plutôt

Sub MasquerLigneNida11()
Dim Debutlgn As Byte, Finlgn As Byte, nblgn as byte
Debutlgn = 6
Finlgn = 6
For nblgn = Debutlgn To Finlgn
    If Cells(nblgn, 2).Value < 1 Then
        Cells(nblgn, 2).EntireRow.Hidden = True
        Cells(nblgn - 1, 2).EntireRow.Hidden = True
    End If
Next nblgn
End Sub

Bonjour à tous,

Une autre solution. Regardez les formules présentes dans la colonne O.

Sub LancerM10_MasquerLesTitres()

    M10_MasquerLesTitres Sheets("Modèle")

End Sub

Sub M10_MasquerLesTitres(ByVal Sh As Worksheet)

Dim I As Integer, DerniereLigne As Integer
Dim AireColonneO As Range

    Application.ScreenUpdating = False
    With Sh
         DerniereLigne = .Cells(.Rows.Count, 1).End(xlUp).Row
         Set AireColonneO = .Range(.Cells(5, "O"), .Cells(DerniereLigne, "O"))
         For I = AireColonneO.Count To 1 Step -1
             With AireColonneO(I)
                  If .Value = 0 Then .EntireRow.Hidden = True
             End With
         Next I
         Set AireColonneO = Nothing
    End With
    Application.ScreenUpdating = True

End Sub

Merci de vos réponses, je vais tester dès que j'ai un moment.

@Dan : le code je l'ai trouvé sur cours-gratuit.com, j'avoue avoir honteusement pompé. Alors dire à quoi correspond le 2...

@Dan : ces deux options ne masquent que l'en tête et pas la ligne d'annotation.

@Eric : ca semble très bien marcher ! Par contre je suis blonde va falloir m'aider un peu : une fois copié les formules de la colonne O à quoi est-ce que j'attribue "M10 masquer les titres" ?

2e point mon fichier de travail contient actuellement 42 fiches de production, il me suffit de copier la colonne O et la macro sur toutes les feuilles?

Je vous remercie tous les deux de votre aide !

Comment s'appellent tes fiches ?

Elles portent le nom de la commande type "FT 4600"

Comment s'appellent les shapes pour lancer la macro sur chaque onglet ?

Elles portent toutes le même nom ?

Toutes les feuilles de production sont identiques à celle du fichier type que j'ai joint, seules les quantités changent. Quand j'en crée une nouvelle je duplique mon modèle.

Le fichier comporte quatre feuilles de récap au début, je ne sais pas si cette information est importante.

Ok.

Il te faut modifier la procédure comme ceci. Elle n'est plus paramétrique puisqu'elle doit s'appliquer à n'importe quel onglet.

Option Explicit

Sub M10_MasquerLesTitres()

Dim I As Integer, DerniereLigne As Integer
Dim AireColonneO As Range

    Application.ScreenUpdating = False
    With ActiveSheet
         DerniereLigne = .Cells(.Rows.Count, 1).End(xlUp).Row
         Set AireColonneO = .Range(.Cells(5, "O"), .Cells(DerniereLigne, "O"))
         For I = AireColonneO.Count To 1 Step -1
             With AireColonneO(I)
                  If .Value = 0 Then .EntireRow.Hidden = True
             End With
         Next I
         Set AireColonneO = Nothing
    End With
    Application.ScreenUpdating = True

End Sub

Ensuite la procédure suivante :

  • crée un onglet Menu qui répertorie tes onglets dont le nom commence par FT
  • Copie les formules de la colonne O du modèle sur la colonne O de chaque onglet client.
  • Crée un lien hypertexte pour accéder plus facilement à l'onglet client.

Pensez à modifier également le nom de la macro dans la Shape de l'onglet Modèle.

Attention, prendre cette version :

Option Explicit

Sub Mod11_CreationOngletMenu()

Dim I As Integer, J As Integer
Dim ShMenu As Worksheet
Dim LigneOnglet As ListRow
Dim AdresseLien As String
Dim AireColonneO As Range

    On Error GoTo Fin

    Set AireColonneO = Sheets("Modèle").Range("O1:O73")

    For I = Sheets.Count To 1 Step -1
        If Sheets(I).Name = "Menu" Then
           Application.DisplayAlerts = False
           Sheets(I).Delete
           Application.DisplayAlerts = True
           Exit For
        End If
    Next I

    Set ShMenu = Sheets.Add(before:=Sheets(1))
    With ShMenu
         .Name = "Menu"
         .Range(.Cells(10, 1), .Cells(10, 3)) = Array("Onglet", "Client", "Lien")
         .ListObjects.Add(xlSrcRange, Range("$A$10:$C$10"), , xlYes).Name = "TableDesOnglets"
    End With

    For I = 1 To Sheets.Count
        Select Case Sheets(I).Name
               Case "Menu", "Modèle"

               Case Else
                    Set LigneOnglet = ShMenu.ListObjects("TableDesOnglets").ListRows.Add
                    With LigneOnglet
                         .Range(1, 1) = Sheets(I).Name
                         If Left(Sheets(I).Name, 2) = "FT" Then
                            .Range(1, 2) = "X"
                            AdresseLien = "'" & .Range(1, 1) & "'!A1"
                            ShMenu.Hyperlinks.Add Anchor:=LigneOnglet.Range(1, 3), Address:="", SubAddress:=AdresseLien, TextToDisplay:=CStr(I)
                            AireColonneO.Copy Destination:=Sheets(I).Range("O1")

                            With Sheets(I)
                                 .Activate
                                  For J = 1 To .Shapes.Count
                                      If .Shapes(J).Name = "Button 2" Then
                                         .Shapes(J).OnAction = "M10_MasquerLesTitres"
                                      End If
                                  Next J
                            End With
                         End If

                    End With
                    Set LigneOnglet = Nothing
        End Select

    Next I

    ShMenu.Activate

    GoTo Fin

Fin:

    Set ShMenu = Nothing

End Sub

Bon alors j'ai collé le Mod 10 dans un module (en modifiant la colonne de référence car sur le fichier d'origine c'est la P).

Puis j'ai collé la 2e version de la procédure Mod 11 (en modifiant la colonne de référence car sur le fichier d'origine c'est la P et le nom de 'client' en 'type').

J'ai créé un onglet nommé "Menu" dans lequel colonne A est le nom des onglets en Ft, colonne B le type, colonne C pour le lien.

Par contre c'est quoi la shape ? Je dois modifier le nom du bouton ?

Et du coup cette macro pourrait totalement remplacer celle que j'utilisait pour cacher les lignes vides si j'ai tout compris à son fonctionnement ....

L'onglet Menu est créé automatiquement et s'il est existant, il est supprimé (dans cette version).

La shape, c'est la forme (le bouton) qui te permet de lancer la macro sur un onglet client.

Il faut penser à remplacer le nom de la macro dans la shape du modèle pour qu'il soit pris en compte dans tes nouveaux onglets.

Avant de manipuler sur ton fichier, fais des essais sur le mien.

Normalement ma macro qui filtre tes enregistrements devrait remplacer toutes les tiennes.

J'ai fait une copie de sauvegarde. Ok alors ça remplace bien l'onglet menu. Ma macro pour l'impression fonctionne toujours.

Donc au lieu de "Button 2" j'écris "Masquer postes vides" c'est bien ça ?

Parce que le moment la seule chose que ça fait c'est créer le menu....

Fin de la journée de boulot, je m'y remets première heure demain matin .

Non, normalement il n'y a rien à faire.

Il te faut seulement vérifier que tes boutons ont bien le nom comme dans cette capture :

capture

Bonjour,

Alors, voilà mon code.

Option Explicit

Sub Mod11_CreationOngletMenu()

Dim I As Integer, J As Integer
Dim ShMenu As Worksheet
Dim LigneOnglet As ListRow
Dim AdresseLien As String
Dim AireColonneP As Range

    On Error GoTo Fin

    Set AireColonneP = Sheets("Modèle").Range("P1:P73")

    For I = Sheets.Count To 1 Step -1
        If Sheets(I).Name = "Menu" Then
           Application.DisplayAlerts = False
           Sheets(I).Delete
           Application.DisplayAlerts = True
           Exit For
        End If
    Next I

    Set ShMenu = Sheets.Add(before:=Sheets(1))
    With ShMenu
         .Name = "Menu"
         .Range(.Cells(1, 1), .Cells(1, 2)) = Array("Onglet", "Lien")
         .ListObjects.Add(xlSrcRange, Range("$A$1:$B$1"), , xlYes).Name = "TableDesOnglets"
    End With

    For I = 1 To Sheets.Count
        Select Case Sheets(I).Name
               Case "Menu", "Modèle"

               Case Else
                    Set LigneOnglet = ShMenu.ListObjects("TableDesOnglets").ListRows.Add
                    With LigneOnglet
                         .Range(1, 1) = Sheets(I).Name
                         If Left(Sheets(I).Name, 2) = "FT" Then
                            .Range(1, 2) = "X"
                            AdresseLien = "'" & .Range(1, 1) & "'!A1"
                            ShMenu.Hyperlinks.Add Anchor:=LigneOnglet.Range(1, 3), Address:="", SubAddress:=AdresseLien, TextToDisplay:=CStr(I)
                            AireColonneP.Copy Destination:=Sheets(I).Range("P1")

                            With Sheets(I)
                                 .Activate
                                  For J = 1 To .Shapes.Count
                                      If .Shapes(J).Name = "Masquer postes vides" Then
                                         .Shapes(J).OnAction = "M10_MasquerLesTitres"
                                      End If
                                  Next J
                            End With
                         End If

                    End With
                    Set LigneOnglet = Nothing
        End Select

    Next I

    ShMenu.Activate

    GoTo Fin

Fin:

    Set ShMenu = Nothing

End Sub

Ya quelque chose qui va pas parce que ça fait rien à part exécuter ma macro d'origine.

Si j'attribue M10_MasquerLesTitres à mon bouton ça fonctionne mais me cache aussi la ligne de total et tout ce qui se trouve après (ma liste de besoins)

Si j'attribue Mod11_CreationOngletMen à mon bouton ça met à jour l'onglet menu ... et c'est tout.

11copie-anonyme.zip (224.73 Ko)

@Eric Merci mille fois !

En désespoir de cause j'ai enregistré le fichier que tu as modifié et je vais importer mes onglets dedans parce que ça ira plus vite, j'aurai juste à copier la colonne p et l'attribution de macro au bouton à changer.

Bon ça cache toujours mes besoins mais tant pis.

Vraiment merci beaucoup.

Utilise cette macro :

Utilité d'instancier la variable MaShape : Après l'avoir instanciée, tu as accès aux propriétés et méthodes applicables à l'objet.

Sub Mod11_ChangerLesOnActionDeShapes()

Dim I As Integer, J As Single
Dim MaShape As Shape

    For I = 1 To Sheets.Count
        Select Case Sheets(I).Name
               Case "Menu"

               Case Else
                    With Sheets(I)
                        .Activate
                        For J = 1 To .Shapes.Count
                            Select Case .Shapes(J).Type
                                   Case 8
                                       Set MaShape = .Shapes(J)
                                       If MaShape.TextFrame.Characters.Count > 0 Then
                                          If MaShape.TextFrame.Characters.Text = "Masquer postes vides" Then
                                           'Debug.Print MaShape.Name & ", " & MaShape.Type
                                             MaShape.OnAction = "M10_MasquerLesTitres"
                                          End If
                                       End If
                                       Set MaShape = Nothing

                            End Select
                        Next J
                    End With
        End Select

    Next I

    Sheets("Menu").Activate

End Sub

Ok je me penche là dessus lundi.

Sinon, question bête : on fait comment pour mettre à jour le menu?

Bon week-end.

Rechercher des sujets similaires à "cacher lignes somme vide"