Macro perturbe filtre

Bonjour,

Je rencontre un problème !

Lorsque j'exécute ma macro, les filtres que j'avais mis en place ne sont plus effectifs.

De ce fait, j'aimerai modifier mon code VBA de manière à ce que l’exécution de ma macro ne perturbe pas le fonctionnement des filtres mis en place.

Option Explicit

Public Sub cmdCreateWorksheets_Click()
'Declaration des variables
Dim ws As Worksheet, ws2 As Worksheet, WSnew As Worksheet
Dim lo As ListObject, lo2 As ListObject
Dim Cell As Range
Dim lRow As Long
    'Optimisation du code
    With Application
        .DisplayAlerts = False
        '.EnableEvents = False
        .ScreenUpdating = False
    End With
    'Suppression des feuilles sauf la feuille active (feuille Donnees)
    For Each ws In ActiveWorkbook.Worksheets
        If ws.Name <> "données" And ws.Name <> "TCD" Then ws.Delete
        'If ws.Name <> ActiveSheet.Name Then ws.Delete
    Next ws
    'Initialisation des varialbes
    Set ws = ActiveSheet    'Feuilles Donnees
    Set lo = ws.ListObjects(1)    'Tableau feuille Données (Excel 2007+)

    If lo.ShowAutoFilter Then
        If lo.AutoFilter.FilterMode Then lo.AutoFilter.ShowAllData
    Else
        lo.ShowAutoFilter = True
    End If
    'Creation feuille temporaire (qui sera supprimée en fin de procédure)
    'La feuille va recevoir la liste des valeurs uniques de la colonne 8 (Field Num)
    Set ws2 = ActiveWorkbook.Worksheets.Add
    With ws2
        lo.ListColumns(6).Range.AutoFilter field:=6, Criteria1:="<>"
        lo.ListColumns(9).Range.AutoFilter field:=9, Criteria1:="<>"
        lo.ListColumns(9).Range.AutoFilter field:=10, Criteria1:="="
        lo.ListColumns(8).DataBodyRange.SpecialCells(xlCellTypeVisible).Copy
        .Cells(1).PasteSpecial xlPasteValues
        Application.CutCopyMode = False
        .Cells(1).CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlNo
        'Nombre de valeurs uniques du filtre avancé
        lRow = .Cells(Rows.Count, 1).End(xlUp).Row
        'Pour chaque élément de la liste unique (Edition)
        For Each Cell In .Range("A1:A" & lRow)
            'On effectue le filtrage suivant l'item
            lo.Range.AutoFilter field:=8, Criteria1:="=" & Cell.Value
            'On crée la nouvelle feuille qui va recevoir les données filtrées
            Set WSnew = ActiveWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count))
            'On nomme la nouvelle feuille avec la valeur de l'élément
            WSnew.Name = IIf(Len(Cell) > 31, Left(Cell, 20) & "...." & Right(Cell, 7), Cell.Value)
            'On copie la plage filtrée (tableau feuille Données)
            lo.Range.SpecialCells(xlCellTypeVisible).Copy
            With WSnew
                With .Cells(1)
                    .PasteSpecial xlPasteColumnWidths
                    .PasteSpecial xlPasteValuesAndNumberFormats
                End With
                Application.CutCopyMode = False
                .Columns("L:N").Delete Shift:=xlToLeft
                .Columns("A:E").Delete Shift:=xlToLeft
                'On crée un nouveau tableau (Excel 2007+)
                Set lo2 = .ListObjects.Add(xlSrcRange, WSnew.Cells(1).CurrentRegion, , xlYes)
                With lo2
                    'On détermine le style du tableau
                    .TableStyle = "TableStyleLight1"
                    .ShowTotals = True
                    .ListColumns(5).TotalsCalculation = xlTotalsCalculationSum
                End With
                'Ono active la nouvelle feuille la mise en forme (minimale)
                .Activate
                .Cells(1).Select
                ActiveWindow.DisplayGridlines = False
            End With
        Next Cell
    End With

    lo.AutoFilter.ShowAllData
    'On supprime la feuille temporaire
    ws2.Delete
    'On active la feuille Données
    ws.Activate

    MsgBox "Terminé"

    With Application
        .DisplayAlerts = True
        '.EnableEvents = True
    End With
    'On réinitialise les variables (on vide la mémoire)
    Set lo = Nothing
    Set WSnew = Nothing: Set ws2 = Nothing: Set ws = Nothing

