XL 2013 Accélérer une macro dictionnary

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.
 

mmalzert

XLDnaute Occasionnel
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. :)
 

mmalzert

XLDnaute Occasionnel
Je viens de modifier la macro.
Par contre je ne sais pas si c'est le top comme code. J'aurais voulu aussi avoir la formule directement dans la macro plutot que de repartir de la formule en m2.
 

Pièces jointes

  • taux remplissage.xlsm
    614.5 KB · Affichages: 16
Dernière édition:

job75

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

mmalzert

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

  • taux remplissage.xlsm
    704.2 KB · Affichages: 22

Discussions similaires

Statistiques des forums

Discussions
312 195
Messages
2 086 078
Membres
103 112
dernier inscrit
cuq-laet