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 :

VBA_Excel-Pb pour trouver un nom dans une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut VBA_Excel-Pb pour trouver un nom dans une cellule
    Bonsoir.
    Je travaille avec XP SP2 et Excel 2003
    Dans une feuille nommée : Nom, j’ai une colonne A contenant des noms de la ligne 1 à la ligne 50
    En A1 j’ai : Age
    En A2 j’ai AgeCd
    Je cherche l’adresse d’une cellule contenant un nom. Pour cela j’utilise ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim Adresse As String  'adresse de la cellule à trouver
    Adresse = Worksheets("Nom").Range("A1:A50").Find("Age" ).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    Or comme résultat Adresse = A2 au lieu d’avoir pour réponse A1
    Comment se fait-il que AgeCd soit trouvé en premier au lieu de Age ?

    Merci pour vos réponses.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Même problème avec une variante
    Bonsoir.
    Je vais essayer d’être plus clair car dans ma ligne du code VBA j’ai mis directement la valeur des variables utilisées. Je recherche donc l’adresse de la cellule qui contient : Age
    Dans la colonne A j’ai
    A
    1 Age
    2 AgeCd
    3 Britain
    4 Carri
    5 CarriCd
    6 Farber

    Etc…

    La réponse est A2 lorsque je demande de trouver : Age
    Si je demande de trouver : AgeCd
    La réponse est aussi A2

    Je viens de découvrir que si je met en
    A1 : AgeCd
    A2 : Age

    La réponse est A2 pour Age et A1 pour AgeCd

    Par contre si je remet en
    A1 : Age
    A2 : AgeCd

    La réponse est toujours A2 ????

    J'ai un petit classeur pour mettre en évidence ce phénomène au cas ou une personne serait interressé à m'aider.
    Merci.

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Oui, c'est exact, tu as bien Age+Cd sur la seconde ligne
    Essaie avec Columns(1) ou range("A:A")
    Je pense que Fing cherche "le suivant"

    Tu peux aussi ajouter le paramètre LookAt:=xlWhole qui vérifie que c'est la donnée entière d'une cellule que tu cherches

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Bonsoir.
    Merci de ta réponse ouskel'n'or .

    J’ai créé un classeur avec une seule colonne A remplie comme indiqué précédemment pour tester cette procédure.
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub essais1()
    Dim noM As String
    Dim Adresse As String  'adresse de la cellule à trouver
    noM = "Age"
    Adresse = Worksheets("Nom").Range("A1:A50").Find(noM).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    MsgBox ("Le nom : " & noM & "  se trouve en " & Adresse)
    End Sub
    J’ai utilisé Columns(1) et Range ("A :A")
    Cela n’a rien changé.
    J’ai essayé le paramètre LookAt:=xlWhole
    mais j’ai une erreur 1004
    J’ai du mal le placer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Adresse = Worksheets("Nom").Range("A1:A50").Find(noM).Address(RowAbsolute:=False, ColumnAbsolute:=False, LookAt:=xlWhole)
    Je ne pige pas d’où vient cette non reconnaissance d’un mot.

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub trouverlErreur()
    Dim c As Variant, Nom, adresse
    Nom = "Age"
    Worksheets("feuil1").Range("A1").Select
    With Worksheets("feuil1").Range("a1:a20")
        Set c = .Find(Nom, LookIn:=xlValues)
        If Not c Is Nothing Then
                adresse = c.Address(False, False)
        End If
    End With
    Ce qui m'a éclairé, c'est cette phrase, dans l'aide
    After Argument de type Variant facultatif. Cellule après laquelle vous souhaitez commencer la recherche. Cela correspond à la position de la cellule active lorsqu'une recherche est effectuée à partir de l'interface utilisateur
    Épi je me suis souvenu, ça m'était déjà arrivé
    A+

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Rebonsoir et merci de rester si tard.
    En reprenant ta procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub trouverlErreur()
    Dim c As Variant, Nom, adresse
    NomRecherch = "Age"
    Worksheets("Nom").Range("A1").Select
    With Worksheets("Nom").Range("a1:a20")
        Set c = .Find(NomRecherch, LookIn:=xlValues)
        If Not c Is Nothing Then
                adresse = c.Address(False, False)
        End If
    End With
    End Sub
    En déroulant la macro pas à pas, en mettant le curseur sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Set c = .Find(Nom, LookIn:=xlValues)
    C = AgeCd
    Nom = Age

    Et adresse = A2 qui est bien la cellule que contient AgeCd et que m’indique : c
    Mais je n’ai toujours pas la cellule qui contient Age c'est-à-dire A1

    La solution serait que lorsque je demande de trouver Age dans une cellule il me trouve A1

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    J'ai fait une erreur sur la ligne : set c
    Je reprends les codes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub trouverlErreur()
    Dim c As Variant, Nom, adresse
    NomRecherch = "Age"
    Worksheets("Nom").Range("A1").Select
    With Worksheets("Nom").Range("a1:a20")
        Set c = .Find(NomRecherch, LookIn:=xlValues)
        If Not c Is Nothing Then
                adresse = c.Address(False, False)
        End If
    End With
    End Sub
    En déroulant la macro pas à pas, en mettant le curseur sur cette ligne :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Set c = .Find(NomRecherch, LookIn:=xlValues)
    C = AgeCd
    Nom = Age

    Et adresse = A2 qui est bien la cellule que contient AgeCd et que m’indique : c
    Mais je n’ai toujours pas la cellule qui contient Age c'est-à-dire A1

    La solution serait que lorsque je demande de trouver Age dans une cellule il me trouve A1

    Toutes mes excuses. je crois que je vais me coucher. Je fatigue....
    Bonne nuit !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    C’est encore moi ! (Je vais finir par ennuyer tout le monde avec ce problème)

    Pour bien faire apparaître la difficulté du problème j’ai rempli 2 colonnes
    A et B
    J’ai inversé les 2 premiers noms.

    Dans la colonne A j’ai en :

    A1 = Age
    A2 = AgeCd
    A3 = Britain
    A4 = Carri
    A5 = CarriCd
    A6 = Farber

    Dans la colonne B j’ai en :

    B1 = AgeCd
    B2 = Age
    B3 = Britain
    B4 = Carri
    B5 = CarriCd
    B6 = Farber

    Première macro pour trouver Age en colonne A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub essais1()
    Dim NomRecherch As String
    Dim adresse As String  'adresse de la cellule à trouver
    NomRecherch = "Age"
    adresse = Worksheets("Nom").Range("A1:A50").Find(NomRecherch).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    MsgBox ("Le nom : " & NomRecherch & "  se trouve en " & adresse)
    End Sub
    La réponse est A2 ce qui est faux.

    Deuxième macro pour trouver AgeCd en colonne A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub essais2()
    Dim NomRecherch As String
    Dim adresse As String  'adresse de la cellule à trouver
    NomRecherch = "AgeCd"
    adresse = Worksheets("Nom").Range("A1:A50").Find(NomRecherch).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    MsgBox ("Le nom : " & NomRecherch & "  se trouve en " & adresse)
    End Sub
    La réponse est identique : A2 ce qui est vrai.

    Troisième macro pour trouver Age en colonne B :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub essais3()
    Dim NomRecherch As String
    Dim adresse As String  'adresse de la cellule à trouver
    NomRecherch = "Age"
    adresse = Worksheets("Nom").Range("B1:B50").Find(NomRecherch).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    MsgBox ("Le nom : " & NomRecherch & "  se trouve en " & adresse)
    End Sub
    La réponse est A2 ce qui est vrai.

    Quatrième macro pour trouver AgeCd en colonne B :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub essais4()
    Dim NomRecherch As String
    Dim adresse As String  'adresse de la cellule à trouver
    NomRecherch = "AgeCd"
    adresse = Worksheets("Nom").Range("B1:B50").Find(NomRecherch).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    MsgBox ("Le nom : " & NomRecherch & "  se trouve en " & adresse)
    End Sub
    La réponse est A1 ce qui est vrai.

    Une seule réponse est fausse, c’est quant Age est en première ligne de la colonne A

    J’ai l’impression qu’il considère Age en A1 comme une entête de colonne et qu’il n’en tient pas compte dans la recherche. Mais pourquoi ne le fait-il pas en B2…..

    Non, là c’est décidé, je vais me coucher. Ca prend la tête ce petit bout de programme.

    Bonne nuit.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par ouskel'n'or
    Oui, c'est exact, tu as bien Age+Cd sur la seconde ligne
    Essaie avec Columns(1) ou range("A:A")
    Je pense que Find cherche "le suivant"

    Tu peux aussi ajouter le paramètre LookAt:=xlWhole qui vérifie que c'est la donnée entière d'une cellule que tu cherches
    As-tu essayé ce que te dit ouskel'n'or? As-tu regardé dans l'aide VBA sur Find?
    En rajoutant .Find(What="Age", LookAt:=xlWhole) tu ne pourras pas te tromper...

    Ensuite pour une explication sur [A1:A50].Find("Age").Address = "$A$2" :
    C'est comme si tu le faisais mannuellement, et que tu sélectionnais A1 à A50. A1 est alors la cellule active. Or Find par défaut fait une recherche SearchOrder:=xlNext, donc il recherche après la cellule A1, et il trouve en premier A2.
    Avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox [A1:A50].Find(What:="Age", After:=[A50]).Address
    il va commencer la recherche après la dernière cellule, ie à partir de la 1ere...
    PS. [A1:A50] équivaut à Range("A1:A50")

    Tiens pour mieux comprendre essaie ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
        With Worksheets("Nom").Range("a1:a50")
            Set c = .Find("Age", LookIn:=xlValues)
            If Not c Is Nothing Then
                firstAddress = c.Address
                Do
                    MsgBox c.Address
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> firstAddress
            End If
        End With
    End Sub

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Bonjour dadavyvy.

    Oui j’ai essayé la méthode de ouskel'n'or comme expliqué précédemment.

    J’ai bien lu la définition de Find

    Mais dans mon exemple, comment expliquer que cela fonctionne avec la colonne B en cherchant AgeCd quand AgeCd est en A1. Dans ce cas là la réponse est bonne.

    Je récapitule.

    1er cas
    Quand je met en
    A1 = Age
    A2 = AgeCd

    Je demande de rechercher Age la réponse est A2 (faux)
    Je demande de rechercher AgeCd la réponse est A2 (vrai)

    2ème cas
    Si je met en
    A1 = AgeCd
    A2 = Age

    Je demande de rechercher Age la réponse est A2 (vrai)
    Je demande de rechercher AgeCd la réponse est A1 (vrai)

    Dans ce 2ème cas , il part bien de la cellule A1 et me trouve bien AgeCd en A1.
    Alors pourquoi ne le fait-il pas dans le 1er cas avec Age en première ligne.

    Mystère ou, cas le plus probable, c’est moi qui suis borné et coincé sur une idée dont je ne peux me débarrasser.

    Je vais abandonner et essayer de chercher une autre voie.
    Merci à tous.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Re Bonjour.

    Je sais, je ne devrai pas insister, mais c'est comme une drogue ce VBA.

    J'ai trouvé une fonction sur le net et je croyai avoir résolu le problème.
    Mais ce coup-ci c'est avec la disposition du 2ème cas que le problème se situe !!!
    Avec la disposition du 1er cas c'est OK !!!!!!.

    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
     
    Sub Essais9()
    Dim nomRecherch As String
    nomRecherch = "Age"
    MsgBox ("Le nom : " & nomRecherch & "  se trouve en " & Adresse(nomRecherch))
    End Sub
     
    Function Adresse(Nom As String)
    Dim strAddress As String
      On Error Resume Next
     
      With Columns("B:B")
        Adresse = .Find( _
          What:=Nom, _
          After:=.Cells(.Cells.Count), _
          LookIn:=xlValues, _
          LookAt:=xlPart, _
          SearchDirection:=xlNext, _
          MatchCase:=False).Address(RowAbsolute:=False, ColumnAbsolute:=False)
      End With
    End Function
    De plus en plus mystérieux...
    Va falloir que je potasse dur ce VBA .

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    A mon code ajoute simplement LookAt:=xlWhole à cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = .Find("Age", LookIn:=xlValues, LookAt:=xlWhole)
    Curieux j'étais sûr de l'avoir dit
    Ma mémoire ne serait-elle plus ce qu'elle était ?
    Tu dis
    A+

    Edit
    Hé si, je l'ai dit ! Ici Ouf !

    Edit - Re
    Ajoute ça à mon dernier code, celui où l'on sélectionne "A1" avant le Set

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par martiweb
    Je récapitule.

    1er cas
    Quand je met en
    A1 = Age
    A2 = AgeCd

    Je demande de rechercher Age la réponse est A2 (faux)
    Je demande de rechercher AgeCd la réponse est A2 (vrai)

    2ème cas
    Si je met en
    A1 = AgeCd
    A2 = Age

    Je demande de rechercher Age la réponse est A2 (vrai)
    Je demande de rechercher AgeCd la réponse est A1 (vrai)

    Dans ce 2ème cas , il part bien de la cellule A1 et me trouve bien AgeCd en A1.
    Alors pourquoi ne le fait-il pas dans le 1er cas avec Age en première ligne.

    Mystère ou, cas le plus probable, c’est moi qui suis borné et coincé sur une idée dont je ne peux me débarrasser.
    Parce que "AgeCd" contient "Age", mais "Age" ne contient pas "AgeCd"
    Ainsi dans le 1er cas, tu recherches la 1ere cellule apres A1 qui contient "Age" et hop il s'arrete à A2.
    Ensuite dans le 2e cas, tu recherches la 1ere cellule apres A1 qui contient "AgeCd", il parcourt de A2 à A50, ne trouve rien et revient sur A1 (car la plage est de A1 à A50), et hop il s'arrête à A1.

    Pour info, pourquoi il commence à chercher après A1? car par défaut, le paramètre After est égal à la cellule active soit A1, et que SearchOrder est xlNext par défaut.

    J'ai été clair là?

    Donc pour éviter de rechercher une cellule qui contient "Age", si tu recherches la cellule qui est égale à "Age" (-> tu vois la nuance?), fais comme ousk' et moi-même te répétons depuis plusieurs posts : rajoute le paramètre LookAt:=xlWhole à la méthode Find, et tu verras tu trouveras "Age" dans la cellule qui va bien et "AgeCd" aussi, que ce soit dans la colonne A ou B...

    Bon courage...

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Bonsoir.
    Ca y est. Ouf. C’est bien moi qui suis borné !!!!
    J’avais oublié d’ajouter
    LookAt:=xlWhole
    Pourtant tu me l’avais dit ouskel’n’or à ton premier post !
    C’est l’âge que veux tu je suis plutôt du coté des papys que des adolescents.
    Encore merci.
    Merci aussi à toi dadavyvy pour tes explications très détaillées et cette patience envers moi.
    Je vous souhaite une bonne nuit


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

Discussions similaires

  1. Requete pour trouver des trous dans une suite
    Par Ben_Le_Cool dans le forum Langage SQL
    Réponses: 11
    Dernier message: 28/08/2009, 18h17
  2. Commande pour passer à la ligne dans une cellule
    Par tim974 dans le forum Excel
    Réponses: 2
    Dernier message: 22/01/2009, 12h11
  3. Pbm pour empêcher la saisie dans une cellule où il y a une formule
    Par doremifaso dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/06/2008, 13h51
  4. [Formule]Macro pour masquer des formules dans une cellule
    Par Hellx dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/04/2007, 08h21
  5. requête pour trouver un mot dans une phrase
    Par FRIGAUX dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 25/11/2006, 22h18

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