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

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

  • Essai.xlsm
    23.8 KB · Affichages: 16

Marcham

XLDnaute Junior
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
 
C

Compte Supprimé 979

Guest
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 ;)
 

job75

XLDnaute Barbatruc
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+
 

job75

XLDnaute Barbatruc
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+
 

Marcham

XLDnaute Junior
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
 

Marcham

XLDnaute Junior
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.
 

job75

XLDnaute Barbatruc
J'ai quand même envoyé 2 messages :mad:

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

  • Essai.xlsm
    24.8 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
bonjour @job75 ce n'est pas ce que j'ai dit
je répète
sur une plage de 13 ligne sur une colonne on ne verra pas la diférence
par contre sur une plage de 100 000 ligne on verra bien la puissance de match par rapport a une simple boucle
fichier demo
clique sur crer une base avant de tester
 

Pièces jointes

  • demo pour job75.xlsm
    20.4 KB · Affichages: 1

Statistiques des forums

Discussions
315 087
Messages
2 116 084
Membres
112 656
dernier inscrit
VNVT