Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/09/2011, 12h11   #1
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 894
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 894
Points : 7 178
Points : 7 178
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 :
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é
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 12h28   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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 :
xlSearchDirection := xlNext
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 12h36   #3
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut heu...!!!

bonjour jfontaine
pour bien comprendre je vais commenter les lignes de ton code dis moi si je me trompe?

Code :
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:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 13h33   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 894
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 894
Points : 7 178
Points : 7 178
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 :
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 :
Loop While Not Rg Is Nothing And Rg.Address <> Ad
J'utilise souvent le find mais, je n'ai jamais eu ce comportement
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 13h52   #5
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 894
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 894
Points : 7 178
Points : 7 178
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 :
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 :
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
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 15h05   #6
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
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:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 15h27   #7
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
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 :
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é.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 15h41   #8
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
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:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 15h47   #9
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 894
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 894
Points : 7 178
Points : 7 178
Citation:
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.
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h10.


 
 
 
 
Partenaires

Hébergement Web