Résultat FindNext différent entre Function et Sub ???

JNP

XLDnaute Barbatruc
Bonjour le forum :),
Depuis hier soir, je bute sur quelque chose de certainement très bête mais je n'arrive pas à trouver l'erreur :eek:...
En rapport avec ce fil, j'ai d'abord construit une recherche simple qui marche très bien
Code:
Function RechercheSimple(Plage As Range, AChercher As String, ADécaler As Integer) As String
Dim Cellule As Range
Set Cellule = Plage.Find(What:=AChercher, LookIn:=xlFormulas, LookAt:=xlWhole, MatchCase:=True)
If Not Cellule Is Nothing Then RechercheSimple = Cellule.Offset(0, ADécaler)
End Function
puis j'ai voulu intégrer une possibilité de choisir les N valeurs trouvées à la suite. J'ai donc écrit cette fonction
Code:
Function RechercheMultiple(Plage As Range, AChercher As String, ADécaler As Integer, Valeur As Integer) As String
Dim Cellule As Range, Première As String, Tableau() As String, I As Integer
With Plage
Set Cellule = .Find(What:=AChercher, LookAt:=xlWhole, MatchCase:=True)
If Not Cellule Is Nothing Then
Première = Cellule.Address
Do
MsgBox Cellule.Address
ReDim Preserve Tableau(I)
Tableau(I) = Cellule.Offset(0, ADécaler)
I = I + 1
Set Cellule = .FindNext(Cellule)
Loop While Not Cellule Is Nothing And Cellule.Address <> Première
Else
Exit Function
End If
End With
If Valeur - 1 <= UBound(Tableau) Then
RechercheMultiple = Tableau(Valeur - 1)
End If
End Function
qui ne marche pas. Pourquoi ? En faisant du pas-à-pas, je me suis aperçu que le FindNext renvoyait Nothing :confused:... D'où plantage sur Cellule.Address :rolleyes:...
Pourtant, un copier/coller du même code en sub
Code:
Sub test()
Dim Cellule As Range, Première As String, Tableau() As String, I As Integer
With Range("A:A")
Set Cellule = .Find(What:="ab", LookAt:=xlWhole, MatchCase:=True)
If Not Cellule Is Nothing Then
Première = Cellule.Address
Do
MsgBox Cellule.Address
Set Cellule = .FindNext(Cellule)
Loop While Not Cellule Is Nothing And Cellule.Address <> Première
End If
End With
End Sub
lui fonctionne :confused:... J'ai mis des MsgBox pour mettre le problème en exergue :(.
De plus, j'ai déjà utilisé FindNext dans des fonctions sans soucis :rolleyes:...
Le fichier en PJ. Si quelqu'un peux m'expliquer, je suis preneur :p...
Bon dimanche :cool:
 

Pièces jointes

  • RecherchevMinusculeMajuscule.xls
    46 KB · Affichages: 60
  • RecherchevMinusculeMajuscule.xls
    46 KB · Affichages: 67
  • RecherchevMinusculeMajuscule.xls
    46 KB · Affichages: 65

JNP

XLDnaute Barbatruc
Re : Résultat FindNext différent entre Function et Sub ???

Re :),
Vraiment plus fort que de jouer au bouchon :confused:...
J'ai créé une fonction uniquement niveau Range
Code:
Function RenvoiRange(Plage As Range, Critère As String) As Range
Dim Cellule As Range, Première As String, Tableau() As String, I As Integer
With Range("A:A")
Set Cellule = .Find(What:=Critère, LookAt:=xlWhole, MatchCase:=True)
If Not Cellule Is Nothing Then
Première = Cellule.Address
Do
If RenvoiRange Is Nothing Then
Set RenvoiRange = Cellule
Else
Set RenvoiRange = Union(RenvoiRange, Cellule)
End If
Set Cellule = .FindNext(Cellule)
Loop While Not Cellule Is Nothing And Cellule.Address <> Première
End If
End With
End Function
solicitée par une sub
Code:
Sub test2()
Dim cellules As Range
Set cellules = RenvoiRange(Range("A:A"), "ab")
MsgBox cellules.Address
End Sub
elle fonctionne ;).
Solicité par une fonction de feuille
Code:
Function RechercheMultiple2(Plage As Range, AChercher As String, ADécaler As Integer, Valeur As Integer) As String
Dim MaPlage As Range
Set MaPlage = RenvoiRange(Plage, AChercher)
If Not MaPlage Is Nothing Then
If Valeur <= MaPlage.Count Then
RechercheMultiple2 = MaPlage(Valeur).Offset(ADécaler)
End If
End If
End Function
elle plante exactement au même endroit :mad::mad::mad:...
Bon dimanche :cool:
 

