Sub BoutonFormulaire()
If IsError(Application.Caller) Then Exit Sub
Dim o As Object, r As Range, masque As Range
Set o = ActiveSheet.DrawingObjects(Application.Caller)
If o.Text = "Masquer" Then
o.Text = "Afficher"
On Error Resume Next
Set r = Cells.SpecialCells(xlCellTypeConstants, 2).EntireRow
Set r = Intersect(r, Cells.SpecialCells(xlCellTypeConstants, 1).EntireRow)
For Each r In r.Rows
If Application.Sum(r) = 0 Then _
Set masque = Union(r, IIf(masque Is Nothing, r, masque))
Next
masque.EntireRow.Hidden = True
Else
o.Text = "Masquer"
Rows.Hidden = False
End If
End Sub