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 :

Gérer les volets figés dans un classeur partagé avec filtres automatiques


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut Gérer les volets figés dans un classeur partagé avec filtres automatiques
    Bonjour à tous,
    Avec une macro lancée à l'ouverture d'un classeur partagé, je n'arrive pas à figer uniquement les 3 premières lignes à cause des filtres automatiques (personnalisés par chaque utilisateur).

    - cela marche si aucun filtre n'est activé
    - dès qu'un filtre cache les premières lignes du tableau à la fermeture du classeur, ces lignes apparaissent figées à l'ouverture suivante lorsqu'on désactive les filtres.

    Même en nommant la cellule, cela ne marche pas.
    Auriez vous une astuce ?

    (Note : je connais mal le VBA, et je n'arrive pas à joindre le fichier qui est en .xlsm)

    Je vous remercie beaucoup

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_Open()
        With ActiveWindow
            .FreezePanes = False
            .SplitRow = 3
            .FreezePanes = True
            End With
    End Sub
    Echec également en nommant cellule_filtre la cellule A4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Range("cellule_filtre").Select
        ActiveWindow.FreezePanes = True

  2. #2
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 592
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 592
    Par défaut
    Bonjour

    Avec un cells(3,1).select plutôt que .SplitRow = 3

  3. #3
    Membre très actif Avatar de XLRATOR
    Homme Profil pro
    Comptable Analyste
    Inscrit en
    Août 2012
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Comptable Analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 226
    Par défaut
    Bonjour,
    Essayez d'ajouter cette ligne à votre code en dessous de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Workbook_Open()
    mettez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("LenomDeVotreFeuille").ShowAllData
    Ensuite le reste de votre code.

    Cordialement
    Karim
    Entre la canne à pèche et le poisson c'est certainement la canne que je choisirais, puis apprendrais à m'en servir.
    Si on vous souffle une solution au complet c'est que vous n'auriez rien compris du problème.
    Consultez la , de forte chances que votre problème y figure et c'est plus vite que de poser une question et en attendre la réponse.
    FAQ Excel: http://excel.developpez.com/faq/

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    Merci de vos réponses,
    Malheureusement la fonction cells().select produit le même résultat.

    C'est quand même bizarre de ne pas pouvoir sélectionner une cellule caché pour y appliquer FreezePanes !

    Tandis que je ne souhaite pas désactiver tous les filtres à l'ouverture puisque l'intérêt du tableau est justement que chaque utilisateur conserve ses filtres sans avoir à les réactiver à chaque fois.
    Sauf à ce que vous ayez une solution pour remettre les filtres tels qu'ils étaient à l'ouverture, pour chaque utilisateur, mais ça m'a l'air compliqué.

    Bon, je ne suis pas le seul confronté au problème :
    http://www.developpez.net/forums/d14...es-autofiltre/

    Ok, ça marche avec la routine désactivation du filtre/remise en place.

    La routine supprime totalement les filtres si aucun filtre n'était activé.
    Je teste l'existence d'un filtre et en recrée un si pas présent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If ActiveSheet.AutoFilter Is Nothing Then
    Rows(3).Select
    Selection.AutoFilter
    Range("A3").Select

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    Pfffff, j'ai parlé trop vite.

    J'arrive à utiliser l'ancienne version de la routine qui est simple, mais elle est pour excel 2003 (je suis sous 2010) et provoque des bugs à l'usage.
    Je n'arrive pas à utiliser la nouvelle version, disponible sur le lien cité plus haut.

    Elle se décompose en deux partie :
    - une partie sauvegarde les filtres

    Entre temps on place son code

    - une autre les remet


    Je n'arrive pas à appeler les fonctions qui ont des arguments en plus (je maitrise mal vba)

    Sauriez vous me guider ?
    Je vous mets les notices de chaque partie de la routine ci dessous.

    Au besoin, la macro complète :


    Sauver les filtres :
    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
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Sub:      SaveListObjectFilters
    ' Purpose:  Save filter on worksheet
    ' Returns:  wks.AutoFilterMode when function entered
    '
    ' Arguments:
    '   [Name]      [Type]  [Description]
    '   wks         I/P     Worksheet that filter may reside on
    '   FilterRange O/P     Range on which filter is applied as string; "" if no filter
    '   FilterCache O/P     Variant dynamic array in which to save filter
    '
    ' Author:   Based on MS Excel AutoFilter Object help file
    '
    ' Modifications:
    ' 2006/12/11 Phil Spencer: Adapted as general purpose routine
    ' 2007/03/23 PJS: Now turns off .AutoFilterMode
    ' 2013/03/13 PJS: Initial mods for XL14, which has more operators
    ' 2013/05/31 P.H.: Changed to save list-object filters
    Les restaurer :
    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
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Sub:      RestoreListObjectFilters
    ' Purpose:  Restore filter on listobject
    ' Source: http://stackoverflow.com/questions/9489126/in-excel-vba-how-do-i-save-restore-a-user-defined-filter
    ' Arguments:
    '   [Name]      [Type]  [Description]
    '   wks         I/P     Worksheet that filter resides on
    '   FilterRange I/P     Range on which filter is applied
    '   FilterCache I/P     Variant dynamic array containing saved filter
    '
    ' Author:   Based on MS Excel AutoFilter Object help file
    '
    ' Modifications:
    ' 2006/12/11 Phil Spencer: Adapted as general purpose routine
    ' 2013/03/13 PJS: Initial mods for XL14, which has more operators
    ' 2013/05/31 P.H.: Changed to restore list-object filters
    '
    ' Comments:
    '----------------------------
    Au besoin la macro complète :
    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
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Sub:      SaveListObjectFilters
    ' Purpose:  Save filter on worksheet
    ' Returns:  wks.AutoFilterMode when function entered
    ' Source: http://stackoverflow.com/questions/9489126/in-excel-vba-how-do-i-save-        restore-a-user-defined-filter
    '
    ' Arguments:
    '   [Name]      [Type]  [Description]
    '   wks         I/P     Worksheet that filter may reside on
    '   FilterRange O/P     Range on which filter is applied as string; "" if no filter
    '   FilterCache O/P     Variant dynamic array in which to save filter
    '
    ' Author:   Based on MS Excel AutoFilter Object help file
    '
    ' Modifications:
    ' 2006/12/11 Phil Spencer: Adapted as general purpose routine
    ' 2007/03/23 PJS: Now turns off .AutoFilterMode
    ' 2013/03/13 PJS: Initial mods for XL14, which has more operators
    ' 2013/05/31 P.H.: Changed to save list-object filters
     
    Function SaveListObjectFilters(lo As ListObject, FilterCache()) As Boolean
    Dim ii As Long
     
    filterRange = ""
        With lo.AutoFilter
            filterRange = .Range.Address
            With .Filters
                ReDim FilterCache(1 To .Count, 1 To 3)
                For ii = 1 To .Count
                    With .Item(ii)
                        If .On Then
    #If False Then ' XL11 code
                            FilterCache(ii, 1) = .Criteria1
                            If .Operator Then
                                FilterCache(ii, 2) = .Operator
                                FilterCache(ii, 3) = .Criteria2
                            End If
    #Else   ' first pass XL14
                            Select Case .Operator
     
                            Case 1, 2   'xlAnd, xlOr
                                FilterCache(ii, 1) = .Criteria1
                                FilterCache(ii, 2) = .Operator
                                FilterCache(ii, 3) = .Criteria2
     
                            Case 0, 3 To 7 ' no operator, xlTop10Items, _
    xlBottom10Items, xlTop10Percent, xlBottom10Percent, xlFilterValues
                                FilterCache(ii, 1) = .Criteria1
                                FilterCache(ii, 2) = .Operator
     
                            Case Else    ' These are not correctly restored; there's someting in Criteria1 but can't save it.
                                FilterCache(ii, 2) = .Operator
                                ' FilterCache(ii, 1) = .Criteria1   ' <-- Generates an error
                                ' No error in next statement, but couldn't do restore operation
                                ' Set FilterCache(ii, 1) = .Criteria1
     
                            End Select
    #End If
                        End If
                    End With ' .Item(ii)
                Next
            End With ' .Filters
        End With ' wks.AutoFilter
    End Function
     
     
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Sub:      RestoreListObjectFilters
    ' Purpose:  Restore filter on listobject
    ' Source: http://stackoverflow.com/questions/9489126/in-excel-vba-how-do-i-save-restore-a-user-defined-filter
    ' Arguments:
    '   [Name]      [Type]  [Description]
    '   wks         I/P     Worksheet that filter resides on
    '   FilterRange I/P     Range on which filter is applied
    '   FilterCache I/P     Variant dynamic array containing saved filter
    '
    ' Author:   Based on MS Excel AutoFilter Object help file
    '
    ' Modifications:
    ' 2006/12/11 Phil Spencer: Adapted as general purpose routine
    ' 2013/03/13 PJS: Initial mods for XL14, which has more operators
    ' 2013/05/31 P.H.: Changed to restore list-object filters
    '
    ' Comments:
    '----------------------------
    Sub RestoreListObjectFilters(lo As ListObject, FilterCache())
    Dim col As Long
     
    If lo.Range.Address <> "" Then
        For col = 1 To UBound(FilterCache(), 1)
     
    #If False Then  ' XL11
            If Not IsEmpty(FilterCache(col, 1)) Then
                If FilterCache(col, 2) Then
                    lo.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                            Operator:=FilterCache(col, 2), _
                        Criteria2:=FilterCache(col, 3)
                Else
                    lo.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1)
                End If
            End If
    #Else
     
            If Not IsEmpty(FilterCache(col, 2)) Then
                Select Case FilterCache(col, 2)
     
                Case 0  ' no operator
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1) ' Do NOT reload 'Operator'
     
                Case 1, 2   'xlAnd, xlOr
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                        Operator:=FilterCache(col, 2), _
                        Criteria2:=FilterCache(col, 3)
     
                Case 3 To 6 ' xlTop10Items, xlBottom10Items, xlTop10Percent,     xlBottom10Percent
    #If True Then
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1) ' Do NOT reload 'Operator' , it doesn't work
                    ' wks.AutoFilter.Filters.Item(col).Operator = FilterCache(col, 2)
    #Else ' Trying to restore Operator as well as Criteria ..
                    ' Including the 'Operator:=' arguement leads to error.
                    ' Criteria1 is expressed as if for a FALSE .Operator
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                        Operator:=FilterCache(col, 2)
    #End If
     
                Case 7  'xlFilterValues
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                        Operator:=FilterCache(col, 2)
     
    #If False Then ' Switch on filters on cell formats
    ' These statements restore the filter, but cannot reset the pass Criteria, so the filter hides all data.
    ' Leave it off instead.
                Case Else   ' (Various filters on data format)
                    lo.RangeAutoFilter field:=col, _
                        Operator:=FilterCache(col, 2)
    #End If ' Switch on filters on cell formats
     
                End Select
            End If
     
    #End If     ' XL11 / XL14
        Next col
    End If
    End Sub

Discussions similaires

  1. Enregistrer les valeurs dans un classeur partagé
    Par rihab92 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/04/2015, 12h55
  2. comment gérer les retour chariot dans un label?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 24
    Dernier message: 07/07/2007, 19h15
  3. Réponses: 9
    Dernier message: 23/08/2006, 16h12
  4. Réponses: 9
    Dernier message: 13/04/2006, 12h40
  5. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 12h02

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