XL 2013 Traitement trop long optimisation de code pour générer 2 états

Merlin258413

XLDnaute Occasionnel
Bonjour à tous je me permets de solliciter votre aide dans le cadre d'une optimisation de code. Ces codes me permettent de sortir 2 états en TDC (ONGLET ETAT DES FAE attendu et ETAT DES FACTURES)
Ces codes fonctionnent parfaitement mais le temps de traitement est très long.
Ce fichier peut comporter énormément de ligne j'ai indiqué ici qu'une petite partie de janvier et février à fin octobre je suis à 1200 lignes d'où le temps du traitement.

Comme les 2 états sont issus du même tableau, une simplification peut être apportée, mais là j'ai atteint mes limites.
Mon projet en PJ explication
J'ai un onglet "Base" dans cet onglet j'ai aussi un tableau intitulé "base" source de mes TDC
Dans cet onglet lorsque je choisis un mois cellule C2 j'ai un code qui est généré.

1- le code va tout d'abord lancer une macro qui se trouve dans le module SUIVI
- Mise à blanc des états intermédiaires (FACTURE et FAE) qui servent à réaliser les TDC
- Section du tableau "Base" et copie sur l'état intermédiaire FAE
- Suppression des colonnes ne correspondant pas au mois sélectionné dans l'état FAE
- Suppression des lignes de cette colonne si j'ai la valeur vide ou ANNULEE
- Sélection de l'état intermédiaire FAE pour une copie dans l'état intermédiaire FACTURE : j'utilise cette étape intermédiaire car je n'aurais pas besoin dans mon état FAE de la colonne facture et dans mon état FACTURE de la colonne Programme
- Traitement de l'état FAE
- Suppression de toutes les valeurs différentes de FAE (à ce stade, je ne peux qu'avoir FAE, FACTURE ou ENCOURS)
- Tri par ordre croissant
- Traitement de l'état FACTURE
- Suppression de toutes les valeurs différentes de FACTURE (à ce stade, je ne peux qu'avoir FAE, FACTURE ou ENCOURS)
- Suppression des colonnes inutiles
- Tri par ordre croissant
- Protection de la feuille
2- Lancement du code MISE EN FORME ne concerne uniquement que la mise en forme de l'état des FAE avant d'obtenir le TDC final "ETAT DES FAE ATTENDU et enfin Actualisation de tous les TDC
J’ai réussi à réduire en le sauvegardant en xlb au lieu de xlsm.
Quand vous le télécharger il faudra le reconvertir en xlsm.
Le mot de passe de protection de l'onglet Base est ProgSN vous le retrouvez dans les modules
Ce fichier peut comporter énormément de ligne j'ai indiqué ici qu'une petite partie de janvier et février à fin octobre je suis à 1200 lignes d'où le temps du traitement.
En espérant avoir été clair et merci pour toute votre aide
 

Pièces jointes

  • Production 2015.zip
    292.6 KB · Affichages: 50
  • Production 2015.zip
    292.6 KB · Affichages: 41

Merlin258413

XLDnaute Occasionnel
Re : Traitement trop long optimisation de code pour générer 2 états

Bonjour je vais essayer de le faire je vous tiens au courant d'ici 2 jours.

Si je me trompe pas la formule précurseur temporaire se trouve dans le remplissage de l'image et et la finalisation en fin de procédure c'est dans l'ajout de formule.

Concernant votre erreur je ne la trouve pas je ne vois pas dans le dernier fichier (SsgAbdn) de total acti
Par contre peut être est ce cette erreur j'ai fait des tests sur cette base et j'ai modifié dans mon fichier base afin d'obtenir plusieurs activités en encours et j'ai une erreur sur cette ligne


Ts(Ls, 2) = "Total " & Acti.Id
Variable Objet ou Variable de bloc with non défini

Est ce l'erreur dont vous me parlez ? Si oui et comprend bien votre post je dois supprimer cette ligne ?


"Par ailleurs un problème se pose s'il ne faut pas sortir les totaux pour des sommes ou paquets uniques" je ne sais pas trop ce que cela veut dire je vais y réfléchir

Oui c'est exact on ne sort pas les montants qui s'annule, oui toute une activité pourrait s'annuler si on facture toute l'activité (On passe d'un état Facture A Etablir à Facture)

Par contre une BU pourrait s'annuler dans le cadre d'un transfert d'activités vers une autres sociétés de mon groupe mais dans ce cas j'annulerai toutes les FAE qui sont encours de vie.

Excellente journée
 

Dranreb

XLDnaute Barbatruc
Re : Traitement trop long optimisation de code pour générer 2 états

Bonjour.
C'est sûrement la conséquence des erreurs que j'avais vues, il ne faut pas supprimer, mais intervertir les noms de SsGroup et de Ls1eretc. pour qu'ils soient dans leurs paquets d'instructions respectifs corrects.

Par exemple à la fin j'ai une seule activité EMB/BTP/MRP. Je n'en sortirais donc pas le total qui ne ferait que répéter son montant. Mais derrière j'ai 2 TRANSMISSION dont le total semblerait visuellement englober la 1ere toute seule si on ne fait pas attention et si les chiffres ne sont pas séparés par une ligne vide coté montants, contenant au début l'intitulé de l'activité totalisée. Par contre il n'y a pas de problème s'il n'y a qu'un seul paquet, et qu'on ne sort pas le total activité parce que c'est la seule et que c'est donc le total BU qui en fait office.

Nom mais si ça passe de FAE à autre chose il n'y a pas de problème, je ne les vois même pas, c'est si ça reste FAE mais que ça s'annule. Sinon ça ne sert à rien de tester, comme vous le demandiez, si la somme des montants est nulle et de ne pas la sortir dans ce cas, il vaudrait mieux la sortir pour qu'on la voit en tant qu'anomalie.
 
Dernière édition:

Merlin258413

XLDnaute Occasionnel
Re : Traitement trop long optimisation de code pour générer 2 états

Concernant les FAE :

1- soit elle reste en statut FAE car on ne les as pas facturées
2- Soit elles sont annulées entièrement et donc le mois suivant elles passent en statut annulée
- Par exemple : sur le mois de Novembre, j'ai une FAE de 10 000 €, je vais rajouter une ligne de - 10000 € avec tous les champs identiques et je vais positionner en décembre le statut ANNULEE

3- Soit elles passent en statut FACTURE

Cordialement
 

Dranreb

XLDnaute Barbatruc
Re : Traitement trop long optimisation de code pour générer 2 états

Ça ne me dit toujours pas ce qu'il faut faire.
Soit sortir désormais le cumul montant prestation même s'il est nul,
soit veiller à reprendre Ls de plus haut pour écraser les entêtes de rubriques qui ne servent plus à rien vu qu'il s'en est suivi que tout était nul dans le paquet.
 

Merlin258413

XLDnaute Occasionnel
Re : Traitement trop long optimisation de code pour générer 2 états

1- LES ENCOURS

Par exemple à la fin j'ai une seule activité EMB/BTP/MRP. Je n'en sortirais donc pas le total qui ne ferait que répéter son montant.
Effectivement je ne vois pas l'intérêt de faire apparaître une ligne qui reprendrait le même montant

Mais derrière j'ai 2 TRANSMISSION dont le total semblerait visuellement englober la 1ere toute seule si on ne fait pas attention et si les chiffres ne sont pas séparés par une ligne vide coté montants, contenant au début l'intitulé de l'activité totalisée. Par contre il n'y a pas de problème s'il n'y a qu'un seul paquet, et qu'on ne sort pas le total activité parce que c'est la seule et que c'est donc le total BU qui en fait office.

Si j'ai 2 Transmission je veux obtenir uniquement la somme des encours TRANSMISSION et dans mon total BU. Dans cette BU par exemple j'aurais la somme des activités TRANSMISSION et EMB/BTP/MRP






2 - FAE


Nom mais si ça passe de FAE à autre chose il n'y a pas de problème, je ne les vois même pas, c'est si ça reste FAE mais que ça s'annule. Sinon ça ne sert à rien de tester, comme vous le demandiez, si la somme des montants est nulle et de ne pas la sortir dans ce cas, il vaudrait mieux la sortir pour qu'on la voit en tant qu'anomalie.



réponse : si ça reste en FAE et que cela s'annule alors il ne faut toujours pas sortir la ligne. Je ne veux pas voir apparaître de ligne d'annulation ni la voire apparaître en anomalie. Dans 98% des cas, les lignes FAE sont annulées le mois d'après ou reconduite.
J'espère avoir répondu à votre question
Le rapport des FAE actuel est parfait car il correspond entièrement à mon utilisation. il me reste juste à trouver une solution ou le bon code pour avoir le sous total par activités (pour les FAE et les encours)




Est ce que j'ai répondu à toutes vos questions ?

Cordialement
 

Dranreb

XLDnaute Barbatruc
Re : Traitement trop long optimisation de code pour générer 2 états

Si j'ai 2 Transmission je veux obtenir uniquement la somme des encours TRANSMISSION
Oui, oui, bien entendu ! c'est juste une impression visuelle que c'est le total y compris le EMB/BTP/MRP tout seul devant s'il n'y a pas un vide derrière celui ci.
…le sous total par activités (pour les FAE et les encours)
Alors pour les EnCours c'est dans cet ordre:
VB:
         If Ls > Ls1Acti Then ' La dernière n'est pas la première, donc plusieurs.
            Ls = Ls + 1
            Ts(Ls, 2) = "      Total " & Acti.Id
            Ts(Ls, 5) = "=""R[" & Ls1Acti - Ls & "]C""": End If: Next Acti
      If Ls1Acti > Ls1erBU Then Ls = Ls + 1 ' Début dernier Acti plus loin que début BU…
      If Ls1Acti < Ls Then ' Donc: sauf s'il y en avait une seule dans le BU !
         Ts(Ls, 2) = "Total " & BU.Id
         Ts(Ls, 5) = "=""R[" & Ls1erBU - Ls & "]C""": End If: Next BU
Et pour les FAE c'est pareil après avoir renommé dans cette procédure la variable LsDéb1 (je crois) en Ls1erBU par souci d'homogénéité dans toutes les procédures.

Mais ça laisserait les entêtes de rubriques BU et Activité s'ils ont fait l'objet de Ls = Ls + 1 aux débuts de boucles, même s'il n'y avait finalement que des montants nuls dedans.

Je modifie comme suit la deuxième partie des explications de la fonction GroupOrg dans le module MClassement, tant il est évident que les exemples non compilés actuels ne permettent pas de comprendre comment utiliser son résultat :
VB:
#If False Then '(Partie non compilée ici)
' Le résultat de GroupOrg peut être Affecté à une variable :
      Dim MonGroupeOrganisé As Collection, MaPlage As Range
      Set MonGroupeOrganisé = GroupOrg(MaPlage, 1, 2, -3, , 4, 5)
' Mais on n'en utilisera en général pas, mais plutôt GroupOrg(etc.
' La collection s'explore normalement par :
      Initialisations globales
      For Each SsGrp1 In GroupOrg(MaPlage, etc…)
         Structure interne
         Next SsGrp1
      ConclusionEtTotaux généraux
' SsGrp1 devant être déclaré As SsGroup.
' La structure interne classique pour explorer ce SsGroup est :
      Initialisations , SsGrp1.Id 'est déjà connu à ce niveau.
      For Each Élément In SsGrp1.Contenu
         Structure interne
         Next Élément
      Conclusion Totaux, SsGrp1.Id 'est toujours encore connu.
' S'il concerne la dernière colonne spécifiée (avant vide, nul etc.), Élément doit être un Variant
' et dans la structure interne, Élément(C) représentera une valeur de ligne de détail, colonne C.
' S'il concerne une autre colonne que la dernière spécifiée (avant vide, nul etc.), Élément doit
' être lui même un SsGroup et supportera donc lui aussi cette même structure interne classique.
#End If '(fin des exemples non compilés)
Si vous voyez une manière encore plus claire de l'expliquer, n’hésitez pas à m'en faire part.
 
Dernière édition:

Merlin258413

XLDnaute Occasionnel
Re : Traitement trop long optimisation de code pour générer 2 états

Bonjour je rentre de déplacement je n'ai pas vu vous répondre avant. Pouvez vous m'envoyer svp le fichier Excel avec les corrections des FAE, des encours et du module classement svp.
En vous remerciant et encore merci j'ai rarement vu autant d'investissement pour m'aider
 

Dranreb

XLDnaute Barbatruc
Re : Traitement trop long optimisation de code pour générer 2 états

Bonjour.
En revanche moi je suis déçu du peu d'investissement que vous y avez consacré vous même. Alors ça sera ma dernière contribution.
 

Pièces jointes

  • GrpOrgMerlin258413.xlsm
    436.9 KB · Affichages: 48
  • GrpOrgMerlin258413.xlsm
    436.9 KB · Affichages: 41

Merlin258413

XLDnaute Occasionnel
Re : Traitement trop long optimisation de code pour générer 2 états

Bonjour j'en suis vraiment désolé j'ai pourtant passé des heures des 1/2 journées à essayer de comprendre de travailler de déchiffrer j'ai même essayé seul de faire le module des encours souvenez vous ? Si je fais appel à un forum c'est que je n'ai malheureusement pas les compétences et le savoir nécessaires pour y arriver ce n'est malheureusement pas mon métier ni ma formation.
Désolé de ne pas être un spécialiste du Vba. Et bien je vous remercie quand même pour ce travail et il faudra que vous acceptiez qu'on ne peut avoir tous le même niveau et faire preuve de pédagogie quand vous donnez des morceaux de code la personne en face ne sait pas la logique encore derrière elle essaie de déchiffrer et comprendre. Il faut être aussi humble et accepter que si on ne connait pas Vba on n'est pas un demeuré pour autant. Et enfin ne pas juger de l'investissement quand on a aucune idée des heures passées à comprendre.

Encore merci
Bien cordialement
 

Merlin258413

XLDnaute Occasionnel
Re : Traitement trop long optimisation de code pour générer 2 états

Bonjour si cela intéresse des membres du forum après le temps d’assimilation et de compréhension voici le code pour avoir dans le rapport facture un total par presta /BU/Activité et facture

Code:
Sub RapportFactu()
Dim ColDate&, Te(), Le&, TLgn&(), Ts(), Ls&, Ls1erPresta&, Ls1BU&, _
PRESTA As SsGroup, _
BU As SsGroup, _
ACTI As SsGroup, _
FACTU As SsGroup, _
Montant As Currency, Détail, C&, Cel As Range

Rem. ——— Chargement des données
With FBase.ListObjects("Base").Range
   ColDate = WorksheetFunction.Match(FBase.[C2].Text, .Rows(1), 0)
   Te = .Rows(2).Resize(.Rows.Count - 1).Value
   End With

Rem. ——— Préfiltrage en vue utilisation fonction GroupOrg
ReDim TLgn(1 To UBound(Te))
For Le = 1 To UBound(Te)
   If Te(Le, ColDate) = "FACTURE" Then
      Ls = Ls + 1: TLgn(Ls) = Le: End If: Next Le
FFactu.Rows(4).Resize(20000).Delete
If Ls = 0 Then
   FFactu.[A3].Value = "IL N'Y A AUCUN ÉLÉMENT À LISTER"
   Exit Sub: End If
ReDim Preserve TLgn(1 To Ls)
MClassement.Préfiltrer TLgn

Rem. ——— Remplissage de l'image de l'état.
ReDim Ts(1 To 50000, 1 To 7): Ls = 0
For Each PRESTA In GroupOrg(Te, 4, 2, 3, 6)
Ls = Ls + 1: Ts(Ls, 1) = PRESTA.Id
Ls1erPresta = Ls + 2

   For Each BU In PRESTA.Contenu
      Ls = Ls + 1: Ts(Ls, 2) = BU.Id
      Ls1BU = Ls + 1
      For Each ACTI In BU.Contenu
               For Each FACTU In ACTI.Contenu
              
         
            Montant = 0
            For Each Détail In FACTU.Contenu
            
               Montant = Montant + Détail(7): Next Détail
            If Montant <> 0 Then
               Ls = Ls + 1
               Ts(Ls, 3) = ACTI.Id
               Ts(Ls, 4) = FACTU.Id
               Ts(Ls, 5) = Montant: End If: Next FACTU, ACTI
               
        
      If Ls > Ls1BU Then ' La dernière n'est pas la première, donc plusieurs.
         Ls = Ls + 1
         Ts(Ls, 2) = "      Total " & BU.Id
         Ts(Ls, 5) = "=""R[" & Ls1BU - Ls & "]C""": End If: Next BU
         
                
   If Ls1BU > Ls1erPresta Then Ls = Ls + 1 ' Début dernier Acti plus loin que début BU…
   If Ls1BU < Ls Then ' Donc: sauf s'il y en avait une seule dans le BU !
      Ts(Ls, 2) = "Total " & PRESTA.Id
     
      
      Ts(Ls, 5) = "=""R[" & Ls1erPresta - Ls & "]C""": End If: Next PRESTA
If Ls > 2 Then
   Ls = Ls + 1: Ts(Ls, 1) = "Total général": Ts(Ls, 5) = "=""R4C"""
ElseIf Ls < 2 Then
   Ts(Ls, 1) = "IL N'Y A AUCUN ÉLÉMENT À LISTER (dans la mesure où ils s'annulent tous)"
   End If
Rem. ——— Production de l'état et ajout de formules.
FFactu.[A3].Resize(Ls, 5).Value = Ts
For Each Cel In FFactu.[E3].Resize(Ls).SpecialCells(xlCellTypeFormulas)
   Cel.FormulaR1C1 = "=SUBTOTAL(9," & Cel.Value & ":R[-1]C)"
   
   Cel.Borders(xlEdgeTop).Weight = xlMedium
Cel.Interior.Color = RGB(146, 208, 80)

                
   Next Cel
End Sub



Cordialement

« une connaissance ne se résume pas à une somme de concepts, elle intègre aussi son processus d’acquisition. »
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 848
dernier inscrit
Djigbenou