Acceleration code pour remplir un tableau

Guigui

XLDnaute Occasionnel
Bonsoir à tous.

J'ai besoin de votre pour tenter de rendre plus rapide l’exécution d'un code que j'ai établis.
Actuellement, le code tourne pendant environ 6min ... !

Je suis tout a fait conscient que mon code doit être assez "sale" ou "une usine à gaz"
Je fais donc appel à vos connaissances pour voir ce qui est possible de faire. (tableau en variable, declaration correcte de variable ... ?)

Mon support est le suivant (je vous joint un exemple réduit)

Partant d'une liste d'agents comportant le type de contrat, la base horaire, la présence ou non suivant les mois et des catégorie regroupant les agents, je remplis un autre tableau (onglet "PREPA FICHIER CONSOLIDATION") qui va comptabilisé les items suivants :

Pour chaque mois ET pour chaque catégorie :
- le nombre de temps plein ou temps partiel total
- le nombre d'heure de contrat total
- le détail des temps plein ou temps partiel par type de contrat (CDI, CDD ..)

Mon exemple montre 9 agents et 2 catégories, le code est assez rapide (quoique ...) env 2 secondes
Mon fichier original comporte pas loin de 500 agents et 10zaine de catégorie ... 6min ..

Je ne maîtrise pas du tout les variables "tableau" (?), est ce une solution ?
Ou peut être une façon de déclarer correctement les variables ?

A noter que pendant l’exécution du code dans mon fichier original, "excel" passe en mode "NE RÉPOND PAS" après quelques seconde et se rétabli à la fin du code.

N'hésitez pas en cas de questions ... ou critique ! :)

Merci par avance

Slts
Guillaume
 

Pièces jointes

  • Exemple.xls
    281 KB · Affichages: 112
  • Exemple.xls
    281 KB · Affichages: 116
  • Exemple.xls
    281 KB · Affichages: 119

Jam

XLDnaute Accro
Re : Acceleration code pour remplir un tableau

Bonjour Bebere,
Jam
bien au contraire,c'est ce qu'il y a de plus rapide comme code
avant de dire des choses aussi catégoriquement renseigne toi
GuiGui

Mea Culpa beber, je pensais Collection au lieu de Dictionnary d'où ma remarque à tord :(. Néanmoins attention au-delà de 65536 éléments, la recopie sur une feuille devient problématique.
 

Guigui

XLDnaute Occasionnel
Re : Acceleration code pour remplir un tableau

Bonsoir le forum, Jam, Bebere,

Je me permets de vous relancer.
Avez vous une solution qui permettrais de transférer le résultat de bebere dans mon tableau (onglet Prepa fichier consolidation)
Est-ce que je pars sur une boucle entre les catégories de mon tableau et les résultats dans DATA ?
Je vais peut être reproduire une lenteur en bouclant comme dans ma version initial ?
(bien qu'en déclarant correctement mes variables :)

Avez vous en tête une façon plus efficace ?

Merci par avance.

Slts
Guillaume
 

Bebere

XLDnaute Barbatruc
Re : Acceleration code pour remplir un tableau

bonjour Guigui,Jam
le résultat sera mis dans un tableau,ensuite tu pourras extraire ce que tu veux
avec Type Contrat,Base Horaire,catégorie,date,Nom,nombre,heure
est ce suffisant pour toi
mais patience pas beaucoup de temps
 

Guigui

XLDnaute Occasionnel
Re : Acceleration code pour remplir un tableau

Ok merci Bebere, je ne pensais pas que tu bossais dessus :)

Si cela ralonge les choses, les infos qui me sont nécessaires sont celles situés dans l'onglet "prepa fichier consolidation" (colonne A) :

Par mois et par categorie:
Nbre de temps plein et le total d'heure
Nbre de temps partiel et le total d'heure

Nbre de CDI temps plein
Nbre de CDI temps partiel
Total

Nbre de CDD temps plein
Nbre de CDD temps partiel
Total

Merci encore de aide.

Slts
 

Bebere

XLDnaute Barbatruc
Re : Acceleration code pour remplir un tableau

bonjour Guigui
dans module2 consolidation(début)
ensuite consolidation appelle prepare
le select case dans consolidation appelle les différentes routines de module3
pour le moment résultat dans feuil1
pas contrôlé le résultat
 

Pièces jointes

  • ExempleCompletV1.xls
    638 KB · Affichages: 37

Guigui

XLDnaute Occasionnel
Re : Acceleration code pour remplir un tableau

Bonjour bebere,

Merci beaucoup pour ton implication.

