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 :

Un « find » qui ne renvoie pas un range ? [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Points : 55
    Points
    55
    Par défaut Un « find » qui ne renvoie pas un range ?
    Bonjour à tous,

    dans un programme, j'ai la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim cListe as Range
    Set cListe = Sheets(FeuilleEtatAvancement).Range("ColNumAction").Find(what:=NumAction, LookIn:=xlValues, lookAt:=xlWhole) 'vérifier si le numéro est dans la liste complète
    Théoriquement donc, j'ai bien un Range dans mon cListe, et si je fais un cListe.entirerow.select, ça devrait me sélectionner la ligne entière.

    Or dans ce cas présent, ça ne fonctionne pas, ça me retourne un erreur 1004, la méthode Select de la classe Range a échoué.
    Pourtant, dans d'autres modules, j'ai des find qui fonctionnent bien avec un c.entirerow.select.

    Serait-ce parce que mon find doit chercher dans un range limité ("ColNumAction") ? Ou dois-je chercher ailleurs ?
    Parce que lorsque je vérifie, mon cListe n'est pas vide et contient bien la cellule recherchée.

    Merci de votre éclairage !

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Bonjour,

    non la méthode Find ne renvoie pas toujours un Range comme c'est pourtant clairement indiqué dans l'aide VBA intégrée …

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Invité
    Invité(e)

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Merci pour vos deux réponses, mais j'aimerais comprendre pourquoi !
    Qu'est-ce qui fait que find renvoie un range ou non ?
    Et puis, je déclare pourtant bien ma variable en range, comment peut-elle contenir autre chose qu'un range du coup ?

    Par contre, rdurpt, j'ai vu que tu proposais une alternative avec une fonction maison de recherche. En dernier recours, je l'utiliserais sans doute, mais j'aimerais bien d'une part comprendre ce qui ne va pas dans ce cas là, pourquoi, et s'il y a une alternative en gardant la simplicité du find plutôt qu'une fonction en plus.

    Merci !

  5. #5
    Invité
    Invité(e)
    Par défaut
    tu affect à une variable objet la référence de ta recherche; mai que ce passe-t-il si la valeur n'est pas trouvée (ERR)!

    ma solution comble cette lacune!

    de plus je ne me prends pas la tête à analyser le problème quand j'ai une solution clé en main!

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    tu affect à une variable objet la référence de ta recherche; mai que ce passe-t-il si la valeur n'est pas trouvée (ERR)!
    J'utilise un if not cListe is Nothing pour m'assurer qu'il y a bien une valeur trouvée et éviter toute erreur.

    de plus je ne me prends pas la tête à analyser le problème quand j'ai une solution clé en main!
    Étant un assez grand débutant en la matière, mais assez passionné, j'aime au contraire me prendre la tête à comprendre pourquoi il y a un problème avant de la résoudre par du clé en main, car c'est à mon sens la meilleure façon de progresser !
    En tout cas merci, car je sais que je peux au moins débloquer mon problème grâce à ta solution, mais ça ne retire en rien mon incompréhension face à ma problématique initiale. Dans quel(s) cas un find va-t-il comme ici, m'attribuer à une variable range une valeur qui ne semble pas un range ?

    [edit : visiblement c'est bien le fait que je fasse une recherche dans une plage donnée, si je remplace mon range("nom de plage") par un cells, tout fonctionne...]

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Intrigué par ton pb j'ai testé la recherche sur une plage nommée, pas de soucis.
    Ta feuille est-elle active pour le .select ?
    Sinon voir peut-être comment a été défini le nom (?)

    eric
    Fichiers attachés Fichiers attachés

  8. #8
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par GroFlo Voir le message
    dans un programme, j'ai la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim cListe as Range
    Set cListe = Sheets(FeuilleEtatAvancement).Range("ColNumAction").Find(what:=NumAction, LookIn:=xlValues, lookAt:=xlWhole) 'vérifier si le numéro est dans la liste complète
    Apparemment tu cherches une valeur numérique avec le paramètre LookIn:=xlValues.
    Il faut savoir qu'avec comme paramètre LookIn:=xlFormulas, la fonction FIND fait une recherche dans la propriété FORMULA des cellules. Cette propriété n'est pas affectée par le format d'affichage de la cellule.
    Avec comme paramètre LookIn:=xlValues, FIND effectue la recherche dans la propriété TEXT des cellules, c'est-à-dire dans la valeur affichée. Et la valeur affichée n'est pas nécessairement identique à la valeur réelle qui se trouve dans la propriété VALUE.
    Exemple: si les cellules ne sont pas formatées, seuls les 11 premiers caractères de la valeur réelle sont affichés. Si la valeur réelle contient plus de 11 caractères, seuls les 11 premiers sont affichés (et arrondis si le 12ième caractère est supérieur à 5). Il est donc impossible de trouver une valeur réelle de plus de 11 caractères dans la propriété TEXT de la cellule.
    Ça, c'est si la largeur de la colonne est suffisante pour afficher les premiers 11 caractères. Sinon la propriété TEXT prend la valeur ##########, dans quel cas la fonction FIND ne peut trouver la valeur numérique.
    La solution pour éviter que la propriété TEXT contienne ##########, c'est de mettre la propriété ShrinkToFit des cellules à TRUE, ce qui supprime les ########## à la condition cependant que la largeur de la colonne ne soit pas égale à 0.

    Si la valeur réelle contient plus de 11 caractères, il faut que les cellules soient formatées pour qu'elles puissent afficher plus de 11 caractères.
    Cordialement

    Docmarti.

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 771
    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 : 12 771
    Points : 28 631
    Points
    28 631
    Billets dans le blog
    53
    Par défaut
    Bonjour Gerard,
    Très belle explication qui mérite un vote
    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

  10. #10
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Il faut savoir ...
    1ère fois que je vois ça expliqué aussi clairement.
    J'avais bien remarqué qu'avec xlFormulas on avait parfois un fonctionnement meilleur, mais sans faire le lien avec .value et .text
    C'est quand même pas malin d'avoir appelé ce paramètre xlValues s'il ne se base pas sur .value :-s
    J'aurais bien mis +5 mais je ne peux pas.
    Merci
    eric

  11. #11
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonsoir le fil, bonsoir le forum,

    Un régal avec de tels expert que vous êtes !...
    À plus,

    Thauthème

    Je suis Charlie

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par eriiic Voir le message
    Bonjour,

    Intrigué par ton pb j'ai testé la recherche sur une plage nommée, pas de soucis.
    Ta feuille est-elle active pour le .select ?
    Sinon voir peut-être comment a été défini le nom (?)

    eric
    Ma feuille est bien active, la preuve étant que ma recherche fonctionne si je ne me limite pas à ma plage nommée.
    De fait, le facteur problématique provient peut-être bien de ma plage, je vais creuser de ce côté là.
    Mais ce qui je trouve étrange, c'est que lorsque je fais un pas à pas, mon cListe n'est pas vide et contient bien la valeur cherchée...

    Citation Envoyé par Docmarti Voir le message
    Apparemment tu cherches une valeur numérique avec le paramètre LookIn:=xlValues.
    Il faut savoir qu'avec comme paramètre LookIn:=xlFormulas, la fonction FIND fait une recherche dans la propriété FORMULA des cellules. Cette propriété n'est pas affectée par le format d'affichage de la cellule.
    Avec comme paramètre LookIn:=xlValues, FIND effectue la recherche dans la propriété TEXT des cellules, c'est-à-dire dans la valeur affichée. Et la valeur affichée n'est pas nécessairement identique à la valeur réelle qui se trouve dans la propriété VALUE.
    Exemple: si les cellules ne sont pas formatées, seuls les 11 premiers caractères de la valeur réelle sont affichés. Si la valeur réelle contient plus de 11 caractères, seuls les 11 premiers sont affichés (et arrondis si le 12ième caractère est supérieur à 5). Il est donc impossible de trouver une valeur réelle de plus de 11 caractères dans la propriété TEXT de la cellule.
    Ça, c'est si la largeur de la colonne est suffisante pour afficher les premiers 11 caractères. Sinon la propriété TEXT prend la valeur ##########, dans quel cas la fonction FIND ne peut trouver la valeur numérique.
    La solution pour éviter que la propriété TEXT contienne ##########, c'est de mettre la propriété ShrinkToFit des cellules à TRUE, ce qui supprime les ########## à la condition cependant que la largeur de la colonne ne soit pas égale à 0.

    Si la valeur réelle contient plus de 11 caractères, il faut que les cellules soient formatées pour qu'elles puissent afficher plus de 11 caractères.
    Merci beaucoup, c'est effectivement une réponse extrêmement pédagogique et utile, je n'avais jamais imaginé qu'un find puisse chercher sur les caractères affichés, mais j'aurais pensé plutôt aux caractères « retournés » par la formule. Ça peut être une vraie source d'ennuis, il vaut mieux le savoir !
    Pour autant, ça n'explique pas mon problème puisque si je n'indique pas la plage, sans rien changer d'autre, le find me renvoie le résultat cherché.
    En revanche, ça me fait méchamment réfléchir sur la pertinence de garder un xlValues dans mes paramètres et nécessite peut-être de réfléchir à une solution alternative... Merci donc beaucoup !

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

Discussions similaires

  1. Requete qui ne renvoie pas de résultat
    Par bruno782 dans le forum Requêtes
    Réponses: 6
    Dernier message: 01/08/2019, 13h39
  2. VBA Access : Fonction find qui ne marche pas
    Par leeloo35 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/02/2008, 16h56
  3. [MySQL] Liste déroulante dynamique qui ne renvoie pas sur la bonne page
    Par Adaviada dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 23/11/2007, 20h27
  4. Fonction récursive qui ne renvoie pas le résultat
    Par mathieugamin dans le forum Langage
    Réponses: 4
    Dernier message: 05/11/2007, 10h29
  5. [ODBC] Connection pour MSSQL qui ne renvoie pas de données
    Par Jabbal'H dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/07/2007, 17h10

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