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 :

Macro filtre élaboré probleme recherche


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Par défaut Macro filtre élaboré probleme recherche
    Bonjour,

    J'ai un fichier de 3500 lignes, sur lequel j'ai créé une macro "Recherche" qui permet de chercher un mot sur 2 colonnes et de m'afficher le résultat. Jusqu'a là tout va bien.
    Par contre dès que mes lignes sont filtrées, si je relance une nouvelle recherche, le filtre ne se fait plus sur les 3500 lignes mais sur environ 1900. Je ne comprend pas pourquoi ?

    Pour le moment, pour contourner le problème, avant de lancer la recherche, je ré affiche toutes les lignes.

    Voici ma fonction "Recherche" et "AfficheAll" :

    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
     
    Sub AfficherAll()
        On Error Resume Next
        ActiveSheet.ShowAllData
    End Sub
     
    Sub Recherche()
    On Error Resume Next
     
    AfficherAll
     
    DerLig = Range("B" & Rows.Count).End(xlUp).Row
      Range("B11:C" & DerLig).AdvancedFilter _
             Action:=xlFilterInPlace, _
             CriteriaRange:=Range("B4:C6"), _
             Unique:=True
     
        If Application.Subtotal(3, Columns(2)) - 3 = 0 Then
            MsgBox "Aucun résultat pour le critère '" & Range("B3") & "'", vbInformation, "Aucun résultat"
            AfficherAll
        End If
    End Sub
    Cordialement

  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
    13 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu parles de recherche et de filtre mais en matière de recherche, je ne vois que du code qui filtre.
    Que cherches-tu ?
    A la place de SubTotal (ligne 18), j'utiliserais la fonction DCountA ou DCount en utilisant la même zone de critères que le filtre avancé
    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

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Par défaut
    Quand je dit "Recherche" c'est plus filtrer en fait. C'est mon bouton de macro que j'ai appeler recherche pour l'utilisateur.

    Je crois avoir trouvé le problème.

    Sur la ligne 12, je récupère la dernière ligne du fichier Excel utilisée, mais après avoir filtré si je relance mon filtre, la variable DerLig prend la dernière ligne du filtre d'avant.

    Existe il une méthode qui permet de connaitre la dernière ligne de la feuille Excel même quand les lignes sont filtrées ?

  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
    13 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Existe il une méthode qui permet de connaitre la dernière ligne de la feuille Excel même quand les lignes sont filtrées ?
    Pour ma part, j'utilise la méthode CurrentRegion qui est l'équivalent de Ctrl + A mais tu ne peux pas avoir de lignes vides dans ta plage.
    Donc pour obtenir la dernière ligne de la plage, tu additionnes la valeur de la propriété Row et Rows.Count dont tu soustrais 1
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set areaData = Feuil1.Range("A2").CurrentRegion
    MsgBox "Dernière ligne " & areaData.Row + areaData.Rows.Count - 1
    Mais si tu veux connaître le nombre de lignes filtrées à l'aide du filtre avancé, tu auras plus facile avec la fonction DcountA.
    Les fonctions de la catégorie Base de données utilisent les mêmes possibilités que le filtre avancé d'excel (Zone Data et zone des critères).

    Exemple d'une procédure d'exportation avec la méthode AdvancedFilter et annonce du nombre de lignes exportées avec DCountA
    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
    Sub ExportByAdvancedFilter()
     Const myFormula As String = "=YEAR(E2)=2010"
     Dim areaData As Range, areaCriteria As Range, areaTarget As Range
     Dim CounterFiltered As Long
     With shtSource ' CodeName de la feuille
      Set areaData = .Range("A2").CurrentRegion
      Set areaCriteria = shtSource.Range("M1:M2")
      .Range("M2") = myFormula ' Ecrit le critère calculé
     End With
     CounterFiltered = Application.DCountA(areaData, areaData.Resize(1, 1), areaCriteria)
     MsgBox IIf(CounterFiltered, CounterFiltered & " lignes à exporter", "Aucune ligne à exporter")
     Set areaTarget = shtTarget.Range("A1")
     shtTarget.Cells.Clear
     areaData.AdvancedFilter xlFilterCopy, areaCriteria, areaTarget
     Set areaData = Nothing: Set areaCriteria = Nothing: Set areaTarget = Nothing
    End Sub
    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

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Par défaut
    Pour recuperer la derniere ligne j'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerLig = Range("_filterdatabase").Rows.Count + 1
    Et sa marche bien

  6. #6
    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 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu n'avais pas indiqué dans ta question que ta plage était nommée et rien dans tes codes précédents ne l'indique non plus.
    Plus on est précis dans sa question, plus on aura une réponse pertinente.

    [ERRATUM]
    N'ayant pas regardé attentivement le nom de la plage nommée, je n'ai pas relevé que _filterdatabase était en fait la plage nommée cachée qu'utilise le filtre avancé d'excel pour déterminé où est la source de données.
    Cependant la propriété .Rows.Count ne te donne que le nombre de lignes de la plage et pas sa position réelle dans la feuille de calcul ce qui me semblait être la réponse que tu attendais d'où ma réponse utilisant le calcul Plage.Row + Plage.Rows.Count - 1
    Ainsi dans ce code tu auras la dernière ligne de la plage et en supprimant le -1, la prochaine ligne libre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     With Range("_filterdatabase")
      Debug.Print .Address
      Debug.Print .Row + .Rows.Count - 1
     End With
    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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/06/2013, 02h09
  2. [XL-2007] Macro filtre élaboré ne fonctionne pas
    Par schdam dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/09/2010, 07h26
  3. Réponses: 1
    Dernier message: 02/09/2010, 16h05
  4. [XL-2007] Macro sur Filtre élaboré
    Par jose_67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/02/2010, 19h45
  5. [Excel] Probleme filtre élaboré
    Par mick_ban dans le forum Excel
    Réponses: 3
    Dernier message: 08/03/2007, 05h15

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