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 :

Problème de filtrage avec VBA d'un tableau structuré [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut Problème de filtrage avec VBA d'un tableau structuré
    Bonjour,

    j'ai un tableau structuré "TabSaisie" pour lequel je veux imprimer les données correspondantes à deux filtres simultanés :
    1) un filtre pour le choix de la salle
    2) un filtre pour le choix de l'armoire

    J'extrais les éléments uniques de ces deux colonnes en mettant les valeurs dans deux "dictionary" puis dans deux variables à une dimension.

    Mon filtre filtrant sur le format d'affichage différent du format des données du "Dictionary", je convertis au cas par cas mes valeurs de la variable dimensionnée pour correspondre à la valeur affichée.

    Dans les combinaisons possibles de ces deux variables, il existe des références d'armoires qui n'existent pas pour certaines salles.
    Je souhaite éviter l'impression de feuilles inutiles pour ces cas irréalistes.

    Pour cela, je compte donc le nombre de lignes restantes après application de la combinaison du filtre pour les deux colonnes.


    Et ça ne fonctionne pas. J'ai toujours plus d'éléments.

    Or je viens de constater que c'est mon filtrage qui ne fonctionne pas.
    Il reste toujours quelques lignes supplémentaires, lignes qui ne sont pas imprimées et qui appartiennent bien au "Listobject".

    Filtre pour "Salle 001 Armoire 01" (valeurs "dictionary" : "1" et "1")
    Nom : X1.png
