VBA : fonction Find

Excel-lent

XLDnaute Barbatruc
Bonjour à tous,

J'ai une BD (base de donnée) où est listé tous mes fournisseurs connu (tableau A3:C10), avec les renseignements correspondant.

Je récupére d'un autre côté la liste des fournisseurs d'un autre logiciel (colonne E => E4 à E16).

Je veux m'assurer que tous les fournisseurs récupérés sur l'autre logiciel figure bien dans ma base de donnée!

Je pensais utiliser une boucle basique :

Code:
For ligneBD = 4 To [A4].End(xlToDown).Row

Next ligneBD

Ou une boucle plus adapté :
Code:
For Each Plage In Range(Range("A4:A" & [A4].End(xlToDown).row))
...
Next

Mais en faisant des recherches, j'ai appris que ces deux boucles avait un temp d'éxécution assez long (et comme j'ai beaucoup de données à analyser...). Il semblerait que l'utilisation de la fonction Find soit mieux adapté à mon cas et surtout plus rapide!

Mais voila, après lecture de la notice Excel, plusieurs recherche sur le net, plusieurs tentatives, je n'arrive pas à l'utiliser!

Voici ci-joint un petit exemple commenté, ainsi qu'un début de macro.

Si quelqu'un pouvait m'aider me rajouter les 2 lignes de code qu'il me manque, il m'enlèverais une belle épine du pied.

A moins qu'il ait une autre approche tout aussi efficace (voir plus)?

Merci d'avance pour votre aide.

Cordialement
 

Pièces jointes

  • Vérification d'une liste.xls
    23 KB · Affichages: 307

MJ13

XLDnaute Barbatruc
Re : VBA : fonction Find

RE à tous.

La seule conclusion que je pourrais en tirer, c’est qu’il me faut être prudent dans mes conclusions.
Affirmer quelque chose tant qu’on n’a pas trouvé de contre-exemple est une pratique que je ne pratique pas ou, tout du moins, je n'accepte pas d'énoncer qu'elle est toujours vraie.

MJ13,
le but premier de mon intervention était de souligner que le contexte est primordial pour effectuer ses choix (pour autant qu’on en dispose).

Lii: C'était un peu mon propos,non;).




Skoobi: Ah "countif", cela doit être pareil que NB.SI, j'ai l'impression;).

Non je pensais comme ceci (voir pièce jointe), enfin c'est ce que je ferai puisque je ne connais pas à fond les tableaux en VBA.

Mais il est vrai qu'on a eu peu de discussions avec un tel niveau. Bravo à tous:eek:.

Bon Week-end :).
 

Pièces jointes

  • Verification_dune_liste_MJ.zip
    14.4 KB · Affichages: 59

ROGER2327

XLDnaute Barbatruc
Re : VBA : fonction Find

Bonsoir à tous
J'ai un peu perdu le fil de la discussion (Vivement la retraite !) mais je livre mon classeur d'étude : il ne sera pas difficile d'y ajouter les dernières trouvailles.
Pour l'instant, la meilleure que j'ai pu tester (sur des listes allant jusqu'à 50000 lignes pour chacune d'elles) dérive de la proposition de bhbh. Ça donne ceci :
Code:
[COLOR="DarkSlateGray"]Sub je_peux_jouer_2() 'bhbh modifié : LA MEILLEURE !
Dim MesFrn As Object
Dim Cel As Range
   Set MesFrn = CreateObject("Scripting.Dictionary")
   For Each Cel In Range(Cells(4, 1), Cells(Rows.Count, 1).End(xlUp))
      MesFrn.Item(Cel.Value) = Cel.Value
   Next Cel
   Columns(3).Interior.ColorIndex = xlNone
   Application.ScreenUpdating = False
   For Each Cel In Range(Cells(4, 3), Cells(Rows.Count, 3).End(xlUp))
      If Not MesFrn.Exists(Cel.Value) Then Cells(Cel.Row, 3).Interior.ColorIndex = 6
   Next Cel
   Application.ScreenUpdating = True