flyonets44

XLDnaute Occasionnel
Re : Résultat FindNext différent entre Function et Sub ???

bonjour voici du code qui fonctionne; à l'époque j'ai cherché longtemps avant de trouver
la solution
Bon courage
Flyonets
:cool:
Sub Findthis()
'Identifier des occurrences, et stocker leur adresse
'FLYONETS 22.08.07' dans une collection
Dim C As Range, Plage As Range
Dim FirstAddress As Variant, K&
Dim Findthis As Variant
Dim Collection As New Collection
Application.ScreenUpdating = False
'le mot recherché
Findthis = "ab"
Set Plage = Range("A:A")
K = Application.CountIf(Plage, Findthis)
If K > 0 Then
'Loops, finds all results, and adds them to a collection appropriately named "Collection"
With Plage
Set C = .Find(Findthis, LookIn:=xlValues, MatchCase:=False)
'le mot existe, stockage de la 1° adresse
If Not C Is Nothing Then
FirstAddress = C.Address
Do
'stockage de l'adresse des occurences trouvées
Collection.Add C.Address
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> FirstAddress
MsgBox "Total des mots trouvés=: " & Collection.Count
'Renvoi dans la feuille de la liste des adresses
For K = 1 To Collection.Count
'Debug.Print Collection(K)
Cells(K, 10) = Collection(K)
Next
End If
Set C = Nothing
End With
Else 'le mot n'existe pas
MsgBox "le mot ''" & Findthis & "'' n'existe pas.", vbExclamation, "Search Result"
End If
Set Plage = Nothing
End Sub
 

david84

XLDnaute Barbatruc
Re : Résultat FindNext différent entre Function et Sub ???

Bonjour Jean-Noël,
je ne vois pas trop (les fonctions, j'ai du mal:confused:) mais pourtant quand tu es dans VBA Project et que tu la lances avec le bouton Exécute Sub (F5), le test MsgBox te donne bien les 3 adresses...
A+
 

YANN-56

XLDnaute Barbatruc
Re : Résultat FindNext différent entre Function et Sub ???

Bonsoir Jean-Noël, aux participants, et à ceux qui passeront par là,

Les "Plages", "offset", et des "Set my Range" ne sont pas dans mon répertoire.

J'ai survolé ta question, mais faute de tout comprendre, j'imagine une hypothèse:

On a une liste de produits:

En colonne "A" on a leur appellation.

En colonne "B" on a la gamme à laquelle ils appartiennent.

En colonne "C" on a la période de mise sur le marché

En colonne "D" on a les points de vente

Je cherche donc à savoirje vais expédier mes produits, quand, et de quelle gamme,
et d'en dresser la liste pour rédiger un bordereau d'envoi.

Je fais donc un "Find" sur le produit, ou les points de vente, .... enfin où je veux,
et par la suite, VBA fera le boulot pour moi, en peu de lignes.

Je suis peut-être à coté de ta recherche, mais j'avais envie de te proposer cette optique.

Amicalement,

Yann
 
Dernière édition:

Paritec

XLDnaute Barbatruc
Re : Résultat FindNext différent entre Function et Sub ???

Bonsoir Yann:) Jean Noël:) le forum
Yann je crois que tu t'éloignes de la question initiale de JN, il demande pourquoi findnext dans une sub marche bien alors que findnext dans une fonction ne marche plus en utilisant les mêmes termes pour la recherche, moi je n'ai pas la réponse et je dois dire que peut-être une syntaxe différente réglerait le problème mais laquelle??
a+
papou:)
 

JNP

XLDnaute Barbatruc
Re : Résultat FindNext différent entre Function et Sub ???

Re :),
Déslolé pour le long silence mais j'étais absent ce dimanche :eek:...
bonjour voici du code qui fonctionne; à l'époque j'ai cherché longtemps avant de trouver
Certes, il fonctionne chez moi aussi. En ce qui concerne mon code, lui aussi fonctionne :p...
Ce qui me pose problème, c'est dès que je passe en fonction de feuille, et j'avoue que je n'ai pas passé le tiens en fonction de feuille, il faudrait que je l'analyse totalement :eek:... Si tu peux essayer de le passer en fonction, il faudrait voir s'il fonctionne toujours :rolleyes:...

