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 !
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)?
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).
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.
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 !
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😀
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.
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)
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.
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...
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 ?
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 » .
- 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