End Sub

Bien à vous,

Bonsoir,

Lorsque j'exécute ma macro, les filtres que j'avais mis en place ne sont plus effectifs.

Il serait utile que tu précises ce que tu entends par là (sans oublier de localiser les filtres en question).

Bonsoir,

Le filtre est appliqué à la 8ème colonne, la H, relative au nom de l'Edition concernée.

J'applique un filtre afin de voir uniquement les données relatives aux editions m'intéressant (sinon, je me retrouve avec plus de 1000lignes !...)

Je suppose qu'en fin de macro on réaffiche toutes les lignes (ShowAllData). Il te faut donc à la place réactiver le filtrage qui te convient.

Oui, c'est exact.

Comment pourrai-je y procéder ?

En le rétablissant ! C'est toi qui sait quel filtrage tu veux. Il n'y en a pas mention dans la macro.

Je veux simplement que la macro ne touche pas au filtre que j'ai mis en place

A mon avis, alors il faut la supprimer...

J'ai essayé mais cela ne fonctionne pas

Je vous joins mon fichier afin que vous puissiez davantage comprendre !

5test-no2.xlsm (63.33 Ko)

A voir.

6fatm-test-no2.xlsm (64.04 Ko)

J'ai remplacé

Array("A", "C", "D", "E", "F", "H"), Operator:=xlFilterValues

par mes véritables valeurs mais, étrangement, cela ne fonctionne pas... Après exécution de la macro, seules les données "entre guillemets", que j'ai filtré apparaissent. Or, c'est exactement le contraire que je souhaite haha

Tu as mis un fichier, filtré !

J'ai rétabli ce filtrage en fin de ta macro.

Si tu ne sais plus ce que tu veux, c'est un autre problème.

Je sais ce que je veux. Le soucis étant que je ne sais pas expliciter mes besoins haha !

Je mets en place un filtre afin de masquer certaines données.

Lors de l’exécution de la macro, le filtre disparaît et les données que je souhaitait masquer réapparaissent.

Or, je souhaite qu'elles restent masquées après l’exécution de la macro (sinon, je me retrouve avec un tableau à plus de 1000lignes!)

Tu ne lis pas ce qui précède !

Bien évidemment que si MFerrand !

Tu parles de ceci ?

lo.AutoFilter.ShowAllData
    lo.Range.AutoFilter Field:=8, Criteria1:= _
     Array("A", "C", "D", "E", "F", "H"), Operator:=xlFilterValues
MFerrand a écrit :

Tu as mis un fichier, filtré !

J'ai rétabli ce filtrage en fin de ta macro.

Si tu ne sais plus ce que tu veux, c'est un autre problème.

Et de ceci.

Et ? Je l'ai bien vu mais, je ne vois toujours pas où tu veux en venir

Ce filtrage est bien rétabli en fin de macro !

Donc le problème devrait être résolu depuis longtemps.

Je pense qu'il y a un problème de communication haha...

Je ne comprends vraiment pas ce que tu veux dire par là

Bonjour fatm_blk,

Bonjour MFerrand,

La demande n'est pas claire, dans la mesure ou à l'origine il n'y pas de filtre.

J'interviens car je suis à l'origine de cette procédure.

J'ai revu celle-ci et ajouté en fin le choix de conserver ou pas certains filtres (partie surlignée)

Dans l'exemple, on conserve tous les filtres sauf le filtre Edition.

A adapter donc!

Cdlt.

Option Explicit