Affichages : 264
Taille : 51,5 Ko

    Voici mon code nettoyé des choses inutiles :

    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
    Sub Imprimer()
         '--- Efface le flltre car des problèmes en créant la liste ordonnées avant traitement pour le "Set P =..."
        Dim Tableau As Range
     
        Set Tableau = Range("TabSaisie")
        Call TS_Filtres_Effacer(Tableau)
     
        ' Dernière ligne du tableau
        Dim DernLign As Long
        DernLign = Cells(Cells.Rows.Count, 1).End(xlUp).Row
     
        '---
        Dim P As Range, c As Range
     
        Application.EnableEvents = False
     
        With Sheets("Saisie inventaire").[A6].CurrentRegion
            Set P = .Columns(.Columns.Count + 2)
            Application.StatusBar = "P adresse : " & P.Address
            P.ClearContents
            P(1) = 1
            P.DataSeries 'numérotation
            'Tri sur Salle > Armoire > Etagere > Grp > Dénomination
            Range("H8").Select
            With ActiveWorkbook.Worksheets("Saisie inventaire").ListObjects("TabSaisie").Sort
                .SortFields.Clear
                .SortFields.Add Key:=Range("TabSaisie[Salle]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .SortFields.Add Key:=Range("TabSaisie[Armoire/Etagère]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .SortFields.Add Key:=Range("TabSaisie[Etage]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .SortFields.Add Key:=Range("TabSaisie[Grp]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .SortFields.Add Key:=Range("TabSaisie[Dénominations]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
     
            '--- Salles existantes
            Dim mondico As Scripting.Dictionary
            Dim ce As Range
            Dim i As Byte
            Dim j As Byte
            Dim ListeSalle As Variant
     
            Set mondico = CreateObject("Scripting.Dictionary")
            For Each ce In Feuil1.Range("B6:B" & DernLign)
                With ce
                    If Not mondico.Exists(.Value) Then mondico.Add .Value, .Value
                End With
            Next ce
     
            'Place dans une variable dimensionnée le résultat du dictionnaire
            ListeSalle = mondico.Items
     
            'Efface le dictionnaire
            Set mondico = Nothing
     
            '--- Armoires existantes
            'Dim mondico As Scripting.Dictionary
            Dim ListeArmoire As Variant
     
            Set mondico = CreateObject("Scripting.Dictionary")
            For Each ce In Feuil1.Range("C6:C" & DernLign)
                With ce
                    If Not mondico.Exists(.Value) Then mondico.Add .Value, .Value
                End With
            Next ce
     
            ListeArmoire = mondico.Items
     
            '---
            Application.StatusBar = UBound(ListeSalle) - LBound(ListeSalle) & " salles et " & _
                                    UBound(ListeArmoire) - LBound(ListeArmoire) & " armoires = " & (UBound(ListeSalle) - LBound(ListeSalle)) * (UBound(ListeArmoire) - LBound(ListeArmoire)) & " cas"
     
            '--- Filtre et imprime en PDF
            Dim SearchSalle
            Dim SearchArmoire
     
            Dim NomFichierPDF As String
            Dim Vide As String
            Vide = ""
     
            ' Boucle sur Salle, 1 2 3 4 5 6 7 8 9 Réserve
            For i = LBound(ListeSalle) To UBound(ListeSalle)
                '--- Filtre ne fonctionne qu'avec la valeur d'affichage (ex. "001" et non le "1" provenant du Dictionary)
                'Filtre suivant le format de ce qui est affiché donc change en fonction nombre ou texte
                If IsNumeric(ListeSalle(i)) Then
                    SearchSalle = Format(ListeSalle(i), "000")
                Else
                    SearchSalle = ListeSalle(i)
                End If
     
                ' Boucle sur Armoire, (Hors), Etagère ou (vide)
                For j = LBound(ListeArmoire) To UBound(ListeArmoire)
                    '--- Filtre ne fonctionne qu'avec la valeur d'affichage (ex. "01" et non le "1" provenant du Dictionary)
                    If IsNumeric(ListeArmoire(j)) Then
                        SearchArmoire = Format(ListeArmoire(j), "00")
                    Else
                        SearchArmoire = ListeArmoire(j)
                    End If
     
                    '--- Nom du fichier
                    NomFichierPDF = "Salle " & SearchSalle & "_Armoire " & SearchArmoire & ".pdf"
     
                    '--- Filtre réelle
                    Range("TabSaisie[[#Headers],[Salle]]").Select
                    Dim x
                    'x = TS_Sélectionner(Tableau)
     
                    ActiveSheet.ListObjects("TabSaisie").Range.AutoFilter Field:=2, Criteria1:=SearchSalle     'Salle   en colonne 2
                    ActiveSheet.ListObjects("TabSaisie").Range.AutoFilter Field:=3, Criteria1:=SearchArmoire   'Armoire en colonne 3
     
                    'Filtres actualisés donc actualise les cellules avec les filtres
                    Calculate
     
                    DoEvents
     
                    'Impression si nécessaire : Au moins une réponse
                    If Range("H6:H" & DernLign).SpecialCells(xlCellTypeVisible).Count > 0 Then
                         'Aperçu avant impression
                        'ActiveSheet.PrintPreview
     
                         ' Explique à l'utilisateur comment envoyer le fichier
                        On Error GoTo ErreurRefLib
                        'Efface le fichier PDF existant
                        If Dir(ActiveWorkbook.Path & "\" & NomFichierPDF) <> "" Then
                            Kill ActiveWorkbook.Path & "\" & NomFichierPDF
                        End If
     
                        ' Crée le fichier PDF pour la bonne salle et armoire
                        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
                                                        filename:=ActiveWorkbook.Path & "\" & NomFichierPDF, _
                                                        Quality:=xlQualityStandard, _
                                                        IncludeDocProperties:=False, _
                                                        IgnorePrintAreas:=False, _
                                                        OpenAfterPublish:=False
                        DoEvents
                        On Error GoTo 0
                    Else
                        Vide = Vide & NomFichierPDF & " :: "
                    End If
     
                    '--- Efface le filtre
                    Set Tableau = Range("TabSaisie")
                    Call TS_Filtres_Effacer(Tableau)
                Next j
            Next i
     
            '--- Efface la ligne de classement initial
            '.EntireRow.Sort P, xlAscending, Header:=xlYes 'remise dans l'ordre initial
            'P.ClearContents 'RAZ
        End With
     
     
    ErreurRefLib:
        MsgBox "Impossible de sauvegarder en pdf. Référence introuvable ou manquante." & Chr(13) & _
               ActiveWorkbook.Path & "\" & NomFichierPDF & ".pdf"
     
    FinMacro:
     
        MsgBox "Vide" & Chr$(13) & Vide
        '--- réinitialisation
        Application.StatusBar = ""
        Application.EnableEvents = True
    End Sub
    Pourquoi ai-je encore les lignes hors filtre d'affichées ?

    Rq: J'ai une fonction volatile pour afficher en "J2" et "J3" les valeurs de filtres. d'oû les "Calculate".

    Merci d'avance.

    ESVBA

  2. #2
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut Information complémentaire
    Le fichier transformé en "xlsx", j'ai la même chose.

    J'ajoute une ligne différentre , je filtre, je n'obtiens que la dernière ligne (ajoutée).

    J'efface le filtre, refait le filtre sur la "salle", j'obtiens deux lignes supplémentaire : celle ajoutée et l'avant-avant dernière, l'avant-dernière est masquée.
    Pièce jointe 642137

    Bizarre
    ESVBA
    Images attachées Images attachées  

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    D'après ce que vous écrivez, vous utilisez un tableau structuré or dans les premières lignes du code publié, vous utilisez notamment la propriété CurrentRegion (ligne 17 With Sheets("Saisie inventaire").[A6].CurrentRegion) .
    Il existe des propriétés et méthodes spécifiques à l'objet ListObject. Je vous conseille la lecture du tutoriel de Pierre Fauconnier pour les appréhender Excel: Les tables de données en VBA

    Pouvez-vous vérifier si en sélectionnant l'une des cellules des lignes 581 et suivantes, celles qui ne sont pas filtrées, vous voyez l'onglet contextuel des tableaux ("Création de Tableau" ou autre appellation suivant la version), apparaître ?
    Si ce n'est pas le cas, ce que je pressens, cela signifie que vous êtes hors du tableau et que cela provient du fait que vous n'avez pas utilisez les bonnes méthodes.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 033
    Par défaut
    Bonjour,
    Si vous utilisez les tableaux (structurés) je vous propose d'utiliser les fonctions de cette documentation : https://laurent-ott.developpez.com/t...ux-Structures/
    Qui couvrent une large gamme de besoins, sans avoir à vous soucier de la complexité de l'objet ListObject.
    Bonne programmation.

  5. #5
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut Bonjour Philippe Tulliez et Laurent_ott
    Philippe, oui ce n'est pas terrible. Je ne suis qu'un amateur et c'est fonction des "mauvaises habitudes".

    Le tuto de "Pierre Fauconnier" est bien mais n'est pas terminé.

    581 ?

    Oui je suis bien dans le tableau structuré.
    J'ai vérifié la coche de dernière cellule.Nom : X4.png
Affichages : 188
Taille : 404 octets

    Si tout est bon. Désolé de cette affirmation.


    Laurent_ott
    Ligne 6, il y a le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call TS_Filtres_Effacer(Tableau)
    Une fonction connue

    ESVBA

  6. #6
    Membre émérite
    Inscrit en
    Décembre 2006
    Messages
    897
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 897
    Par défaut
    Puisque que le filtre ne fonctionne pas sur un fichier "xlsx" manuellement, je suspecte un bug dans mon fichier.

    La réparation ne pose pas de problème et n'est pas la solution.
    Suppression des mots de passe. Rien ne change.

    J'ai commencé à refaire mon fichier et ça fonctionne manuellement.

    Merci pour vos réponses.

    ESVBA

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Problème filtre automatique avec vba
    Par aziz1015 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 22/07/2015, 16h52
  2. [XL-2010] Problème Filtre avancé avec VBA
    Par jppnancy dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 12/04/2015, 10h35
  3. problèmes de couleurs avec VBA
    Par flamel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/11/2010, 21h53
  4. [AC-2003] Problème de dates avec VBA
    Par Ric500 dans le forum VBA Access
    Réponses: 5
    Dernier message: 13/09/2010, 17h39
  5. problème de filtrage avec quote
    Par chasseur37 dans le forum Langage
    Réponses: 2
    Dernier message: 13/05/2009, 13h35

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