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 avec la méthode find d'un objet Range dans une zone filtrée [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 92
    Points : 54
    Points
    54
    Par défaut Problème avec la méthode find d'un objet Range dans une zone filtrée
    Bonjour à tous,

    Voilà, j'ai un petit soucis en voulant rechercher/parcourir une valeur dans une colonne qui par ailleurs fait l'objet d'un filtre. J'ai donc un tableau (par exemple A1:D50) pour lequel j'ai activé les filtres (Autofilter) et sélectionné que certaines valeurs de ma colonne B ce qui a pour conséquence de ne m'afficher que 20 lignes de mon tableau sur les 50.

    Maintenant je souhaiterais parcourir ma colonne A par la méthode Find pour repérer toutes les cellules de cette colonne contenant la valeur 2. Je suis en vba et ai donc une ligne de type Activesheet.Range("A1:A50").Find(2, Lookin:= xlValues). Malheureusement je constate que cette méthode ne recherche la valeur 2 que dans les lignes visibles, et ignore les lignes invisilbes de mon objet Range.

    Auriez-vous une piste pour que la recherche se fasse également dans les lignes non visibles (donc ignorées par le filtre en place sur la colonne B) si possible sans avoir à retirer mon filtre puis le réappliquer... Tous les post que j'ai lu concernent en général la façon d'identifier que les cellules visibles, ce qui est plutôt le problème inverse du miens.


    Merci à ceux qui prendront le temps de m'éclairer.

    Stargates

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,

    Lire le champ A1:D50 dans un tableau et effectuer les recherches dans le tableau par exemple (rapide)
    On peut aussi utiliser application.match sur une colonne.

    Jacques Boisgontier

  3. #3
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Fais une boucle sur la plage de la colonne B.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 92
    Points : 54
    Points
    54
    Par défaut
    Merci pour vos réponses. Je vais approfondir la méthode match.

    Qu'entends-tu par "Fais une boucle sur la colonne B" ?

    Je crois que j'ai compris pour la boucle (je suis unpeu lent ce soir...). Le problème est que je souhaite appliquer mon code à un tableau qui peut atteindre 150.000 lignes et je pense que la méthode find et findnext est plus performante que la boucle (si j'arrivais à l'appliquer sur les cellules invisibles).

  5. #5
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Utilise une variable tableau, c'est très rapide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Tablo = Range("B1:B150000")
    For i = 1 To 150000
        If Cells(i, 2) = 2 Then
            MsgBox Cells(i, 2)
        End If
    Next i
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 92
    Points : 54
    Points
    54
    Par défaut
    Merci, j'avais pas pensé à la variable tableau qui doit effectivement aller beaucoup plus vite qu'une boucle sur les cellules de la feuille. Je vais tester et reviendrai clore le sujet. J'espère que Tablo = Range("A1:A15000") ne charge pas que les cellules visibles...

    Merci encore.
    Stargates

  7. #7
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      a = [A1:A60000]
      v = "Nom50000"
      pos = Application.Match(v, a, 0)
      MsgBox pos
    Jacques Boisgontier

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Des fois, je me mettrais des coups de pied au c..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Tablo As Variant, Ligne
    Ligne = Cells(Rows.Count, 2).End(xlUp).Row
    Tablo = Application.Transpose(Range("B1:B" & Ligne))
    For i = 1 To UBound(Tablo)
        If Tablo(i) = 2 Then
            MsgBox Tablo(i)   'i représente la ligne trouvée
        End If
    Next i
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  9. #9
    Membre éprouvé Avatar de keygen08
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 545
    Points : 973
    Points
    973
    Par défaut
    Bonjour
    remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Activesheet.Range("A1:A50").Find(2, Lookin:= xlValues).
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Activesheet.Range("A1:A50").Find(2, Lookin:= xlformulas).
    et la recherche se fera également dans les lignes cachées

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonsoir keygen08,

    Je n'arrive pas à reproduire (Excel 2013). C'est du reste dangereux si "2" est le résultat d'une formule.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 92
    Points : 54
    Points
    54
    Par défaut
    Bonsoir,

    Je reprends le fil et vous remercie tous pour vos solutions.

    - Jacques : OK pour la fonction Match mais ça m'obligerait me semble-t-il à itérer en redimenssionnant la matrice de recherche puisque je souhaite parcourir tout mon objet range et trouver toutes les lignes dont la colonne A contient 2 (et non juste la première occurence)
    - Daniel : merci pour le coup de la variable et le code qui va avec et fonctionne bien. Je testerai les différences de performance entre cette solution et les autres
    - KeyGen08 : merci pour cette solution. Il se trouve que ma colonne ne contient pas de formule donc je dois pouvoir utiliser cette astuce. Là aussi je vais comparer les performances avec la solution de Daniel (sur 150.000 lignes ce n'est sans doute pas neutre).

    J'avoue avoir du mal à comprendre comment se comportent les différentes méthodes de l'objet Range quand celui-ci est un tableau filtré. Certaines méthodes ne prennent en compte que les lignes visibles, d'autres à l'inverse s'appliquent à toutes les lignes mêmes les cachées. L'aide n'est pas très prolixe sur ces sujets...

    Encore merci à vous.
    Stargates

    Précision : J'ai essayé la méthode Activesheet.Range("A1:A50").Find(2,Lookin:= xlformulas) sous excel 2010 et ça ne recherche toujours que sur les lignes visibles.

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

Discussions similaires

  1. Problème avec la méthode find
    Par Heuvanek dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 29/06/2015, 09h42
  2. problème avec la méthode find et find next
    Par Sylvie66 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/05/2015, 17h33
  3. Problème avec ma méthode Find
    Par cdurep dans le forum Excel
    Réponses: 2
    Dernier message: 04/03/2014, 10h30
  4. Réponses: 14
    Dernier message: 04/10/2012, 13h14
  5. Réponses: 2
    Dernier message: 05/06/2009, 16h08

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