Il faudrait mettre à 0 les "variables" au moment de changer de mois.
Presentement, chaque mois les valeurs se cumuls (ex Effectif Temps plein 454/908/1362)
Je ne double pas mes effectifs chaque mois :)

Les calculs d'heures (ex Nombre d'heures Temps Plein) ne sont pas correctes
Pour finir, le détails par type de contrat n'est pas utile :
J'ai uniquement besoin de différencier "CDI" et "<>CDI" (appelé CDD dans mon tableaude consolidation)
Idem pour les heures contrats, seulement les temps pleins (=151.67) et les autres (<>151.67) appelé temps partiel dans mon taleau.

J'ai essayé de "lire" tout ton code .. c'est .. wow compliqué :) Mais je pense avoir reperé les endroits "clés" pour l'adapter une fois terminé.


Merci bcp pour ton aide.
Je reste à ta disposition pour d'autre informations si besoin pour la suite.

Slts
Guillaume
 
Dernière édition:

Bebere

XLDnaute Barbatruc
Re : Acceleration code pour remplir un tableau

bonjour Guigui,le forum
ajouté les dates et prévisionnel et réalisé
ce code n'est pas compliqué
dans module3 c'est plutôt une répétiton du même code
il y a possibilité de condenser
je continue sur la partie agent
 

Guigui

XLDnaute Occasionnel
Re : Acceleration code pour remplir un tableau

Bonsoir Bebere,

J'ai percé les mystères de ton code ! ;)
Je pense avoir compris les variables de tableau mais les Lbound/Ubound et autres "Mondico" ou resize ... reste encore trés flou .. bref .. :)

J'ai donc réussi - comme un grand - à modifier quelques lignes pour calquer à mon besoin.
j'ai également corrigé les enchaînements de "or" et "and" dans le module 3, les conditions "if" étaient faussé.
(question tout de même ? comment se font les priorités dans le cas de plusieurs or et and dans une condition !!?)

Resultat faussé:
Code:
            For L = 2 To UBound(Tbl, 1)
                If Tbl(L, C) = "P" Or Tbl(L, C) = "P > ABS" and Tbl(L, 13) = Range("'NEW TDB'!$AB$1") Then
                        MonDico(Tbl(L, 13)) = MonDico(Tbl(L, 13)) + 1
                        MonDicoA(Tbl(L, 13)) = MonDicoA(Tbl(L, 13)) + Tbl(L, 13)
                End If
            Next L
Résultat OK :
Code:
            For L = 2 To UBound(Tbl, 1)
                If Tbl(L, C) = "P" Or Tbl(L, C) = "P > ABS" Then
                    If Tbl(L, 13) = Range("'NEW TDB'!$AB$1") Then
                        MonDico(Tbl(L, 13)) = MonDico(Tbl(L, 13)) + 1
                        MonDicoA(Tbl(L, 13)) = MonDicoA(Tbl(L, 13)) + Tbl(L, 13)
                    End If
                End If
            Next L

J'ai bouclé également sur les "TblTypeContrat(..) =" car mes catégories ne sont pas toujours du même nombre (dans d'autres duplication du fichier)

J'ai une dernière question, si tu me permet :
Est il possible de figer les données dans les colonnes des dates (mois) qui ne font pas partie du périmètre date à date.
Par exemple,
le tableau rassemble les chiffres du 01/01/2014 au 01/08/2014
et au mois de mars, suite à des modifications dans le tableau de bord je veux mettre à jour les valeurs mais uniquement à partir du 01/03/2014 (jusqu’à une date variable)
Comment faire pour figer les mois de janvier et février et commencer la mise à jour uniquement en mars ..?

Merci par avance.

Slts
Guillaume
 

Pièces jointes

  • PREPA CONSOLIDATION en cours modif.xls
    506.5 KB · Affichages: 40
  • PREPA CONSOLIDATION en cours modif.xls
    506.5 KB · Affichages: 43
  • PREPA CONSOLIDATION en cours modif.xls
    506.5 KB · Affichages: 42

Bebere

XLDnaute Barbatruc
Re : Acceleration code pour remplir un tableau

bonjour Guigui,le forum
le code a été fait sous excel2003
apparemment tu as une version plus récente
pour moi les bonnes conditions doivent être comme suit

If Tbl(L, 13) = Range("'NEW TDB'!$AB$1") Then
If Tbl(L, C) = "P" Or Tbl(L, C) = "P > ABS" Then
si c'est le bon temps alors lire si P or P>ABS
le code fera moins de lectures inutiles
 

Discussions similaires

Statistiques des forums

Discussions
312 312
Messages
2 087 159
Membres
103 484
dernier inscrit
maintenance alkern