End Sub[/COLOR]
Impressionnant sur les listes longues (30000 / 60000 lignes).
Pas le temps de rentrer dans les détails, mais je reviendrai dès que possible voir ce qui se passe ici. C'est trop bien comme dit mon petit-fils.​
Bonne nuit.
ROGER2327
#2010
 

Pièces jointes

  • ETUDE_v3.zip
    15.7 KB · Affichages: 53
Dernière édition:

Fo_rum

XLDnaute Accro
Re : VBA : fonction Find

Salut,

en partant du fichier de Lii, présentation d'une nouvelle façon de procéder.
J'ai essayé de résoudre le problème posé le plus rapidement possible sans toutefois multiplier les contextes.
Si tu le juges utile, Roger, tu peux le tester avec ta dernière super-production en cinéma-scoop (je n'en ai pas eu le courage de le faire à cette heure ci).

A noter que le plus long est l'initialisation de la liste des 60000 noms ici.
C'est peut-être l'objet d'une prochaine recherche !
 

Pièces jointes

  • Suite et MFC.zip
    11.3 KB · Affichages: 45

skoobi

XLDnaute Barbatruc
Re : VBA : fonction Find

Bonjour tout le monde,

Bien vu Fo_rum les MFC, fallait y penser, bravo!

Sur mon PC, mon code suivant le fait en 1.54s. 0.96s le tient.

Code:
Sub Dico_Union30() 'Skoobi
Dim dFrnrs As Object
Dim Plage As Range
Dim tFrnrs() As Variant, tFrnrs2() As Variant, n As Long
Application.ScreenUpdating = False
col = 3
t = Timer
Set dFrnrs = CreateObject("Scripting.Dictionary")
Set Plage = [C1]
Range("C4:C" & [C65536].End(xlUp).Row).Interior.ColorIndex = xlNone
tFrnrs = Range("A4:A" & [A65536].End(xlUp).Row)
tFrnrs2 = Range("C4:C" & [C65536].End(xlUp).Row)
For n = LBound(tFrnrs, 1) To UBound(tFrnrs, 1)
  dFrnrs.Item(tFrnrs(n, 1)) = tFrnrs(n, 1)
Next
For n = LBound(tFrnrs2, 1) To UBound(tFrnrs2, 1)
  If Not dFrnrs.Exists(tFrnrs2(n, 1)) Then
    Set Plage = Union(Plage, Cells(n + 3, col))
    If Plage.Count = 30 Then
      Plage.Interior.ColorIndex = 6
      Set Plage = [C1]
    End If
  End If
Next n
'pour traiter les éventuelles cellules à la fin de la liste
If Not Plage Is Nothing Then Plage.Interior.ColorIndex = 6
[C1].Interior.ColorIndex = xlNone
Application.ScreenUpdating = True
Debug.Print Timer - t
End Sub
Comme quoi, il peut y avoir plein de façon de faire.
Bien sûr, cela ne veut pas dire que ces 2 codes (avec celui de fo_rum), vont marcher à tout les coups! Comme l'a bien dit Lii, il faut prendre en compte le contexte.

Edit: Il manque 1 place sur le podium, si ça intéresse quelqu'un ;)
Edit2: petit rectification dans le code, le 2eme dico ne sert à rien, c'est mon coté perfectionniste:D
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : VBA : fonction Find

Bonjour à tous
Version corrigée et augmentée d'un classeur de test.
J'y ai ajouté la version MFC adaptée de la communication de Fo_rum. Les résultats sont assez spectaculaires, mais ça se paye en encombrement ! (Plage nommée, mise en forme conditionnelle : la feuille est assez modifiée par le traitement).
On peut voir aussi que le contenu de la liste "C" a beaucoup d'influence sur la vitesse d'exécution de certaines procédures.​
ROGER2327
#2012
 

Pièces jointes

  • ETUDE_v4.zip
    19.2 KB · Affichages: 49

Staple1600

XLDnaute Barbatruc
Re : VBA : fonction Find

Bonsoir à tous


Personne pour utiliser un Scripting.Dictonnary :confused:;)

