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 :

Filtre avancé ne fonctionne pas en VBA mais marche "à la main"


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingé Son
    Inscrit en
    mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingé Son

    Informations forums :
    Inscription : mars 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Filtre avancé ne fonctionne pas en VBA mais marche "à la main"
    Bonjour à tou.te.s
    je sollicite votre aide pour un pb assez énervant que je n'arrive pas à comprendre...

    J'ai écris un code VBA pour appliquer un filtre avancé à un tableau (le tableau, le résultat et les critères de filtrage sont sur 3 feuilles différentes).
    Lorsque je lance ce code depuis un bouton macro dans le classeur ce code fonctionne très bien. En revanche si je lance ce même code directement depuis l'éditeur VBA j'obtiens une erreur 1004.

    J'ai bien précisé les worksheets dans mon code...

    Je vous joins un extrait de mon classeur avec uniquement le code et les feuilles en question.
    Si vous avez une idée, je suis preneur !

    Merci d'avance.

    Will

    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
    Sub testFilterPCG()
    PCG_Flt_LastRow = Filter_Advanced_PCG(1)
    MsgBox ("Dernière ligne du tableau filtré : " & PCG_Flt_LastRow)
    End Sub
     
    Function Filter_Advanced_PCG(Optional ByVal Visible, Optional ByVal RefCpte, Optional ByVal Nature, Optional ByVal xx, Optional ByVal xxx, Optional ByVal xxxx, Optional ByVal xxxxx, Optional ByVal LibPerso) As Integer
     
    'INITIALISATION ET COPIE DU HEADER
    'Vide la feuille "RefFilterPCG" et y recrée le Header
     
    With Sheets("RefFilterPCG")
        .Rows(2).Delete 'Efface le contenu de la feuille RefFilterPCG
     
    'REPLISSAGE DU TABLEAU EN VUE DUN FILTRAGE AVANCé
        'les critères inscrits dans une même ligne auront une condition ET
        'les critères inscrits dans deux lignes différentes auront une condition OU
        'on utilise 2 lignes afin d'opérer une opération "ou" sur les colonnes d'année d'exercice I et II
     
     
    'On rempli le filtre avec les données récupérées par la fonction après avoir testé si cette donnée a bien été passée
     If Not IsMissing(Visible) Then .Cells(2, 1).Value = "'=" & Visible  'Inscrit la valeur de visible dans le taleau de référence
     If Not IsMissing(RefCpte) Then .Cells(2, 2).Value = "'=" & RefCpte   'Inscrit la valeur de RefCpte dans le taleau de référence
     If Not IsMissing(Nature) Then .Cells(2, 3).Value = "'=" & Nature   'Inscrit la valeur de Nature dans le taleau de référence
     If Not IsMissing(xx) Then .Cells(2, 4).Value = "'=" & xx   'Inscrit la valeur de xx dans le taleau de référence
     If Not IsMissing(xxx) Then .Cells(2, 5).Value = "'=" & xxx   'Inscrit la valeur de xxx dans le taleau de référence
     If Not IsMissing(xxxx) Then .Cells(2, 6).Value = "'=" & xxxx   'Inscrit la valeur de xxxx dans le taleau de référence
     If Not IsMissing(xxxxx) Then .Cells(2, 7).Value = "'=" & xxxxx   'Inscrit la valeur de xxxxx dans le taleau de référence
     If Not IsMissing(LibPerso) Then .Cells(2, 8).Value = "'=" & LibPerso   'Inscrit la valeur de LibPerso dans le taleau de référence
     
    Ref_LastRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row 'calcule la dernière ligne de RefFilterPCG
    Ref_LastCol = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column 'calcule la dernière colonne de RefFilterPCG
     
     
    End With
     
    'Application du Filtre Avancé et export vers une la feuille PCG_Filtered
        'Efface le contenu de la feuille PCG_Filtered
    Worksheets("PCG_Filtered").Cells.Delete
        'Applique le filtrage avancé et exporte vers la page PCG_Filtered
    Worksheets("PCG_Filtered").Select
     
    Worksheets("PCG").Range("BDD_PCG[#All]").AdvancedFilter _
        Action:=xlFilterCopy, _
        CriteriaRange:=Worksheets("RefFilterPCG").Range("A1:H2"), _
        CopyToRange:=Worksheets("PCG_Filtered").Range("A1"), _
        Unique:=False
     
    'Création d'un tableau à partir des données filtrées
    With Sheets("PCG_Filtered")
        PCG_Flt_LastCol = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column 'calcule la dernière colonne
        PCG_Flt_LastRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row 'calcule la dernière ligne
            .ListObjects.Add(xlSrcRange, .Range(.Cells(1, 1), .Cells(PCG_Flt_LastRow, PCG_Flt_LastCol)), , xlYes).Name = "t_PCG_Filtered" 'cré un tableau avec les données exportées
    End With
     
    'Rétablir les filtres dans le tableau PCG
    If Worksheets("PCG").AutoFilter Is Nothing Then
    Sheets("PCG").Range("BDD_PCG").AutoFilter
    End If
     
    'retourne la valeur PCG_Flt_LastRow (numéro de la dernière ligne du tableau filtré)
    Filter_Advanced_PCG = PCG_Flt_LastRow
     
    End Function
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    janvier 2010
    Messages
    10 656
    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 : 10 656
    Points : 25 437
    Points
    25 437
    Billets dans le blog
    31
    Par défaut
    Bonjour,
    Comme beaucoup de contributeurs de ce forum, je n'ouvre pas les classeurs joints
    En revanche si je lance ce même code directement depuis l'éditeur VBA j'obtiens une erreur 1004.
    N'ayant pas de boule de cristal, nous indiquer à quelle ligne de votre code vous avez cette erreur ne serait pas superflu

    Je m'interroge sur la variable tableau de la première ligne de la première procédure nommée testFilterPCG() soit [CODE]PCG_Flt_LastRow = Filter_Advanced_PCG(1)[/C]

    D'où sort cette variable Filter_Advanced_PCG(1) ? Est-ce une variable de portée module ou est-ce une variable publique ?
    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
    Ma dernière contribution : VBA - Les macros complémentaires

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingé Son
    Inscrit en
    mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingé Son

    Informations forums :
    Inscription : mars 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour Philippe et merci de votre intérêt,

    L'erreur intervient à la ligne 46 du bout de code que j'ai publié sur le précédent poste, lors de l’exécution du filtre avancé donc.

    j'ai en fait séparé mon code en 2 partie. Une procédure "testFilterPCG()" et une fonction "Filter_Advanced_PCG".

    "testFilterPCG()" me sert en fait à tester le bon fonctionnement de ma fonction "Filter_Advanced_PCG".

    "testFilterPCG()" appelle la fonction "Filter_Advanced_PCG" en lui passant l'argument "1" byval, cette valeur vient s'inscrire dans la variable "visible" de la fonction appelée.
    Le but du passage de valeur entre ma procédure et ma fonction est de récupérer les critère de filtrage.

    Dans mon projet, la fonction "Filter_Advanced_PCG" sera appelée par différentes procédure qui à chaque fois passeront leurs propres critères de filtrage.

    J'espère avoir été un peu plus clair.
    Merci de votre aide.

    Will

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    janvier 2010
    Messages
    10 656
    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 : 10 656
    Points : 25 437
    Points
    25 437
    Billets dans le blog
    31
    Par défaut
    Bonjour,
    A mon avis, c'est plutôt la ligne 42 car la ligne 46 fait partie de la même instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Worksheets("PCG").Range("BDD_PCG[#All]").AdvancedFilter _
        Action:=xlFilterCopy, _
        CriteriaRange:=Worksheets("RefFilterPCG").Range("A1:H2"), _
        CopyToRange:=Worksheets("PCG_Filtered").Range("A1"), _
        Unique:=False
    Si vous référencez un tableau structuré avec l'objet Range, il ne faut pas préciser la feuille donc il faut écrire Range("BDD_PCG[#All]").AdvancedFilter

    Attention que si vous référencé le tableau avec l'objet Range, le classeur où se trouve le tableau structuré doit être le classeur actif
    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
    Ma dernière contribution : VBA - Les macros complémentaires

  5. #5
    Membre du Club
    Homme Profil pro
    Gestionnaire de projet dans le BTP
    Inscrit en
    janvier 2017
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire de projet dans le BTP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : janvier 2017
    Messages : 46
    Points : 67
    Points
    67
    Par défaut
    Essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        CriteriaRange:=Worksheets("RefFilterPCG").Range("RefFilterPCG!A1:H2"), _
        CopyToRange:=Worksheets("PCG_Filtered").Range("PCG_Filtered!A1"), _

Discussions similaires

  1. css ne fonctionne pas sur firefox, mais sont ok sur IE
    Par phfle1 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 31/10/2008, 17h43
  2. Réponses: 4
    Dernier message: 14/02/2008, 20h13
  3. [AJAX] Code tuto Ajax fonctionne pas sous FF, mais IE et OP sont OK
    Par hugo69 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 08/01/2007, 21h27
  4. Comme "Texte*" ne fonctionne pas en VBA?
    Par NewbiePower dans le forum Access
    Réponses: 3
    Dernier message: 07/12/2006, 10h11

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