je ne vois pas trop (les fonctions, j'ai du mal:confused:) mais pourtant quand tu es dans VBA Project et que tu la lances avec le bouton Exécute Sub (F5), le test MsgBox te donne bien les 3 adresses...
Oui, c'est bien ce que je ne comprends pas vu que la Function fonctionne via la Sub, mais pas via la feuille :confused:...

J'ai survolé ta question, mais faute de tout comprendre, j'imagine une hypothèse:
On a une liste de produits:
En colonne "A" on a leur appellation.
En colonne "B" on a la gamme à laquelle ils appartiennent.
En colonne "C" on a la période de mise sur le marché
En colonne "D" on a les points de vente
Je cherche donc à savoirje vais expédier mes produits, quand, et de quelle gamme,
et d'en dresser la liste pour rédiger un bordereau d'envoi.
Je fais donc un "Find" sur le produit, ou les points de vente, .... enfin où je veux,
et par la suite, VBA fera le boulot pour moi, en peu de lignes.
Le raisonnement est bon, avec David84, on avais travaillé carrément des chargement de combobox avec cela, mais... c'est au niveau fonction de feuille que ça coince :mad:...

il demande pourquoi findnext dans une sub marche bien alors que findnext dans une fonction ne marche plus en utilisant les mêmes termes pour la recherche, moi je n'ai pas la réponse et je dois dire que peut-être une syntaxe différente réglerait le problème mais laquelle??
Oui Pascal, là est bien mon interrogation, mais j'ai aussi essayé différentes syntaxes, comme prendre la plage en String et utiliser Range(Plage) à la place, mais rien n'y fait :confused:...

Bref, j'ai l'impression que c'est un mystère (j'en ai vu passer d'autres ces derniers temps, comme un fonction qui ne fonctionnait que si elle était appelée depuis une autre fonction :confused:...), mais si quelqu'un pouvait trouver le moyen de passer outre :rolleyes:...
Bonne soirée :cool:
 

julberto

XLDnaute Occasionnel
Re : Résultat FindNext différent entre Function et Sub ???

Bonjour le fil, JNP,

Si je puis me permettre d'intervenir.
Dans la ligne "Loop While Not Cellule Is Nothing And Cellule.Address <> Première" il y a un os d'importance. Et c'est là que ça plante.

Quand la valeur de Cellule vaut Nothing (=pas d'autre occurrence trouvée par la fonction Find) l'expression "Cellule.Address" est dans le même temps calculée et par conséquent conduit au plantage.
Donc j'ai le même avis que Paritec --> construire une synthaxe différente pour cette ligne (=> "Cellule.Address ne doit être évaluée que si Cellule est différente de Nothing).

cordialement
 

JNP

XLDnaute Barbatruc
Re : Résultat FindNext différent entre Function et Sub ???

Re :),
Si je puis me permettre d'intervenir.
Dans la ligne "Loop While Not Cellule Is Nothing And Cellule.Address <> Première" il y a un os d'importance. Et c'est là que ça plante.
Bien sûr que tu peux :p...
Mais j'avais déjà fait cette analyse. Le seul problème est que la structure FindNext devrait trouver la cellule suivante, or, dans la Sub, c'est bien ce qu'elle fait, dans la Fonction de feuille, elle ne trouve que la première valeur :confused:...
C'est ce problème que j'essaie de comprendre :rolleyes:...
Bonne soirée :cool:
 

julberto

XLDnaute Occasionnel
Re : Résultat FindNext différent entre Function et Sub ???

Re bonjour JNP,

J'avais effectivement lu ton sujet trop vite. Tu avais déjà envisagé le problème que je soulevais.
Milles excuses.
Donc la question était autre.

J'ai relevé que toute fonction perso introduite dans un module de feuille n'est pas reconnue en tant que telle.
Cela saute aux yeux quand on tape la formule dans la barre de formule d'Excel.

J'ai fait une petite recherche et trouvé ceci qui explique tout :
3) Les fonctions personnalisées :

Il est impossible d'appeler dans une formule sous Excel une fonction
perso définie dans un module de feuille ou le module 'ThisWorkbook'. Il
faut les définir uniquement dans des modules standard.
Laurent Longre

https://groups.google.com/group/mic...n+perso+dans+code+de+feuille#4d2aa6f29d698907

Bien cordialement
 

JNP

XLDnaute Barbatruc
Re : Résultat FindNext différent entre Function et Sub ???

Re :),
J'ai relevé que toute fonction perso introduite dans un module de feuille n'est pas reconnue en tant que telle.
Cela saute aux yeux quand on tape la formule dans la barre de formule d'Excel.
Si tu testes mon fichier, tu verras que mon code est bien dans un module standard :rolleyes:.
D'ailleurs, la fonction RechercheSimple fonctionne bien en formule de feuille, c'est la deuxième qui coince :eek:...
Bonne journée :cool:
 

Discussions similaires

Statistiques des forums

Discussions
312 849
Messages
2 092 797
Membres
105 534
dernier inscrit
EmilieG60