https://www.excel-downloads.com/threads/recherche-doublons.125859/

Bizarre

EDIT: c'est malin , skoobi, au moment ou je postai , tu sors ton Dictionnaire !

Excusez-moi je m'étais arrêté à la page 1

REDEDITION: le premier à sortir son Dico fut : bhbh (mes excuses ) (je rends donc à César )

J'en profite pour vous saluer piteusement tous les deux, ainsi que les autres grands pontes vbaistes du forum présents dans ce fil (pourtant mes lunettes sont propres)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : VBA : fonction Find

Re


Désolé je n'avais pas lu l'autre page (voir mon édition du précédent message)


Je suis confus, mais au moins, je vous ai rejoins en pensée.

Est-ce qu'un application.Calculation=xlCalculationManual

vous ferait gagner quelque temps ?
 
Dernière édition:

skoobi

XLDnaute Barbatruc
Re : VBA : fonction Find

Re,

Bonjour à tous
Version corrigée et augmentée d'un classeur de test.
J'y ai ajouté la version MFC adaptée de la communication de Fo_rum. Les résultats sont assez spectaculaires, mais ça se paye en encombrement ! (Plage nommée, mise en forme conditionnelle : la feuille est assez modifiée par le traitement).
On peut voir aussi que le contenu de la liste "C" a beaucoup d'influence sur la vitesse d'exécution de certaines procédures.​
ROGER2327
#2012

Très intéressante ta démarche Roger!
J'y ai ajouter la mienne "DicoUnion30" et je confirme que la liste "C" a une énorme influence... mais pas sur forum2a et forum2b. Logique puisque à chaque fois le format conditionnelle est appliqué à toutes les lignes.
Mon code démontre la rapidité de "Dictionnary" car en effet, quand il y a peut de données à mettre en jaune, mon code mais moins de 2s...
 

Pièces jointes

  • ETUDE_v4 tableau find dictionnary collection.zip
    29.7 KB · Affichages: 52
Dernière édition:

Fo_rum

XLDnaute Accro
Re : VBA : fonction Find

Salut

Faire un grand prix de F1 avec une F11 (surtout sans Alt ), est-ce raisonnable ?
On a les moyens ou pas ?
Et encore, je n’étais qu’aux essais !;)

J’étais si surpris de mes résultats que je n’ai pas essayé d’améliorer la programmation, aussi, je te remercie Roger d’avoir pris le relais.
« So much Select » but not « So fine » et pas efficace, sur le coup Fo_rum !

Stapple, sous entends-tu que le PC aurait une quelconque influence ?
 

Staple1600

XLDnaute Barbatruc
Re : VBA : fonction Find

Bonjour Fo_rum


J'essayes de comprendre pourquoi skoobi arrive à moins de 2 secondes.

(Par le passé , j'ai pu m'apercevoir que selon le PC utilisé , une macro donnée s'exécute plus ou moins rapidement)

Je suppose donc que tu sous-entends toi que le PC n'a rien à voir dans la rapidité d'exécution du code ?

EDITION: Désoloé, je suis fatigué aujourd'hui , je n'avais pas vu le mode d'emploi

Maintenant : c'est ok

Temps de DicoUnion30: 1,71875

(Les 10 secondes c'étaient pour l'ensemble des tests )
 
Dernière édition:

Fo_rum

XLDnaute Accro
Re : VBA : fonction Find

Re ponse

puiqu'elle est écrite, je te l'envoie :
Code:
  Que ce soit le PC, le PS, l’UMP voir le Modem qui soient en cause,
  je ne saurais le dire mais je n’en pense pas moins !
  Je n’ai pas une configuration des plus rapides, pourtant j’ai le même genre de résultats que skoobi .
  J’en profite pour insister sur la remarque de Lii : « le contexte, le contexte et le contexte » .
 

Discussions similaires

Réponses
7
Affichages
347

Statistiques des forums

Discussions
312 198
Messages
2 086 134
Membres
103 129
dernier inscrit
Atruc81500