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 Find [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut Problème avec Find
    Bonjour à Tous,

    Ce matin, je ne comprend pas le fonctionnement d'une de mes fonctions.
    Celle ci utilise Find pour trouver des noms dans un onglet et retourner le matricule
    Quand on trouve le nom, on test si la période est celle souhaité sinon on passe au suivant.


    Les problèmes sont :
    - Il ne trouve pas le suivant (alors qu'il existe) => rg =nothing au 2eme tour
    - dans le loop While il sort de la fonction et retourne #VALEUR


    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
    23
    24
    25
    Function Matricule(Nom As String, Periode As Long) As Long
     
    Dim sh As Worksheet
    Dim Rg As Range
    Dim Ad As String
     
    Set sh = Sheets("Donnees")
     
    Set Rg = sh.Range("B:B").Find(Nom, LookIn:=xlValues, lookat:=xlWhole)
     
    If Not Rg Is Nothing Then
        Ad = Rg.Address
        Do
            If Rg.Offset(0, 2).Value = Periode Then
                Matricule = Rg.Offset(0, -1).Value
                Exit Function
            End If
            Set Rg = sh.Range("B:B").FindNext(Rg)
        Loop While Not Rg Is Nothing And Rg.Address <> Ad
     
    End If
     
    Matricule = 0
     
    End Function
    Ce matin, mes yeux ne sont peut etre pas en face des trous (week end très arrosé)

    EDIT : la fonction fonctionne pour le premier nom trouvé

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    Et en étant plus explicite, ça donne quoi?

    Sinon tu peux essayer de relancer la méthode 'find tout court' en spécifiant la direction de la recherche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlSearchDirection := xlNext

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut heu...!!!
    bonjour jfontaine
    pour bien comprendre je vais commenter les lignes de ton code dis moi si je me trompe?

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Function Matricule(Nom As String, Periode As Long) As Long
     'ici les variables
    Dim sh As Worksheet
    Dim Rg As Range
    Dim Ad As String
     'ici la variable sh deviens le sheets("données")
    Set sh = Sheets("Donnees")
    'ici la variable rg deviens la premiere cellule ou ce trouve le nom
    Set Rg = sh.Range("B:B").Find(Nom, LookIn:=xlValues, lookat:=xlWhole)
     'ici si Rg n'est pas rien alors Ad est l'adresse de rg
    If Not Rg Is Nothing Then
        Ad = Rg.Address
     'ici on demarre la boucle do loop  pour le find next
        Do
            
            ' ici donc si la cellule 2 colonne plus loin de la ligne de la la cellule Rg = periode
            'la variable matricule prend la valeur  de la cellule 1 colonne en moins de la ligne de RG
            
            If Rg.Offset(0, 2).Value = Periode Then
                Matricule = Rg.Offset(0, -1).Value
             
               ' c 'est ici a mon avis que ca va pas
                Exit Function 'donc ici si la periode est trouvée on sort de la fonction sa neutralise donc forcément  le find next meme si il y en a d'autre
            End If
            
            'ici on cherche le suivant
            Set Rg = sh.Range("B:B").FindNext(Rg)
        Loop While Not Rg Is Nothing And Rg.Address <> Ad 'on continu tant que rg n'est pas rien et que l'adresse de rg ne eviens  pas a Ad
     
    End If
     
    Matricule = 0
     
    End Function
    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

  4. #4
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    merci pour vos réponses,

    Sclarckone : toujours le meme problème

    patricktoulon : non ce n'est pas la le problème, a noter que j'ai testé en alimentant juste un compteur pour qu'il me retourne le nombre de nom trouvé. et meme problème, il ne passe pas au nom suivant

    La ligne ci dessous retourne un rg = nothing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Rg = sh.Range("B:B").FindNext(Rg)
    Et quand le code passe sur celle ci, au lieu de passer à la suite, il sort de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Loop While Not Rg Is Nothing And Rg.Address <> Ad
    J'utilise souvent le find mais, je n'ai jamais eu ce comportement

  5. #5
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    mon interrogation se poursuit,

    La procédure suivante (qui compte le nombre de fois que l'on trouve le nom) me retourne bien 3
    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 test()
     
    Dim rg As Range
    Dim Addr As String
    Dim nb As Long
     
    Set rg = Sheets("Donnees").Range("B:B").Find("NADIR BOUCHAIB")
    If Not rg Is Nothing Then
     
        Addr = rg.Address
     
        Do
            nb = nb + 1
            Set rg = Sheets("Donnees").Range("B:B").FindNext(rg)
        Loop While Not rg Is Nothing And rg.Address <> Addr
     
    End If
     
    MsgBox nb
     
    End Sub
    par contre, quand je la transforme en fonction je retrouve le meme problème.
    Pas de boucle et sortie sur le loop
    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
    Function Matricule() As Long
     
    Dim rg As Range
    Dim Addr As String
    Dim nb As Long
     
    Set rg = Sheets("Donnees").Range("B:B").Find("NADIR BOUCHAIB")
    If Not rg Is Nothing Then
     
        Addr = rg.Address
     
        Do
            nb = nb + 1
            Set rg = Sheets("Donnees").Range("B:B").FindNext(rg)
        Loop While Not rg Is Nothing And rg.Address <> Addr
     
    End If
     
    Matricule = nb
     
    End Function


    EDIT : je remarque que ce problème se passe quand j'utilise cette fonction dans une cellule

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    rebonjour jfontaine

    quand tu appelle ta fonction comme ceci

    =Matricule($A4;B$1)

    il faudrais que dans l'énoncer de ta fonction il y ai ces variables
    dans ton dernier post elles n'y sont plus regarde bien

    après pourquoi a4 et b1 si la fonction find recherche seulement dans la colone B

    au plaisir
    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

  7. #7
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    il faudrais que dans l'énoncer de ta fonction il y ai ces variables
    dans ton dernier post elles n'y sont plus regarde bien
    Je sais bien cela, ce code était un test afin de comparer le fonctionnement si lancement à partir d'une procédure ou une fonction.

    Jusqu’à preuve du contraire je vais considérer qu'une fonction appelée en formule ne fonctionne pas correctement si utilisation d'un Find avec boucle While.


    dans mon cas, j'ai contourné le problème en alimentant mon tableau par une procédure qui appel ma fonction (légèrement modifiée).
    Je perd le coté dynamique, mais pas sur que ce soit utile sur ce projet.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Je pense que Find pose problème quand il est employé dans une fonction. Le mieux dans ton cas est d'utiliser la fonction COUNTIF (mais là, je me demande à quoi sert la tienne ?) ou alors, de boucler sur les cellules de la plage :
    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
    23
    24
     
    Public Function MATRICULE(Plage As Range, _
                              Valeur As String) As Long
     
        Dim rg As Range
        Dim Addr As String
        Dim NB As Long
     
        For Each rg In Plage.Cells
     
            If rg.Value = Valeur Then
     
                NB = NB + 1
     
            End If
     
        Next rg
     
        'avec COUNTIF
        'MATRICULE = Application.WorksheetFunction.CountIf(Plage, Valeur)
     
        MATRICULE = NB
     
    End Function
    Hervé.

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    rebonjour jfontaine

    je persiste a dire que le exit function y est pour beaucoup

    avec effectivement il te donne le premier

    et donc pour continuer la recherche il faudrais relancer le find

    pour cela il te faudrai une variable de type range en haut de module et un bouton

    cette variable prendrais le range de la cellule trouvé
    et dans le bouton utiliser cette variable +1 pour définir le début de la plage a examiner et appeler la function avec la nouvelle plage
    a partir de la la function find suffirait

    mais avant tout il faudrait que je sache comment se présente "periode "
    c'est une date, un code ,un mot ,un chiffre?




    au plaisir
    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

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

Discussions similaires

  1. [XL-2003] Problème avec Find lors d'une éxécution automatique
    Par gentyjp dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/10/2010, 10h05
  2. Problème avec .Find sur la première case
    Par Cipollini dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/07/2010, 15h29
  3. Problème avec .find et findnext
    Par VictoriusDan dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/12/2009, 04h23
  4. Problème avec Find(), Excel Vba
    Par mmmxtina dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 28/05/2009, 11h57
  5. Problème avec "find"
    Par tnarol dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 18/04/2008, 11h32

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