XL 2019 VBA 2 façons de formater une plage pour FIND (l'une marche, pas l'autre) pourquoi ?

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Marcham

XLDnaute Junior
Bonjour
Toujours aussi débutant depuis 10 ans, il y a ce truc que je ne comprends pas. (voir les commentaires dans le fichier joint)
Quelle différence y a t-il entre un format texte avec @ et avec CStr ?
Si une âme gentil pouvait m'expliquer, ce serait noël avant l'heure.
Merci d'avance Marc
 

Pièces jointes

D'accord, je comprends, mais alors comment pourrais-je faire pour le bouton 2 fonctionne ?
N'y a t-il pas un moyen pour que la méthode FIND fonctionne avec de la monnaie sans passer par une boucle FOR ... NEXT mais en traitant l'ensemble de la plage de recherche pour quelle soit compatible avec le format du terme recherché. Peut-être en traitant ce terme autrement ?
Voir le fichier joint - Marc
 
Bonjour Marcham, TooFatBoy,
Avec Ça = CStr(Ça), la leur en B1 traitée est : "-34,95" , or en A1 c'st "-34.95"
Donc essayez ça, cela donne bien "-34.95" :
VB:
Ça = Replace(Ça, ",", ".")
 
Dernière édition:
Bonjour Marcham,

Une boucle For Next peut être traiter plus rapidement qu'un Find
VB:
Private Sub CommandButton2_Click()
  Dim Cel As Range
  Dim FlgTrouvé As Boolean
  Dim Ça As Double

  Ça = Range("B1")
  FlgTrouvé = False
   
  For Each Cel In ActiveSheet.Range("A1:A13")    'Attrape la plage
    If Cel.Value = Ça Then FlgTrouvé = True: Exit For
  Next Cel
  If FlgTrouvé Then MsgBox "Trouvé en ligne " & Cel.Row Else MsgBox "Pas trouvé " & Ça
End Sub

Edit salut Sylvanu 😉
 
Bonjour à tous,

Pour rechercher des nombres il vaut mieux utiliser Application.Match (EQUIV) :
VB:
Private Sub CommandButton2_Click()
Dim Ça
Dim lig As Variant

    Ça = Range("B1").Value2 'nombre décimal
    
    lig = Application.Match(Ça, Range("A1:A13"), 0)
    If IsNumeric(lig) Then MsgBox "Trouvé en ligne " & lig Else MsgBox "Pas trouvé " & Ça

End Sub
A+
 
Bonjour Patrick,
sur une plage aussi petite même si la fonction match(équivalente à EQUIV en excel) est facile d'utilisation
elle sera certainement plus lourde que la boucle
Même avec une boucle exécutée 5 fois la fonction Match est plus rapide, teste ces 2 macros :
VB:
Private Sub CommandButton1_Click() 'job75
Dim Ça
Dim lig As Variant
Dim t, i&
    Ça = Range("B1").Value2 'nombre décimal
   
    t = Timer
    For i = 1 To 1000000
        lig = Application.Match(Ça, Range("A1:A13"), 0)
    Next i
    MsgBox "Durée " & Format(Timer - t, "0.00") & " microsecondes"
   
    If IsNumeric(lig) Then MsgBox "Trouvé en ligne " & lig Else MsgBox "Pas trouvé " & Ça

End Sub

Private Sub CommandButton2_Click() 'BrunoM45
  Dim Cel As Range
  Dim FlgTrouvé As Boolean
  Dim Ça As Double
  Dim t, i&

  Ça = Range("B1")
  FlgTrouvé = False
 
  t = Timer
  For i = 1 To 1000000
    For Each Cel In ActiveSheet.Range("A1:A13")    'Attrape la plage
      If Cel.Value = Ça Then FlgTrouvé = True: Exit For
  Next Cel, i
  MsgBox "Durée " & Format(Timer - t, "0.00") & " microsecondes"
 
  If FlgTrouvé Then MsgBox "Trouvé en ligne " & Cel.Row Else MsgBox "Pas trouvé " & Ça
End Sub
Chez moi 13 microsecondes contre 22 microsecondes.

A+
 
Bonjour Marcham, TooFatBoy,
Avec Ça = CStr(Ça), la leur en B1 traitée est : "-34,95" , or en A1 c'st "-34.95"
Donc essayez ça, cela donne bien "-34.95" :
VB:
Ça = Replace(Ça, ",", ".")
Bonsoir Sylvanu
Je n'en reviens pas, ça marche.
Jamais je n'aurais pu trouver car comment j'aurais pu voir que A1 (et les données de la plage où il est "locataire") est écrit avec un point (.)
Même avec un espion, je n'ai jamais pu voir ce (et ces) point(s).
Connais-tu un site internet (en français ça serait top) qui explique ce truc.
En tout cas, tu m'épates d'abord et je te dis respect.
Marc
 
Bonjour Marcham,

Une boucle For Next peut être traiter plus rapidement qu'un Find
VB:
Private Sub CommandButton2_Click()
  Dim Cel As Range
  Dim FlgTrouvé As Boolean
  Dim Ça As Double

  Ça = Range("B1")
  FlgTrouvé = False
  
  For Each Cel In ActiveSheet.Range("A1:A13")    'Attrape la plage
    If Cel.Value = Ça Then FlgTrouvé = True: Exit For
  Next Cel
  If FlgTrouvé Then MsgBox "Trouvé en ligne " & Cel.Row Else MsgBox "Pas trouvé " & Ça
End Sub

Edit salut Sylvanu 😉
Bonsoir Bruno
Oui, je connaissais cette façon de travailler avec les nombres mais mon désir était de travailler avec FIND.
Et, c'est vrai je ne l'avais pas signalé, et que cela ne m’empêche pas de te remercier.
 
J'ai quand même envoyé 2 messages 😡

Puisque vous voulez FIND voici une autre solution avec les Formulas pour le 2ème bouton :
VB:
Private Sub CommandButton2_Click()
Dim LaDedans As Range
Dim TrouveÇa As Range
Dim Ça As String

     Ça = Range("B1").Formula
    
     Set LaDedans = Range("A1:A13") 'Attrape la plage
    
     Set TrouveÇa = LaDedans.Find(Ça, LookIn:=xlFormulas, LookAt:=1) 'Cherche le nombre
    
     If Not TrouveÇa Is Nothing Then MsgBox "Trouvé en ligne " & TrouveÇa.Row Else MsgBox "Pas trouvé " & Ça

End Sub
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour