Méthode Find avec condition

Méthode Find avec condition - VB/VBA/VBS - Programmation

Marsh Posté le 11-07-2011 à 13:52:18    

:hello:  
Salut à tous !
Je découvre la méthode Find sous VBA qui est nettement plus rapide pour trouver une valeur dans une plage donnée... comparé avec une boucle Do... Loop.
Super génial !
 
Néanmoins, je voudrais utiliser cette méthode avec une condition...
Genre :  
   With Workbooks("TEST.xlsx" ).Sheets("TEST" ).Range(PLAGE)
      Set c = .Find(X > 599999 ; Lookln:xlValues)
      c.Select
   End With
 
Je traduis : je cherche dans la PLAGE la première valeur supérieure à 599999.
Et je ne vois pas comment y arriver...  :(  
 
De plus, est-il possible de chercher de bas en haut ???
 
;)


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 11-07-2011 à 13:52:18   

Reply

Marsh Posté le 11-07-2011 à 21:50:42    

UP  :hello:


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 11-07-2011 à 22:12:49    

Pour être plus précis, j'ai un tableau avec beaucoup beaucoup de lignes (plus de 100 000) et utiliser le Do... Loop pour trouver la première ligne avec une valeur supérieure à 512999 est assez long... même en désactivant l'Application.ScreenUpDating.
Aussi, je me demandais si la fonction Find pouvait m'aider à faire cela...
J'utilise très bien cette fonction pour trouver la première valeur exacte... genre TOTO ou 401100... même trouver une valeur supérieure à une autre, je ne vois pas comment faire...
 
 :??:


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 11-07-2011 à 22:52:26    

J'ai aussi voulu utiliser cette fonction aujourd'hui, mais impossible de la faire marcher pour mon cas alors que d'autres tests marchaient bien.
 
En plus je faisais juste un simple
Range("Z:Z" ).Find("USD" ).Select
 
Donc si vous pouvez m'expliquer pourquoi ca serait chouette.
(mon 1er "USD" arrivait vers la ligne 700 et la commande me retournait une autre case n'ayant rien à voir. Sur une autre colonne avec des nombres, ca marchait bien  :heink: )

Reply

Marsh Posté le 12-07-2011 à 07:03:26    


 
Essaie ça :
 

Code :
  1. T = "USD"
  2. With ActiveWorkbook.Sheets(1).Columns("Z:Z" )
  3.     Set c = .Find(T, LookIn:=xlValues)
  4.     c.Select
  5. End With


 
 :)  


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 12-07-2011 à 16:01:26    

Merci, ca marche nickel,
 
Maintenant j'ai une autre question:
Disons que j'ai selectionne toutes les cellules avec la valeur "USD" dans ma colonne Z.
Dans une colonne a cote (AA par exemple), j'ai une autre colonne contenant des 0 et des 1.
J'aimerais ne garder selectionees que les cellules dont la valeur correspondante dans la colonne AA est 1.
 
En d'autre termes, je veux selectionner les cellules "USD" dans la colonne Z auxquelles correspondent la valeur "1" dans la colonne AA.
 
(pour selectionner les cellules USD, je triais par valeur, trouvais la 1ere et selectionner les x suivantes ou x est le nombre de cellules contenant "USD". Je sais pas si c'est la meilleure methode.
Pour faire ma selection sur 2 criteres, j'ai commence a coder une routine qui filtre le 1er critere, copie les donnes dans une feuille temp, puis refiltre. Cest un peu long et complique, je me suis dit qu il doit y avoir plus simple)
 
Merci

Reply

Marsh Posté le 17-07-2011 à 13:10:02    

Bonjour scaryfan,
 
J'espère que cette solution te conviendra.
Renommer une feuille en "MaFeuille".
En cellule A1:= Saisir la valeur que l'on cherche.
En cellule A2:= Saisir la condition pour effectuer la recherche (Dans ton cas 5999999).
Dans la colonne B:= Mettre la plage de valeur (exemple 1 à 7000000).
Dans la colonne C:= Le texte "Trouvée" est saisi à chaque itération positive.
 
Puis pour lancer la procédure il faut cliquer droit avec la souris.
 
Voici le code:
 

Code :
  1. Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  2. '******************'
  3. '* Initialisation *'
  4. '******************'
  5. 'Désactivation du menu contextuel'
  6. Cancel = True
  7. 'Efface le contenu de la colonne C'
  8. Columns("C:C" ).ClearContents
  9. '*****************************'
  10. '* Déclaration des variables *'
  11. '*****************************'
  12. 'Variable de la valeur recherchée'
  13. Dim X As Range
  14. 'Variable de la valeur de la condition'
  15. Dim Y As Range
  16. 'Variable de la valeur de la dernière ligne non vide de la zone de recherche'
  17. Dim Fin As Long
  18. 'Variable de la valeur reçue à l'issue de la méthode .Find'
  19. Dim MySearch As Variant
  20. 'Variable d'incrémentation de la valeur reçue'
  21. Dim I as Long
  22. '***************************'
  23. '* Attribution des valeurs *'
  24. '***************************'
  25. 'Valeur recherchée'
  26. Set X = Range("A1" )
  27. 'Valeur de la condition'
  28. Set Y = Range("A2" )
  29. 'Valeur de la dernière ligne non vide de la zone de recherche'
  30. Fin = Worksheets("MaFeuille" ).UsedRange.Rows.Count
  31. '*************'
  32. '* Procédure *'
  33. '*************'
  34. With Worksheets("MaFeuille" ).Range("B1:B" & Fin)
  35.     If X > Y Then
  36.         Set MySearch = .Find(X, LookIn:=xlValues, SearchDirection:= xlPrevious)
  37.         If Not MySearch Is Nothing Then
  38.             firstAddress = MySearch.Address
  39.             Do
  40.                 I = I + 1
  41.                 MySearch.Offset(0, 1) = I & " - Trouvée"
  42.                 Application.Wait (Now + TimeValue("0:00:1" )) 'Sert uniquement à voir la recherche'
  43.                 Set MySearch = .FindPrevious(MySearch)
  44.             Loop While Not MySearch Is Nothing And MySearch.Address <> firstAddress
  45.         End If
  46.     Else
  47.         MsgBox "La recherche est inférieure à la condition: " & X & " < " & Y
  48.     End If
  49. End With
  50. End Sub

 
 
Il est toujours bon de bien détailler son code car ça favorise la lecture et la compréhension.
 
@ bientôt

Message cité 1 fois
Message édité par mmarle le 18-07-2011 à 10:53:25
Reply

Marsh Posté le 24-07-2011 à 21:53:13    

mmarle a écrit :

Bonjour scaryfan,
 
J'espère que cette solution te conviendra.
Renommer une feuille en "MaFeuille".
En cellule A1:= Saisir la valeur que l'on cherche.
En cellule A2:= Saisir la condition pour effectuer la recherche (Dans ton cas 5999999).
Dans la colonne B:= Mettre la plage de valeur (exemple 1 à 7000000).
Dans la colonne C:= Le texte "Trouvée" est saisi à chaque itération positive.
 
Puis pour lancer la procédure il faut cliquer droit avec la souris.
 
Voici le code:
 

Code :
  1. Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  2. '******************'
  3. '* Initialisation *'
  4. '******************'
  5. 'Désactivation du menu contextuel'
  6. Cancel = True
  7. 'Efface le contenu de la colonne C'
  8. Columns("C:C" ).ClearContents
  9. '*****************************'
  10. '* Déclaration des variables *'
  11. '*****************************'
  12. 'Variable de la valeur recherchée'
  13. Dim X As Range
  14. 'Variable de la valeur de la condition'
  15. Dim Y As Range
  16. 'Variable de la valeur de la dernière ligne non vide de la zone de recherche'
  17. Dim Fin As Long
  18. 'Variable de la valeur reçue à l'issue de la méthode .Find'
  19. Dim MySearch As Variant
  20. 'Variable d'incrémentation de la valeur reçue'
  21. Dim I as Long
  22. '***************************'
  23. '* Attribution des valeurs *'
  24. '***************************'
  25. 'Valeur recherchée'
  26. Set X = Range("A1" )
  27. 'Valeur de la condition'
  28. Set Y = Range("A2" )
  29. 'Valeur de la dernière ligne non vide de la zone de recherche'
  30. Fin = Worksheets("MaFeuille" ).UsedRange.Rows.Count
  31. '*************'
  32. '* Procédure *'
  33. '*************'
  34. With Worksheets("MaFeuille" ).Range("B1:B" & Fin)
  35.     If X > Y Then
  36.         Set MySearch = .Find(X, LookIn:=xlValues, SearchDirection:= xlPrevious)
  37.         If Not MySearch Is Nothing Then
  38.             firstAddress = MySearch.Address
  39.             Do
  40.                 I = I + 1
  41.                 MySearch.Offset(0, 1) = I & " - Trouvée"
  42.                 Application.Wait (Now + TimeValue("0:00:1" )) 'Sert uniquement à voir la recherche'
  43.                 Set MySearch = .FindPrevious(MySearch)
  44.             Loop While Not MySearch Is Nothing And MySearch.Address <> firstAddress
  45.         End If
  46.     Else
  47.         MsgBox "La recherche est inférieure à la condition: " & X & " < " & Y
  48.     End If
  49. End With
  50. End Sub

 
 
Il est toujours bon de bien détailler son code car ça favorise la lecture et la compréhension.
 
@ bientôt


 
Merci mmarie pour ton code... je vais voir cela demain.
 ;)  


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 28-07-2011 à 16:17:23    

Pour nofreelunch
 

Code :
  1. T = "USD"
  2. With ActiveWorkbook.Sheets(1).Columns("Z:Z" )
  3.    Set c = .Find(T, LookIn:=xlValues)
  4.    If c.Offset(0,1)=1 Then
  5.       c.Select
  6.    End If
  7. End With

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed