VBA et optimisation formule SOMME.SI.ENS

skyteam92

XLDnaute Nouveau
Bonjour.

J'ai un classeur avec deux feuilles importantes:
- MRP (qui est un import brut)
- Demande_MRP (qui est le résultat de ma macro traitant les données de la feuille MRP)

J'ai mis le classeur en ligne sur le lien suivant (car trop volumineux)
http://speedy.sh/F29Xe/MRP.xlsm.

L'import (Feuille MRP) contient:
- Colonne A: article
- Colonne E: Quantité que je veux sommer
- Colonne F: je prends le critère=2
- Colonne P: Concaténation Date Année_Semaine.

Dans la feuille Demande_MRP, je feux faire la somme par article et par Date (Année_Semaine).

J'ai crée un code VBA (voir variableMemoire, Routine 1) dans lequel j'utilise la fonction excel somme.si.ens


Code:
tablo(j, k) = Application.WorksheetFunction.SumIfs(fMrp.Columns(5), fMrp.Columns(1), tablo(j, 1), fMrp.Columns(16), tablo(1, k), fMrp.Columns(6), 2)

Mais le temps d'exécution est trop long (environ 250 secondes) et quand j'enregistre le fichier le temps est long aussi.


Pouvez-vous m'indiquer un moyen d'accélérer ce code ?

Merci.

;)
 

Staple1600

XLDnaute Barbatruc
Re : VBA et optimisation formule SOMME.SI.ENS

Bonsoir à tous

skyteam92 (Bienvenue sur le forum)
(Et bien le bonjour aux camarades de la SNECMA)

•Pour informations
Si tu utilises les tableaux comme dans ce petit exemple ci-dessous
(en évitant de les remplir avec des boules), ton code pourrait déjà s'optimiser ;)
Code VB:
Global tablo() As Variant
Sub a()
Dim f As Worksheet, derlig&
'///////////////////////A NE PAS CONSERVER///////////////////////////
' partie du code pour créer des données sur la feuille 1
With Sheets(1).Range("A1:E50")
.FormulaLocal = "=ENT(LIGNE()*ALEA()*COLONNE()*CNUM(AUJOURDHUI()))"
.Value = .Value
End With
'//////////////////////////////////////////////////////////////////////

'Ci-dessous partie du code concernant ta question sur le forum
derlig = Cells(Rows.Count, "A").End(3).Row
'remplissage de l'array tablo [ sans boucle , avec valeurs des Colonne A et B de feuille 1)]
tablo = Range(Cells(1, 1), Cells(derlig, 2)).Value
'copie de tablo sans boucle sur la feuille 2
Set f = Sheets(2)
f.Range("A1").Resize(UBound(tablo, 1), UBound(tablo, 2)).Value = tablo
End Sub




 

skyteam92

XLDnaute Nouveau
Re : VBA et optimisation formule SOMME.SI.ENS

Merci de ta réponse Staple1600.

En effet c'est une bonne idée que de remplir le tableau de cette manière.
Mais en mettant des timer je me suis rendu compte que c'est l'utilisation de la formile somme.si.ens en vba qui allongent considérablement le temps.
Comment on pourrait adapter la forumle à ton code ?
 

Discussions similaires

Réponses
5
Affichages
124