XL 2013 Optimisation SommeProd (formule ou vba)

GADENSEB

XLDnaute Impliqué
Bonsoir le forum
je gère le fichier ci-joint que je souhaite optimiser :

Opitmiser les sommeprod dans l'onglet SYNTHESE
pour exemple en E6
Code:
=SOMMEPROD((B_Annee=$A6)*(B_Semaine=$C6)*(B_Statut=E$3)*(B_Apayer))
comme le fichier original comporte 10000 lignes le recalcul des sommeprod sur l'ensemble de la page SYNTHESE prends environ 1 minute
poue éviter le recalcul en permance à la saisie des données dans "COMPTES" j'ai bloqué les calculs avec

Code:
Sub Désactivation_App()
    'On désactive les applications (optimisation).
    With Application
        .EnableEvents = False
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
End Sub

qui sont ensuite réactivé à l'ouverture de l'onglet SYNTHESE avec
Code:
Sub Activation_App()
    'On réactive les applications (ne pas oublier).
    With Application
        .EnableEvents = True
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With
End Sub

avez vous une solution plus fluide?

... on m'impose de ne pas utiliser un TCD ....
 

GADENSEB

XLDnaute Impliqué
Hello
Je viens de récupérer internet
Voici le fichier exemple avec qq données rémplies pour mieux comprendre les sommeprod.
J’espère que c'est plus clair !
a+ Seb
 

Pièces jointes

  • BUDGET - SYNTHESE 2017 - TEST OPTIMISATION SOMMEPROD - v1.xlsm
    37 KB · Affichages: 64

GADENSEB

XLDnaute Impliqué
hello
J'ai étudié ta fonction mais j'avoue que je n'ai pas compris grand chose
"Gignogne" je comprends mais aprés tout le descriptif de la fonction je suis perdu
j'ai trouvé que en faisant dans une cellule =Gigogne je vois la fonction apparaitre.... mais après c'est tout ... lol

aurais-tu un exemple , stp ?
 

Dranreb

XLDnaute Barbatruc
Bonjour.
La fonction n'est pas faite pour être utilisée dans une formule puisqu'elle renvoie un résultat de type collection qui n'est pas pris en compte par Excel.
Des exemples il doit y en avoir plein en cherchant Gigogne dans ce forum.
 

KIM

XLDnaute Accro
Bonjour Dranreb,
Bonjour le fil et le forum,
J'utilise la macro ci-dessous sans problème avec une version antérieure de GigIdx. Elle compare 2 onglets et m'indique la différence des données dans un autre onglet.
J'ai voulu utiliser ta dernière version du post #32 de ce fil. Au lancement de cette même macro j'ai le message d'erreur suivant : "Source de type "Nothing" non supportée".
Est-ce que la syntaxe de la focnction CréerTableUnique a changé ?
Merci d'avance de ton aide
KIM

PS : Problème résolu, en recopiant les feuilles d'un classeur à un autre, le nom des feuilles à changer dans la fenêtre de l'éditeur vba.
Bonne journée
KIM
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Normalement rien n'a changé coté utilisation, juste une unification, partout, du système d'acquisition d'un tableau, via une procédure commune TableauAcquis.
Ce message est issu d'une clause Else d'un Select Case TypeName(Source).
Mais je vais peut être mettre une clause à part, plus claire, pour "Nothing". J'en ai déjà une pour "Error" qui est aussi déjà arrivé à quelqu'un.
 

GADENSEB

XLDnaute Impliqué
Hello tous les deux
Me revoilà
j'ai un peu peaufiné mon fichier

Du coup, je veux implanter les formules, comme celle la :
Code:
=SOMMEPROD((E$1<=Mois_Reporting)*(Tb_B_COMPTE="COURANT")*(Tb_B_ANNEE=ANNEE(E$5))*(Tb_B_MOIS=E$2)*(Tb_B_BUDGETREEL=$C17)*(Tb_B_POSTE=$A17)*(Tb_B_BQ="OUI")*(Tb_B_DEBITCREDIT))

dans les intersections où, les cellules sont remplies :
- Dans la ligne 1 ; exemple E1;P1
- Dans la colonne A : exemple A17:A22

Les intersections seraient, par exemple : E17 à P18 ........ voir exemple sur fichier

J'ai commencé une formule avec intersect mais cela n'est pas glorieux....
Est-ce que vous auriez une idée ?
Est-ce complémentaire avec la Fonction Gigogne ?

ps : je travaille pour raccroucir aussi la formule
pourrait-ton passer par une fonction ou les variables seraient :
Code:
- (Tb_B_ANNEE=ANNEE(E$5))
- (Tb_B_MOIS=E$2)
- (Tb_B_BUDGETREEL=$C17)

et du coup la fonction serait
Code:
=SOMMEPROD((E$1<=Mois_Reporting)*(Tb_B_COMPTE="COURANT")*(Tb_B_POSTE=$A17)*(Tb_B_BQ="OUI")*(Tb_B_DEBITCREDIT))

Est-ce clair ?
Merci de votre aide !
Bonne am
 

Pièces jointes

  • BUDGET - SYNTHESE 2017 - TEST OPTIMISATION SOMMEPROD - v2.xlsm
    36.6 KB · Affichages: 24

Dranreb

XLDnaute Barbatruc
Bonjour.
La fonction Gigogne est plutôt adaptée pour sortir tous les BubgetReel de chacun de tous les Mois de chacune de toutes les Années. Mais rien n'empêcherait de ne s'intéresser qu'à un seul de chaque: il suffirait de ne n'explorer, dans la collection globale, que la Co du SsGr dont l'Id vaut l'année qu'on veut, et pareil à l'intérieur pour le mois et pareil dans celui ci pour le BudgetReel. Mais c'est dommage.
J'ai ouvert le classeur après avoir écrit le début qui précède.
Attention il y aurait un petit souci du fait que les mois sont des textes plutôt que des dates de 1er de mois: Gigogne classe tous les textes par ordre alpha. Mais il n'est pas sûr qu'il faille employer un SsGr pour le mois: on peut sans doute déduire du mois de la date en colonne 2 la colonne où il faut cumuler les Détail(18)
À priori il faudrait explorer par Année, Poste et Budget/Réel ce dernier étant en ordre décroissant puisqu'on veut le REEL avant le BUDGET.
Donc Gigogne(Feuil2.[A2], 3, 7, -5)
Ce n'est pas la même démarche que lorsqu'on fait des SOMMEPROD : Ce n'est pas à vous de lui dire à quoi doit correspondre chaque poste, c'est lui qui vous dit ce qu'il y a, dans les Id des SgGr, et tout ce qui s'y rattache est trouvé à la suite, dans d'autres SsGr, ou, en dernier ressort, dans une collection de lignes de détails se rapportant à tous les SsGr à la fois sur lesquels l'exploration de l'ensemble est momentanément positionnée.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour,
Surtout, en ne travaillant pas directement dans les cellules, mais en explorant une collection fabriquée par Gigogne, et en garnissant au fur et à mesure, de ce qu'on y trouve, les postes d'un tableau VBA, qu'on versera à la fin en une fois dans la plage destinatrice.
 

Dranreb

XLDnaute Barbatruc
La fourniture GigIdx étant supposée accessible, dans la procédure, qui sortira le truc, déclarer les Ann As SsGr, Poste As SsGr, BudReel As SsGr ainsi que le tableau résultat TR() et un L As Long pour la ligne courante d'élaboration dedans, enfin un variant Détail pour accueillir une ligne de détails.

Il y aura probablement d'autre déclarations mais déjà tout de suite la structure de base :
VB:
For Each Ann In Gigogne(Feuil2.[A2], 3, 7, -5)
   For Each Poste In Ann.Co
      For Each BudReel In Poste.Co
         For Each Détail In BudReel.Co
             Next Détail
         Next BudReel
      Next Poste
   Next Ann
 
Dernière édition:

Discussions similaires