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 :

Fonction "Find" sur valeurs précises VS valeurs quelconques [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut Fonction "Find" sur valeurs précises VS valeurs quelconques
    Bonjour,

    Je souhaiterai comprendre la différence entre une recherche sur une valeur précise ou sur une valeur quelconque.
    Je m'explique :
    J'ai en colonne 1 une valeur en A1 puis une valeur en A8 puis... peut importe.

    Je fais une recherche comme ceci : Set oRng = .Columns(1).Find("mavaleur", LookIn:=xlValues, LookAt:=xlWhole) et "mavaleur", positionnée en A1, est bien ciblée.
    Cependant, lorsque je fais ceci : Set oRng = .Columns(1).Find("*", LookIn:=xlValues, LookAt:=xlWhole) c'est ma valeur en A8 qui est prise en compte.

    Au final avec un exemple tout simple :
    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
    Option Explicit
     
    Sub comprend_pas()
     
    Dim oRng As Range
     
    With Worksheets("Feuil1")
        Set oRng = .Columns(1).Find("mavaleur", LookIn:=xlValues, LookAt:=xlWhole)
        MsgBox oRng.Address
     
        Set oRng = .Columns(1).Find("*", LookIn:=xlValues, LookAt:=xlWhole)
        MsgBox oRng.Address
     
    End With
     
    End Sub
    Moi pas comprendre...
    Est-ce que quelqu'un aurait une explication sur ce que je fais de mal ?

    Merci !

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut c'est normal
    Bonjour

    c'est normal
    j'en conclu donc que ta colonne est rempli jusqu'en A8

    c'est tout simple l'argument"*" veut tout et rien dire a la fois
    en fait en utilisant cet argument tu demande de chercher quelque chose donc la fonction find cherche jusqu'à qui il est une cellule vide tout simplement

    cet argument est utilisé en général avec la fonction "Like" en option d'une chaine de caractère

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for each cel in range("A1:A10")
    if cel like "*toto" then      'traduction :si il y "toto" avec quelque chose devant then  
     
    if cel like "toto*" then       'traduction :si il y "toto*" avec quelque chose après then  
     
    if cel like "*toto*" then      'traduction :si il y "*toto" avec quelque chose devant et après  then  
     
    next
    c'est plus clair la ?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour Patrick,

    Ce n'est justement pas le cas...
    Je n'ai aucune valeur entre A1 et A8... et la fonction .Find("*", LookIn:=xlValues, LookAt:=xlWhole) me retourne bien la première cellule non-vide (que j'ai des valeurs ou pas en A9:AXXX) MAIS sans considérer la première cellule de ma range de recherche...

    Je vais examiner plus en détail ce que tu viens de me dire... et continuer à chercher sur le net.

    Merci à toi en tout cas !

    Cordialement,
    Kimy

    EDIT : Autre exemple similaire avec une valeur en B12 et une valeur en E18 sans rien dans les autres cellules de la range :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Set oRng = .Range("B12:E18").Find("**", LookIn:=xlValues, LookAt:=xlWhole) ou '.Find("*", LookIn:=xlValues, LookAt:=xlWhole)
        MsgBox oRng.Address
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut,

    Regarde du coté du paramètre After:
    Cellule après laquelle vous souhaitez commencer la recherche. Elle correspond à la position de la cellule active quand une recherche est lancée à partir de l'interface utilisateur. Notez que le paramètre After doit désigner une cellule unique dans la plage, et que la recherche commence après cette cellule qui n'est analysée que quand la méthode y revient après avoir analysé les autres cellules. Si vous ne définissez pas cet argument, la recherche commence après la cellule figurant dans l'angle supérieur gauche de la plage.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    oui tu a raison c'est vrai

    mais dans tout les cas avec la fonction find cet argument est inutile et même susceptible de générer une erreur d'interprétation

    l'argument "lookatlpart" de la fonction find sert a ca sauf que l'on ne peut pas préciser ou la chaine inconnu se trouve (devant ou après )

    l'argument lookat:=xlWhole permet effectivement de rechercher une valeur exacte,
    à opposer à lookat:=xlPart qui permet de rechercher une valeur contenue dans la chaine de caractere de la cellule ou la feuille, par défaut en absence d'argument.
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Merci à vous deux !

    Je revenais sur le forum pour écrire la même chose que toi Nouveau2, que je viens de lire dans l'aide !
    Par contre, quelle valeur placer afin de commencer à la première cellule de ma range ?

    Patrick, j'entends qu'il n'est peut-être pas optimal d'utiliser ceci pour trouver la première cellule non vide.
    Que ferais-tu pour le coup ?

    Merci encore.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  7. #7
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    A mon avis, c'est la remarque de Nouveau2 qui est judicieuse.
    La recherche commence après la cellule spécifiée et s'il n'y en a pas, après la première en h et g de la plage.
    Dans ton cas, tu devrais avoir A2, et pas A8;

    Autre essai : tu écris "mavaleur" en A1 et A3, et ton code renvoie "A3" pour What:="mavaleur"

    Apparemment, pas moyen de commencer en A1, sauf à spécifier la dernière cellule de la colonne.

    Bon courage,

    pgz
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  8. #8
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Oui...
    Seul moyen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Set marange = .Range("B12:E18")
     
        Set oRng = marange.Find("*", After:=marange.Cells(marange.Cells.Count), LookIn:=xlValues, LookAt:=xlWhole)
        MsgBox oRng.Address
    Et affecter à marange la range de recherche.

    Merci à tous !

    Cordialement,
    Kimy

    EDIT : Je laisse le sujet ouvert pour ceci
    Citation Envoyé par Kimy_Ire Voir le message
    Patrick, j'entends qu'il n'est peut-être pas optimal d'utiliser ceci pour trouver la première cellule non vide.
    Que ferais-tu pour le coup ?
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  9. #9
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Re,

    Pour commencer la recherche en A1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Set oRng = .Columns(1).Find("*", after:=.Columns(1).End(xlDown), LookIn:=xlValues, LookAt:=xlWhole)
        Debug.Print oRng.Address
    Cordialement,

    pgz
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    effectivement pgz a raison si ca n'est pas précisé la recherche commence a la 2 Emme cellule de la plage

    donc si il y a plusieurs possibilité la fonction s'arrêtera a la première occurrence trouvée pour continuer c'est la fonction find next

    mais dans le cas de l'argument "*" ces deux fonctions seront obsolète puisque "*" veut dire quelque chose mais rien de precis donc la fonction find trouvera la première cellule pleine a partir de la 2 Emme cellule de la plage et la fonction find next te donnera la suivante et ainsi de suite jusqu'à la dernière ligne et remontera a la 1 ere ligne de la plage a la fin

    la fonction find fonctionne comme ceci:
    2 eme ligne de la plage
    3eme ligne de la plage
    4 eme ligne de la plage
    etc......
    et a la fin
    ligne 1 de la plage

    et pour être plus précis dans mon raisonnement :

    utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A1:A20").find("*")
    reviendrait a utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A" & range("A1").end(xldown).row)
    moi ce que j'en dis
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    trouver la premiere cellule pleine en partant de A1 vers le bas dans la colonne A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A" & range("A1").end(xldown).row)
    trouver la premiere ligne pleine en partant de tout en bas vers le haut dans la colonne A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A" & range("A" & rows.count).end(xlup).row)
    trouver la premiere cellule pleine sur la ligne 1 sur 10 colonnes en partant de la colonne A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A1" ).end(xlToRight)

    trouver la premiere cellule pleine sur la ligne 1 sur 10 colonnes en partant de la colonne j

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("j1" ).end(xlToleft)
    edit :
    une petite dernière
    trouver la derniere ligne utilisée n'importe quelle colonne utilisée dans le sheet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(1).UsedRange.Row
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour Patrick,

    Je te remercie pour ces éléments.
    Petite question cependant :
    L'expression End(xldown) (ou xlup) n'est disponible qu'à partir de la version 2007,
    Est-ce exact ?

    Je te remercie par avance pour cette toute dernière question et remercie tout le monde pour ses retours sur ce post.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour

    non ca y était avec 2003 déjà sur ce lien tu a la confirmation puisque tu a des exemple avec 65536 ligne et ca dit que pour 2007 c'est
    1048576 lignes

    et en plus je t'ai donné une astuce :moi j'utilise 'rows.count" a la place de ces deux chiffres ce qui permet de rendre compatible le code avec 2003 ou 2007 sans rien changer car cette expression veut dire nombre de ligne total du sheets

    cela répond t il a ta question ?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Oui, tout à fait.
    Merci encore pour tout.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/02/2014, 13h28

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