IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Masquer/demasquer lignes sur fichier verouillé


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut Masquer/demasquer lignes sur fichier verouillé
    Bonjour à tous,

    J'ai un projet excel les feuillets suivants:

    - PageDeGarde
    - Total
    - Réactifs
    - Calibrateurs
    - Contrôles

    Mon classeur contenant de nombreuses liaisons et calculs, j'ai verrouillé les feuillets et le classeur. Le soucis est dans ce cas que je ne peux plus créer des groupes pour masquer les lignes non utilisés.

    J'ai testé le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub Workbook_Open()
    With Worksheets("Total")
        .EnableAutoFilter = True
        .EnableOutlining = True
        .Protect Contents:=True, Password:="Toto", UserInterfaceOnly:=True
    End With
    End Sub
    cela fonctionne uniquement pour des groupements déjà créé. On peux pas en créer de nouveau sur le classeur verouillé (en tout cas j'ai pas trouvé).

    Je cherche donc à masquer les lignes de chaque Feuillet du classeur qui contiennent "---" dans la colonne K. Les lignes ne se suivant pas forcement. Mais toutes sont incluses entre la ligne 12 et la ligne 100 de chaque feuillet.

    Comment faire à partir d'un seul bouton (placé sur le feuillet "PageDeGarde") pour masquer ou demasquer sur chaque feuillets, toutes les lignes contenant "---" dans la colonne donnée?

    Merci pour votre aide

    ps: si possible du vba compatible Excel 2003, 2007, 2010

  2. #2
    Invité
    Invité(e)
    Par défaut
    Essayez ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    Private ListeDesPages As Variant
     
    Private I As Long
    Private PremiereLigneK As Long
     
    Private DerniereLigneK As Long
    Private ColonneK As Long
     
    Private Cellule As Range
     
    Private Sh As Worksheet
     
    Private Continuer As Boolean
     
    Private MotDePasseFeuilles As String
     
     
    Sub CacherDeCacherLesLignes(NatureOperation As String, PremiereLigneACacher As Long, DerniereLigneACacher As Long, MotDePasse As String)
     
        ColonneK = 11
     
        ListeDesPages = Array("PageDeGarde", "Total", "Réactifs", "Calibrateurs", "Contrôles")
     
        For I = 1 To 5
     
                Continuer = False
     
                For Each Sh In Sheets
                     Select Case Sh.Name
                            Case ListeDesPages(I - 1)
                                 Continuer = True
                     End Select
                 Next Sh
     
                 If Continuer = True And NatureOperation = "Décacher" Then
     
                     With Sheets(ListeDesPages(I - 1))
                        .Activate
                        .Unprotect Password:=MotDePasse
                        .Range(Cells(PremiereLigneACacher, ColonneK), Cells(DerniereLigneACacher, ColonneK)).EntireRow.Hidden = False
                        .Protect Password:=MotDePasse
                     End With
     
                 End If
     
                 If Continuer = True And NatureOperation = "Cacher" Then
     
                     With Sheets(ListeDesPages(I - 1))
                        .Activate
                        .Unprotect Password:=MotDePasse
                     End With
     
                     DerniereLigneK = Cells(ActiveSheet.Rows.Count, ColonneK).End(xlUp).Row
                     Range(Cells(PremiereLigneACacher, ColonneK), Cells(DerniereLigneACacher, ColonneK)).Select
     
                     For Each Cellule In Selection
                         Select Case Cellule
                            Case "---"
                                Cellule.EntireRow.Hidden = True
                         End Select
                     Next Cellule
                     ActiveSheet.Protect Password:=MotDePasse
     
                 End If
     
        Next I
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub TestCacherLesLignes()
     
        PremiereLigneK = 12
        DerniereLigneK = 100
        MotDePasseFeuilles = "Toto"
     
       Call CacherDeCacherLesLignes("Cacher", PremiereLigneK, DerniereLigneK, MotDePasseFeuilles)
     
       MsgBox ("Fin de programme !")
     
    End Sub


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub TestDeCacherLesLignes()
     
        PremiereLigneK = 12
        DerniereLigneK = 100
        MotDePasseFeuilles = "Toto"
     
        Call CacherDeCacherLesLignes("Décacher", PremiereLigneK, DerniereLigneK, MotDePasseFeuilles)
     
        MsgBox ("Fin de programme !")
     
    End Sub
    Cordialement.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    Bonjour,

    Merci pour ton code, il fonctionne parfaitement.

    Par contre, j'ai trois questions:

    - ton code balaye les lignes une par une et les masques si besoin. C'est assez long. Y a pas moyen de d'accélérer le truc?

    - à la fin de la procédure, comment remettre le focus sur la feuille "Page de Garde"?

    - Enfin, il y a t-il moyen de faire la même chose mais en utilisant un seul bouton?


    A l'avance un grand merci pour ton aide

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Si le tableau comporte plein de liaisons et de formules, c'est normal qu'il mette du temps. Le code suivant élimine le rafraichissement de l'écran, neutralise les calculs pendant la mise en forme et les remet en automatique à la fin.

    Le programme renvoie sur la Page de garde à la fin.

    Par contre, si un bouton est nécessaire, tout le monde va pouvoir utiliser les boutons. Le classeur joint, comprend 4 boutons "Cacher les lignes", "Décacher les lignes", "Déverrouiller", "Verrouiller".

    Le lancement de la macro "Déverrouiller" avec Alt-F8 déverrouille les feuilles et fait apparaître tous les boutons. Le clic sur le bouton Vérrouiller met les mots de passe et fait disparaître les boutons.

    Cordialement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    Option Explicit
     
    Private ListeDesPages As Variant
     
    Private I As Long
    Private PremiereLigneK As Long
     
    Private DerniereLigneK As Long
    Private ColonneK As Long
     
    Private Cellule As Range
     
    Private Sh As Worksheet
     
    Private Continuer As Boolean
     
    Private MotDePasseFeuilles As String
     
     
    Sub CacherDeCacherLesLignes(NatureOperation As String, PremiereLigneACacher As Long, DerniereLigneACacher As Long, MotDePasse As String)
     
        ColonneK = 11
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
     
        ListeDesPages = Array("PageDeGarde", "Total", "Réactifs", "Calibrateurs", "Contrôles")
     
        For I = 1 To 5
     
                Continuer = False
     
                For Each Sh In Sheets
                     Select Case Sh.Name
                            Case ListeDesPages(I - 1)
                                 Continuer = True
                     End Select
                 Next Sh
     
                 If Continuer = True And NatureOperation = "Décacher" Then
     
                     With Sheets(ListeDesPages(I - 1))
                        .Activate
                        .Unprotect Password:=MotDePasse
                        .Range(Cells(PremiereLigneACacher, ColonneK), Cells(DerniereLigneACacher, ColonneK)).EntireRow.Hidden = False
                        .Protect Password:=MotDePasse
                     End With
     
                 End If
     
                 If Continuer = True And NatureOperation = "Cacher" Then
     
                     With Sheets(ListeDesPages(I - 1))
                        .Activate
                        .Unprotect Password:=MotDePasse
                     End With
     
                     DerniereLigneK = Cells(ActiveSheet.Rows.Count, ColonneK).End(xlUp).Row
                     Range(Cells(PremiereLigneACacher, ColonneK), Cells(DerniereLigneACacher, ColonneK)).Select
     
                     For Each Cellule In Selection
                         Select Case Cellule
                            Case "---"
                                Cellule.EntireRow.Hidden = True
                         End Select
                     Next Cellule
                     ActiveSheet.Protect Password:=MotDePasse
     
                 End If
     
        Next I
     
        Sheets("PageDeGarde").Activate
     
         Application.Calculation = xlAutomatic
         Application.ScreenUpdating = True
     
    End Sub
     
     
     
     
    Sub TestCacherLesLignes()
     
        PremiereLigneK = 12
        DerniereLigneK = 100
        MotDePasseFeuilles = "Toto"
     
       Call CacherDeCacherLesLignes("Cacher", PremiereLigneK, DerniereLigneK, MotDePasseFeuilles)
     
       MsgBox ("Fin de programme !")
     
    End Sub
     
     
     
    Sub TestDeCacherLesLignes()
     
        PremiereLigneK = 12
        DerniereLigneK = 100
        MotDePasseFeuilles = "Toto"
     
        Call CacherDeCacherLesLignes("Décacher", PremiereLigneK, DerniereLigneK, MotDePasseFeuilles)
     
        MsgBox ("Fin de programme !")
     
    End Sub
     
     
     
     
     
    Sub GenererLesFeuilles()
     
    ListeDesPages = Array("PageDeGarde", "Total", "Réactifs", "Calibrateurs", "Contrôles")
     
    For I = 1 To 5
     
            Continuer = True
     
            For Each Sh In Sheets
     
                 Select Case Sh.Name
                        Case ListeDesPages(I - 1)
                             MsgBox (Sh.Name)
                             Continuer = False
                 End Select
             Next Sh
     
             If Continuer = True Then
                            Sheets.Add
                            ActiveSheet.Name = ListeDesPages(I - 1)
                 End If
     
     
    Next I
     
     
    End Sub
     
     
     
    Sub DeprotegerLesFeuilles()
     
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
     
        ListeDesPages = Array("PageDeGarde", "Total", "Réactifs", "Calibrateurs", "Contrôles")
        MotDePasseFeuilles = "Toto"
     
        For I = 1 To 5
     
                Continuer = True
     
                For Each Sh In Sheets
     
                     Select Case Sh.Name
                            Case ListeDesPages(I - 1)
                                 Sh.Activate
                                 Sh.Unprotect Password:=MotDePasseFeuilles
                                 Continuer = False
                     End Select
                 Next Sh
     
         Next I
     
         Sheets("PageDeGarde").Activate
     
         ActiveSheet.Shapes.Range(Array("BoutonVerrouiller", "BoutonDecacher", _
            "BoutonCacherLesLignes", "BoutonDeverrouiller")).Visible = True
     
     
         Application.Calculation = xlAutomatic
         Application.ScreenUpdating = True
     
     
    End Sub
     
     
     
     
    Sub ProtegerLesFeuilles()
     
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
     
        ListeDesPages = Array("PageDeGarde", "Total", "Réactifs", "Calibrateurs", "Contrôles")
        MotDePasseFeuilles = "Toto"
     
        For I = 1 To 5
     
                Continuer = True
     
                For Each Sh In Sheets
     
                     Select Case Sh.Name
                            Case ListeDesPages(I - 1)
                                 Sh.Activate
                                 If Sh.Name = "PageDeGarde" Then
                                      ActiveSheet.Shapes.Range(Array("BoutonVerrouiller", "BoutonDecacher", _
                                            "BoutonCacherLesLignes", "BoutonDeverrouiller")).Visible = False
                                 End If
                                 Sh.Protect Password:=MotDePasseFeuilles
                     End Select
                 Next Sh
     
         Next I
     
         Sheets("PageDeGarde").Activate
     
         Application.Calculation = xlAutomatic
         Application.ScreenUpdating = True
     
     
    End Sub

    Cordialement.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    salut,

    merci pour ton modèle. En fait mes boutons masquer/demasquer doivent être accessible à tout le monde... c'est juste pour la mise en forme finale du document.

    Par contre il doit être verouillé pour eviter toutes mauvaises manip sur les liaisons ect..

    J'ai adapter ton modèle et effectivement ça accélère pas mal le processus. On passe de quasi 1 min à environ 10 secondes.

    Par contre, pour ma culture personnelle, penses tu que ce soit également faisable en utilisant des Range?

    Un truc du genre on balaye des cellules en K, si ="---" on l'ajoute au Range et ensuite faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Set Plage = Range.... a completer car sait pas le faire
    If Plage.Hidden = True Then
    Plage.Hidden = False
    Else
    Plage.Hidden = True
    End If
    cela permettrait d'avoir qu'un seul bouton, non?

    merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pour laisser apparent les deux boutons BoutonCacher, BoutonDecacher, il suffit de les supprimer dans les macros DeprotegerLesFeuilles, ProtegerLesFeuilles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    Sub DeprotegerLesFeuilles()
     
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
     
        ListeDesPages = Array("PageDeGarde", "Total", "Réactifs", "Calibrateurs", "Contrôles")
        MotDePasseFeuilles = "Toto"
     
        For I = 1 To 5
     
                Continuer = True
     
                For Each Sh In Sheets
     
                     Select Case Sh.Name
                            Case ListeDesPages(I - 1)
                                 Sh.Activate
                                 Sh.Unprotect Password:=MotDePasseFeuilles
                                 Continuer = False
                     End Select
                 Next Sh
     
         Next I
     
         Sheets("PageDeGarde").Activate
     
         ActiveSheet.Shapes.Range(Array("BoutonVerrouiller","BoutonDeverrouiller")).Visible = True
     
     
         Application.Calculation = xlAutomatic
         Application.ScreenUpdating = True
     
     
    End Sub
     
     
     
     
    Sub ProtegerLesFeuilles()
     
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
     
        ListeDesPages = Array("PageDeGarde", "Total", "Réactifs", "Calibrateurs", "Contrôles")
        MotDePasseFeuilles = "Toto"
     
        For I = 1 To 5
     
                Continuer = True
     
                For Each Sh In Sheets
     
                     Select Case Sh.Name
                            Case ListeDesPages(I - 1)
                                 Sh.Activate
                                 If Sh.Name = "PageDeGarde" Then
                                      ActiveSheet.Shapes.Range(Array("BoutonVerrouiller", "BoutonDeverrouiller")).Visible = False
                                 End If
                                 Sh.Protect Password:=MotDePasseFeuilles
                     End Select
                 Next Sh
     
         Next I
     
         Sheets("PageDeGarde").Activate
     
         Application.Calculation = xlAutomatic
         Application.ScreenUpdating = True
     
     
    End Sub

    Sinon pour sélectionner les plages comme vous le demandez, c'est sans doute possible mais je ne suis pas persuadé d'un gain de temps significatif, car sur ma machine le code met environ 1 seconde pour le traitement, ce qui signifie que le reste du temps est dû au "recalcul" des formules en fin de programme sur votre machine.

    Bon courage à vous pour la suite.

    Cordialement.
    Dernière modification par Invité ; 07/05/2013 à 07h29.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    salut

    oui c'est sûr que le gain de temps n'est pas significatif a priori mais je cherche plutot à le faire pour ma connaissance personnelle et découvrir les fonctions vba qui pourront me servir dans d'autres projets

    Toujours est-il, j'ai essayé de faire la même chose en utilisant le Range et le Find. Ci-joint le code que j'ai utilisé (bien sûr il ne fonctionne pas lol)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Sub MasquerDemasquer()
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
     
     For I = 2 To 6 'je balaye les feuillet 2 à 6
     
     With Worksheets(I)
     .Activate
     .Unprotect Password:="Toto"
     
     With .Range("K14:K100")
     
        Set c = .Find("---", LookIn:=xlValues, xlWhole)
        If Not c Is Nothing Then
        c.EntireRow.Select
            If c.Hidden = True Then
            c.Hidden = False
            Else
            c.Hidden = True
            End If
        End If
    End With
    End With
    Next
        Sheets(1).Activate
        Application.Calculation = xlAutomatic
        Application.ScreenUpdating = True
    End Sub
    Dans la logique j'ai bon ou je fais total fausse route?

    merci

Discussions similaires

  1. [AC-2000] Suppression lignes sur fichier CSV depuis Access
    Par electronedf dans le forum VBA Access
    Réponses: 8
    Dernier message: 25/10/2010, 13h35
  2. Masquer des lignes sur condition
    Par marc56 dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 06/03/2008, 02h11
  3. [Tomcat Bean IO] Ecriture sur Fichier et Saut de Ligne
    Par zaoueche dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 25/01/2006, 15h02
  4. Masquer certaines lignes sur un etat
    Par badara2 dans le forum Access
    Réponses: 3
    Dernier message: 15/10/2005, 19h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo