Find ne trouve pas ma variable Double

jim7963

XLDnaute Junior
Bonjour à tous,

j'ai un petit soucis avec une fonction de recherche de valeur dans une plage.
Cette fonction doit me renvoyer True si elle trouve ma valeur recherchée dans une plage définie et False si elle ne la trouve pas.

Code:
Public Function controleMontant(montantDon As Double) As Boolean

controleMontant = False

With Sheets(2)
    i = .Columns(3).Find("*", , , , xlByRows, xlPrevious).Row
    Set Rg = .Range(Cells(4, 3), Cells(i, 3)).Find(montantDon, LookIn:=xlValues, lookat:=xlWhole)
    If Not Rg Is Nothing Then controleMontant = True
    Set Rg = Nothing
End With

End Function

Quand je teste cette fonction avec le code suivant:
Code:
Sub test()

MsgBox controleMontant(CDbl(Sheets(2).Cells(5, 3).Value))

End Sub

la fonction me retourne systématiquement un False alors que je me sers bien d'une valeur de la plage pour effectuer ma recherche.

Cette fonction marche quand je recherche un String, elle me retourne bien un True, par contre avec un Double elle ne fonctionne pas.
Malgré les recherches que j'ai faites je n'arrive pas à trouver l'explication à ce problème.
Comme je compte utiliser cette fonction dans un code où il faut rechercher un double, j'ai vraiment besoin de la faire fonctionner.
Si quelqu'un pouvait m'éclairer je lui en serai très reconnaissant.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans ce cas là, je testerais le contenu du paramètre montantDon, (debug.print ou affichage des variables locales) il arrive parfois que les doubles se retrouvent modifier à n chiffres après la virgule par les calculs ou conversions qu'ils ont subits et que les formats (ex:currency) n'affichent pas. Et j'enlèverai le lookat:=xlWhole pour voir s'il n'intervient pas dans le problème.

Bonne recherche
 

Paf

XLDnaute Barbatruc
Bonjour,

chez moi, la fonction "fonctionne" selon le contenu de la cellule C5

si 144 format standard : retour True
si 144 format nombre( 144,00) : retour False
si 144 format texte : retour True
si 144,45 format standard : retour True
si 144,45 format nombre : retour True
si 144,45 format texte : retour True

A+
 

jim7963

XLDnaute Junior
Bonjour et merci pour vos réponses.

- Roblochon, pour le lookat:=xlWhole j'ai essayé avec et sans de même qu'avec le LookIn:=xlValues, j'ai tenté toutes les combinaisons possibles cela n'a rien changé.
Comme dans ma macro test je lance la recherche d'une somme qui se trouve déjà dans ma plage, logiquement il devrait la trouver et la fonction devrait me renvoyer un True.

- Paf, je ne comprends pas pourquoi cela fonctionne chez toi car de mon côté même quand je change le format de la cellule le résultat reste le même.

Le seul moment où cela fonctionne c'est quand le format de la cellule est en standard ou en texte et que mon "montantDon" est déclaré en String.
Mais dans ce cas là je perd le bénéfice de l'affichage avec le séparateur de milliers.

Quand j'essai de le déclarer dans un autre format quel qu'il soit (single, double, currency...) là ça ne fonctionne plus même quand je mets le format de cellule qui est sensé correspondre. Le find ne trouve pas la valeur. :mad:
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Voici : Lookin:= xlFormulas ' J'aurais du y penser plus tôt:)
et petit changement sur le test( juste une facilité) :
VB:
Public Function controleMontant(ByVal montantDon As Double) As Boolean

MsgBox "L'argument de ma fonction est: " & montantDon
controleMontant = False

With Sheets("Détail don alimentaire")
    i = .Columns(3).Find("*", , , , xlByRows, xlPrevious).Row
    Set Rg = .Range(.Cells(4, 3), .Cells(i, 3)).Find(montantDon, LookIn:=xlFormulas, lookat:=xlWhole)
    controleMontant = Not Rg Is Nothing
    Set Rg = Nothing
End With

End Function

A bientôt
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

En complément de ma réponse du post#7 une autre fonction qui fera peut-être l'affaire et utilise Application.Match (Equivalent VBA de la fonction Equiv):

VB:
Public Function controleMontant_2(ByVal montantDon As Double) As Boolean
    With Sheets("Détail don alimentaire")
        controleMontant_2 = Not IsError(Application.Match(montantDon, .Cells(4, 3).CurrentRegion.Columns(3), 0))
    End With
End Function

Cordialement
 

Discussions similaires

Réponses
1
Affichages
119
Réponses
0
Affichages
83

Statistiques des forums

Discussions
311 711
Messages
2 081 789
Membres
101 817
dernier inscrit
carvajal