XL 2013 Accélérer une macro dictionnary

  • Initiateur de la discussion Initiateur de la discussion mmalzert
  • Date de début Date de début

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 !

mmalzert

XLDnaute Occasionnel
Bonjour le forum,

Je viens de créer cette macro qui met 20 secondes à s’exécuter (environ 11000 lignes)

Code:
Sub Copie_NbVoyages()

Application.ScreenUpdating = False

Sheets("Data ligne").Select
tablo = Range("A2:M" & Range("A" & Rows.Count).End(xlUp).Row)

Set dico = CreateObject("Scripting.dictionary")

For n = LBound(tablo, 1) To UBound(tablo, 1)

   x = 1 / Application.CountIf(Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row), tablo(n, 1))
   
      tablo(n, 13) = x

Next

Range("A2").Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo

Application.ScreenUpdating = True

End Sub

Quand je teste la recopie de formule en double cliquant sur la 1ère celulle cela met 10 secondes.
Comment puis-je améliorer ce code ?
Si besoin je peux transmettre un fichier.

Merci pour votre aide.
 
Bonjour job75,

Non je ne me rends pas bien compte et c'est pour cette raison que je pose la question.

Dans un 1er temps j'avais fais avec selection.autofill qui était plus rapide. Mais je me suis dit que ça serait plus propre avec un dico. (J'ai adapté de ce fil https://www.excel-downloads.com/threads/vba-concatener-selon-criteres.20019124/)
A priori j'ai tort mais pourquoi ?

Pour info je débute tout juste avec les macros. Un peu d'indulgence svp. 🙂
 
Re, bonjour Nicole,

Avec ceci le Dictionary sert à quelque chose :
Code:
Sub Copie_NbVoyages()
Dim tablo, dico As Object, n&
tablo = Range("A2:M" & Range("A" & Rows.Count).End(xlUp).Row)
Set dico = CreateObject("Scripting.dictionary")
For n = 1 To UBound(tablo)
  dico(tablo(n, 1)) = dico(tablo(n, 1)) + 1 'comptage
Next
For n = 1 To UBound(tablo)
  tablo(n, 13) = 1 / dico(tablo(n, 1))
Next
[M2].Resize(UBound(tablo)) = Application.Index(tablo, , 13)
Range("M" & UBound(tablo) + 2 & ":M" & Rows.Count) = "" 'RAZ en dessous
End Sub
Cela dit je ne comprends pas trop pourquoi utiliser l'inverse (1/) du nombre d'occurences...

A+
 
Re, bonjour Nicole

Et la rapidité est là. Merci.
Je vais regarder la différence avec ce que j'avais fait pour comprendre.

A quoi sert la fin du code ?
Code:
[M2].Resize(UBound(tablo)) = Application.Index(tablo, , 13)
Range("M" & UBound(tablo) + 2 & ":M" & Rows.Count) = "" 'RAZ en dessous

Je fais "1/" car je retraite derrière dans un TCD. Si je ne le fais pas le tcd n'est pas capable de me donner le nombre de voyages distincts. Il ne sait que récupérer les occurences. Ou alors passer par les jeux de tcd mais je ne maitrise pas.
 

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

Discussions similaires

Réponses
5
Affichages
482
Réponses
7
Affichages
168
Réponses
33
Affichages
3 K
Réponses
3
Affichages
672
Réponses
4
Affichages
553
Retour