Lenteur sur sommeprod VBA

Bonjour,

j'ai le traitement suivant dans mon code

le problème est que plus "i" est grand plus longue est la macro (ce qui est normal)

quelqu'un a une idée d'optimisation !!

merci par avance

edouard002

Sub sommeprod()
'-------------------------------DECLARATION DES VARIABLES---------------------------------------------------------
Dim i As Long
Dim limit As Long
'--------------------------------------INITIALISATION DES VARIABLES----------------------------------------------
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Sheets("bdd").Select
limit= Columns.Find("limit", , xlValues, xlWhole).Column
For i = 3 To 50000
Cells(i, limit).Value = Evaluate("=SumProduct((($C$3:C" & i & ")=C" & i & ")*(($G$3:G" & i & ")=G" & i & ")*($D$3:D" & i & "))")
Next i
End Sub

Bonjour

Ton fichier serait utile afin de faire des tests

bonjour si joint un fichier exemple

13sommeprod.xlsm (20.48 Ko)

Bonjour

Avec ta méthode et jusqu'à 5000 j'obtiens 4,20 secondes

Pas mieux

Sans doute en passant par des tableaux, si quelqu'un veut le tenter

sachant que je peux atteindre plus de 50 000 lignes je vous laisse imaginer le temps

c'est long, très long !!

cdt

Bonjour,

une autre approche qui est 30 à 50 fois plus rapide sur tes 372 lignes, et dont le temps (en plus) ne devrait pas être exponentiel au nombre de lignes mais juste proportionnel :

Sub sommeprod2()
'-------------------------------DECLARATION DES VARIABLES---------------------------------------------------------
    Dim i As Long
    Dim limit As Long, nblig As Long
    Dim qte, famille, result() As Long, cle As Long, dict
    Set dict = CreateObject("Scripting.Dictionary")
    Dim t As Single
    t = Timer
    '--------------------------------------INITIALISATION DES VARIABLES----------------------------------------------
    Application.ScreenUpdating = False
'    Application.Calculation = xlCalculationManual
    Sheets("bdd").Select
    limit = Columns.Find("limit", , xlValues, xlWhole).Column
    nblig = Cells(Rows.Count, "C").End(xlUp).Row - 2
    qte = [C3].Resize(nblig, 2)
    famille = [G3].Resize(nblig, 2)
    ReDim result(1 To nblig)
    For i = 1 To UBound(qte)
        cle = famille(i, 1) * 1000 + qte(i, 1)
        dict(cle) = dict(cle) + qte(i, 2)
        result(i) = dict(cle)
    Next i
    [M3].Resize(nblig) = Application.Transpose(result)
    Debug.Print Timer - t & " s."
End Sub

Je met le résultat en M que tu puisses comparer les résultats.

Limité à 65536 lignes, sinon il faudra prévoir un découpage de la restitution par blocs.

Par curiosité tu donneras les temps comparés sur 50000 lignes ?

eric

30sommeprod.xlsm (28.81 Ko)

franchement le résultat est juste incroyable !!!!

merci

vitesse incroyable

par contre je modifie quoi si en colonne g "famille produit j'ai des lettres et plus des chiffres !!!

par contre je modifie quoi si en colonne g "famille produit j'ai des lettres et plus des chiffres !!!

cle = famille(i, 1) & "µ" & qte(i, 1)

eric

merci !!!

pour information j'ai remis en variable clé en string

merci encore

c

dt

edouard002

Bonjour,

Ah oui, j'avais oublié ça.

J'ai testé sur 50000 lignes : 0.2 s contre 21 min

N'oublie pas la limite des 65536 lignes...

eric

Rechercher des sujets similaires à "lenteur sommeprod vba"