Public Sub cmdCreateWorksheets_Click()
'Declaration des variables
Dim ws As Worksheet, ws2 As Worksheet, WSnew As Worksheet
Dim lo As ListObject, lo2 As ListObject
Dim Cell As Range
Dim lRow As Long

    'Optimisation du code
    With Application
        .DisplayAlerts = False
        '.EnableEvents = False
        .ScreenUpdating = False
    End With
    'Suppression des feuilles sauf la feuille active (feuille Donnees)
    For Each ws In ActiveWorkbook.Worksheets
        If ws.Name <> ActiveSheet.Name Then ws.Delete
    Next ws
    'Initialisation des variabes
    Set ws = ActiveSheet    'Feuilles Donnees
    Set lo = ws.ListObjects(1)    'Tableau feuille Donnees (Excel 2007+)
    'Si le filtre automatique est affiche
    If lo.ShowAutoFilter Then
        'Si le tableau est en mode AutoFilter, on affiche toutes les donnees
        If lo.AutoFilter.FilterMode Then lo.AutoFilter.ShowAllData
    Else
        'Si le filtre automatique n'est pas affiche, on affiche le filtre automatique
        lo.ShowAutoFilter = True
    End If
    'Creation feuille temporaire (qui sera supprimee en fin de procedure)
    'La feuille va recevoir la liste des valeurs uniques de la colonne 8)
    Set ws2 = ActiveWorkbook.Worksheets.Add
    With ws2
        lo.Range.AutoFilter field:=6, Criteria1:="<>"    'date de publication
        lo.Range.AutoFilter field:=9, Criteria1:="<>"    'facture total
        lo.Range.AutoFilter field:=10, Criteria1:="="    'commission
        lo.ListColumns(8).DataBodyRange.SpecialCells(xlCellTypeVisible).Copy    'Edition
        .Cells(1).PasteSpecial xlPasteValues
        Application.CutCopyMode = False
        .Cells(1).CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlNo
        'Nombre de valeurs uniques du filtre avance
        lRow = .Cells(Rows.Count, 1).End(xlUp).Row
        'Pour chaque element de la liste unique (Edition)
        For Each Cell In .Range("A1:A" & lRow)
            'On effectue le filtrage suivant l'element
            lo.Range.AutoFilter field:=8, Criteria1:="=" & Cell.Value
            'On cree la nouvelle feuille qui va recevoir les donnees filtrees
            Set WSnew = ActiveWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count))
            'On nomme la nouvelle feuille avec la valeur de l'element
            WSnew.Name = Cell.Value
            'On copie la plage filtree (tableau feuille Donnees)
            lo.Range.SpecialCells(xlCellTypeVisible).Copy
            With WSnew
                With .Cells(1)
                    .PasteSpecial xlPasteColumnWidths
                    .PasteSpecial xlPasteValuesAndNumberFormats
                End With
                Application.CutCopyMode = False
                .Columns("A:E").Delete shift:=xlToLeft
                'On cree un nouveau tableau (Excel 2007+)
                Set lo2 = .ListObjects.Add(xlSrcRange, WSnew.Cells(1).CurrentRegion, , xlYes)
                With lo2
                    'On determine le style du tableau
                    .TableStyle = "TableStyleLight1"
                    'On affiche la ligne des totaux
                    .ShowTotals = True
                    'On calcule la somme de la colonne 5 (Commission)
                    .ListColumns(5).TotalsCalculation = xlTotalsCalculationSum
                End With
                'On active la nouvelle feuille et on effectue la mise en forme (minimale)
                .Activate
                .Cells(1).Select
                'L'affichage du quadrillage est desactive
                ActiveWindow.DisplayGridlines = False
            End With
        Next Cell
    End With
   'On affiche toutes les donnees du tableau
    'lo.AutoFilter.ShowAllData
    'Ou on efface les filtres pour les colonnes (choix)
    'Inibher la (les) ligne(s) inutile(s)
    'lo.Range.AutoFilter field:=6     'date de publication
    lo.Range.AutoFilter field:=8     'Edition
    'lo.Range.AutoFilter field:=9     'facture total
    'lo.Range.AutoFilter field:=10    'commission
    'On supprime la feuille temporaire
    ws2.Delete
    'On active la feuille Donnees
    ws.Activate

    MsgBox "Terminé"

    With Application
        .DisplayAlerts = True
        '.EnableEvents = True
    End With
    'On reinitialise les variables (on vide la memoire)
    Set lo2 = Nothing: Set lo = Nothing
    Set WSnew = Nothing: Set ws2 = Nothing: Set ws = Nothing

End Sub
Rechercher des sujets similaires à "macro perturbe filtre"