Amélioration macro

Danybrett

XLDnaute Junior
Bonjour,

Ma macro, fonctionne, elle fait ce que je lui demande. Mais elle est extrêmement gourmande et compliquée (1800 lignes de codes) et donc pour éviter que le fichier crash ou que la macro mette 10min à s’exécuter, j'ai passé au début de ma macro en "actualisation manuelle". Comme ça la macro s’exécute en 5 secondes.

Mais du coup quand je viens actualiser les pages manuellement ou si je bascule ma macro en "actualisation automatique" à la fin, ba excel crash. Comme je suis un grand débutant en VBA, ma macro contient sans doute des choses horribles (comme 34 "SI" imbriqué :p) et j'ai beaucoup utilisé l'enregistrement de macro, il y a donc du code en commentaire dont je ne sais pas ce qu'il fait, mais ça fonctionne sans, donc je ne le mets pas :p.

J'aimerais savoir si quelqu'un a une idée d'amélioration pour ma macro afin de la fluidifier et qu'elle fonction sur n'importe quel PC même un pas tés puisant (exemple le mien :p).

Ma macro est basée sur un "Userforme" composé d'un menu déroulant où l'on vient choisir un nouveau produit.
Une fois le choix fait ce nouveau produit vient s'ajouter a liste avec un temps pour chaque opération et une date de début de l'opération.
Ensuite, nous avons plusieurs "centre de charge" qui viennent récupérer les dates et les temps qui les concernent.
la macro vient renseigner le numéro de semaine de chaque date puis elle additionne les temps pour chaque numéro de semaine identique et tout cela est renseigné dans un graphique de charge.

Désolé si ce n'est pas clair, j’espère qu'avec l'Excel fournit vous comprendrez mieux son fonctionnement. :)
 

Pièces jointes

  • Exemple tableau suiviV12.xlsm
    248.1 KB · Affichages: 52

Danybrett

XLDnaute Junior
Alors pour les feuilles graph, 2, 3, 4, 5, 6 c'est très compliqué :)

je vais faire avec un éxemple pour "graph" et "graph2" (car ils vont ensemble pour faire la "charge 471"):
la "charge 471" est composé de 7 centres de charges: "A";"B";"C";"D";"E";"F" et "471" qui est la charge total.

le centre de charge "A" est composé de:
- Date Op2 (J3) et temps Op2 (J5)
- Date Op3 (K3) et temps Op3 (K5)

le centre de charge "B" est composé de:
- Date Op2 (J3) et temps Op2 (J5)
- Date Op5 (M3) et temps Op5 (M5)
- Date Op21 (AK3) et temps Op21 (Ak5)

le centre de charge "C" est composé de:
- Date Op6 (N3) et temps Op6 (N5)
- Date Op8 (P3) et temps Op8 (P5)
- Date Op10 (R3) et temps Op10 (R5)

le centre de charge "D" est composé de:
- Date Op7 (O3) et temps Op7 (O5)
- Date Op9 (Q3) et temps Op9 (Q5)
- Date Op11 (S3) et temps Op11 (S5)
- Date Op14 (Y3) et temps Op14 (Y5)
- Dtae Op15 (Z3) et temps Op15 (Z5)
- Date Op16 (AA3) et temps Op16 (AA5)

le centre de charge "E" est composé de:
- Date Op17 (AC3) et temps Op17 (AC5)
- Date Op19 (AG3) et temps Op19 (AG5)
- Date Op27 (AR3) et temps Op27 (AR5)
- Date Op28 (AS3) et temps Op28 (AS5)
- Date Op29 (AU3) et temps Op29 (AU5)
- Date Op30 (AV3) et temps Op30 (AV5)
- Date Op31 (AW3) et temps Op31 (AW5)
- Date Op17 (AF3) et temps Op17 (AF5)

le centre de charge "F" est composé de:
- Date Op20 (AI3) et temps Op20 (AI5)

le centre de chareg 471 est composé de:
- Date Op1 à Op32 et temps Op1 à Op32
- En sautant les "jalon/ctrl" (cases violettes)

Alors, je me suis posé la question: Comment ajouter les temps et les dates dans chaque centre de charge (A,B,C,D,E,F ET 471) tout en conservant les temps et dates des produits déjà entré ?

Alors je me suis dit que si j'inserts une ligne dans "graph" à la position 4 et que j'entre les temps et date
puis une 2 éme ligne en position 4 et que j'entre les dates et temps.... Comme ça si j'ajoute un produit ou modifie des temps ou supprime des temps, ba cela va changer aussi dans "graph" (je ne sais pas si je suis clair :( )

Exemple:

Etape 1:
- Insérer ligne position 4 dans "graph"

Etape2:
- entrer premiers temps dans les centres de charge
- A: Date Op2 (J3) et temps Op2 (J5)
- B: Date Op2 (J3) et temps Op2 (J5)
- C: Date Op6 (N3) et temps Op6 (N5)
- D: Date Op7 (O3) et temps Op7 (O5)
- E: Date Op17 (AC3) et temps Op17 (AC5)
- F: Date Op20 (AI3) et temps Op20 (AI5)

Etape 3:
- Insérer ligne position 4 dans "graph"

Etape4:
- entrer deuxième temps temps dans les centres de charge
- A: Date Op3 (K3) et temps Op3 (K5)
- B: Date Op5 (M3) et temps Op5 (M5)
- C: Date Op8 (P3) et temps Op8 (P5)
- D: Date Op9 (Q3) et temps Op9 (Q5)
- E: Date Op19 (AG3) et temps Op19 (AG5)
- F: rien car pas d'autre date et temps

Etape 5:
- Insérer ligne position 4 dans "graph"


Etape 6:
- entrer troisième temps dans les centres de charge
- A:
rien car pas d'autre date et temps
- B: Date Op21 (AK3) et temps Op21 (Ak5)
- C: Date Op10 (R3) et temps Op10 (R5)
- D: Date Op11 (S3) et temps Op11 (S5)
- E: Date Op27 (AR3) et temps Op27 (AR5)
- F:
rien car pas d'autre date et temps

Etape 7:

- Insérer ligne position 4 dans "graph"


Etape 8:
- entrer quatrième temps dans les centres de charge
- A: rien car pas d'autre date et temps
- B: rien car pas d'autre date et temps
- C: rien car pas d'autre date et temps
- D: Date Op14 (Y3) et temps Op14 (Y5)
- E: Date Op28 (AS3) et temps Op28 (AS5)
- F: rien car pas d'autre date et temps

[...] ETC ETC.... Jusqu’à

Etape x:
- Insérer ligne position 4 dans "graph"

Etape x:
- entrer dernier temps dans les centres de charge
- A: rien car pas d'autre date et temps

- B: rien car pas d'autre date et temps
- C: rien car pas d'autre date et temps
- D: rien car pas d'autre date et temps
- E: Date Op17 (AF3) et temps Op17 (AF5)
- F: rien car pas d'autre date et temps


Ensuite pour la charge complète atelier 471 qui se fait dans "graph2" je m'étais dit que se serais trop long donc j'ai seulement fait un copié/collé des dates et temps en sautant les "jalon/ctrl" (cases violette) mais le problème c'est que du coup ça s'actualise pas en cas de changement.

Voila, et je répète ça pour "atelier 472" et "atelier 485".

Pour tous mes calculs je fais de la ligne du haute (ligne 1 ou ligne 2 ou ligne 3....) et je descend jusqu’à la ligne 1 000 000 comme ça, cela va prendre toutes les données même s'il y en a beaucoup.

Je sais que c'est complètement farfelu et compliqué comme méthode mais j'ai pas trouvé comment faire autrement sur le coup :oops: (j’espère que je ne me suis pas trompé dans mon exemple)
 

vgendron

XLDnaute Barbatruc
Hello

Bon, je crois y voir plus clair

Voici une version 16 avec quelques modifs...
1) dans la feuille Matrice, le tableau qui contient toutes les données de départ est devenu une "TABLE" excel et s'appelle "TabMatrice"
2)dans la feuille Planning, le tableau qui contient les donnée que tu ajoutes au fur et à mesure est aussi devenu une TABLE excel et s'appelle: TabPlanning --> va servir pour récuperer les info à mettre dans les différentes charges

3) feuille Jours non travaillés:
--> il faudrait remettre la date que j'ai effacé par erreur en B4
--> BDD Menu déroulant sert à générer la liste de validation du formulaire: il s'agit aussi d'une zone nommée dynamiquement avec la fonction Décaler.
--> les zones Jaunes vertes et bleues permettent de définir le contenu des différentes charges
j'ai rempli les DefCharge A à 471 avec ce que tu m'a dis dans ton dernier post
il faudrait faire de meme avec les autres charges

4) Feuille Graph2 -4 et 6, j'ai déplacé d'une colonne sur la gauche pour rester dans la meme structure que les autres feuilles
5) Le code.. je te laisse découvrir à quel point il a été raccourci -:)

la version 17 sera avec les autres charges
et je pense que les séries de tes graphiques devront aussi etre adaptés.. il me semble que des sommeprod pointent sur les mauvaises colonnes
 

Pièces jointes

  • Exemple tableau suivi Rev16.xlsm
    253.4 KB · Affichages: 48
Dernière édition:

Danybrett

XLDnaute Junior
Salut,

Ho mon dieu :eek:, c'est un autre niveau d'Excel ça !!!
Je dois avouer que je ne comprends pas le code vba de ce niveau :oops:

Mais c'est hallucinant la taille qu'il fait maintenant, ça n'a plus rien à voir avec les 1800 lignes que j'avais auparavant :D

Si je comprends bien, pour "charge 472" qui se fait avec "Graph3" et "Graph4" et pour "Charge 485" qui se fait avec "Graph5" et "Graph6" il suffit juste de renseigner les "Op..." de chaque centre de charge dans la zone en bleu sur la page "Jours non travaillé" ?

Je te transmet le fichier excel avec la partie en bleu remplie, par contre j'ai été obligé d'étendre la partie bleu de "DefCharge472" car pas assez de place.

Je me demandais si on pouvais repasser la macro en "actualisation automatique" à la fin de la macro ? ça éviterait d'être obligé d'actualiser partout ? moi quand je l'avais fait comme ça recalculé tout le fichier excel, ba il crach mais avec vos amélioration, peut être que c'est bon :)
 

Pièces jointes

  • Exemple tableau suivi Rev16.xlsm
    292.8 KB · Affichages: 48

vgendron

XLDnaute Barbatruc
Hello

Voici la Rev 17
j'ai modifié tes formules pour tracer les graph..
inutile de leur donner des séries de 1 000 000 de lignes quand il n'y en a que 60
la macro met automatiquement la taille de la série en A1 des trois charges 471 472 et 485

et Re passage en calcul automatique à la fin de la macro
un test que je n'ai pas effectué: lancer avec un tableau Planning VIDE..
 

Pièces jointes

  • Exemple tableau suivi Rev17.xlsm
    252.5 KB · Affichages: 39

Danybrett

XLDnaute Junior
Merci beaucoup

C'est vraiment énorme ce que tu as fait :)

Je pense que repasser en calcul automatique n'est pas utile du coup, car le bouton "actualiser" de la feuille "planning" actualise cette même page.
Et que les boutons "Actualiser" pour les pages "charge 471"; "charge 472" et "charge 485" les actualisent ainsi que les pages "graph" qui leur sont liés.

J'aurais deux petites questions:
- Je peux supprimer le code que j'avais et que vous avez mis en commentaire ? ou c'est dangereux :)
- Quand j'ouvre le menu déroulant ça m'affiche: "Mémoire insuffisante pour afficher en entier", c'est normal ? Ou j'ai tout cassé ? :oops:
 

vgendron

XLDnaute Barbatruc
J'ai remis le calcul en mode manuel en fait, la dernière ligne qui remet en auto est passée en commentaire
j'ai supprimé tout le code de tri qui était en commentaire
et j'ai remis à zero (effacé) toutes les feuilles graph..
et pas de message d'erreur chez moi.. - Peut etre une fausse manip chez toi au moment d'effacer..??
sinon peut etre fermer Excel et le rouvrir..?
 

Pièces jointes

  • Exemple tableau suivi Rev18.xlsm
    233.9 KB · Affichages: 25

Danybrett

XLDnaute Junior
Oui, je pense que j'ai fait une fausse manip, car là ça fonctionne parfaitement :)

j'ai vu pour "actualisation automatique" et je pense qu'il n'y a pas besoin de l'y mettre vu que l'on vient actualiser avec les boutons "Actualiser"

J'ai remarqué que la partie VBA qui supprime les "t" ; "T" et les Erreurs (#Ref ; #Valeurs ; #N/V...) qui est dans le module "Actualiser" est pour les pages "Graph", "Graph3" et "Graph5" mais il n'est pas pour les pages "Graph2" ; "Graph4" et "Graph6".
Tu penses qu'avec un simple copié/collé de ces lignes de codes je peux l'ajouter pour le "Graph2" ; "Graph4" et "Graph6" ?

Aussi, j'ai ajouté des "actualisation" dans le "sub actualiser_Planning ()" qui est tout en bas du module "Actualiser", tu peux me dire ce que tu en penses ? :)

Si je veux changer les noms des Op1, Op2, Op3,... il Suffit juste que je les change sur la page "planning" et sur la page "jours non travaillé", c'est bien ça ?
 

Pièces jointes

  • Exemple tableau suivi Rev18 (1).xlsm
    247 KB · Affichages: 22

vgendron

XLDnaute Barbatruc
Hello

Ci jointe Rev 19
1) dans les macro "Actualiser"
-->j'ai supprimé (mis en commentaire) le deuxième tri qui me semble etre un doublon
-->j'ai ajouté la suppression des t,T et Erreur pour les graphes manquant
--> j'ai supprimé la fonction Nbval en A3, vu qu'elle est déjà présente en A2 et déjà calculée

et plutot que de faire un calculate feuille par feuille, tu peux provoquer un calculate général
Application.Calculate

et oui, pour les noms d'Op..
il faut juste t'assurer que les noms sont écrits strictement de la meme manière entre la feuille Planning et Jours non Travaillé.. (et aussi matrice pour que ca soit cohérent)

Conseil: eviter les symboles et espace dans les noms... ca provoque souvent des erreurs
c'est pour ca que - tu l'as peut etre remarqué - toutes mes variables ou non de zones sont écrites avec des majuscules en lieu et place des espaces :: NomVariableZone au lieu de Nom Variable Zone
 

Pièces jointes

  • Exemple tableau suivi Rev19.xlsm
    224.1 KB · Affichages: 20

Danybrett

XLDnaute Junior
C'est noté :D

Par contre, j'ai voulu tester en ajoutant 2 produits, sur le 2ème j'ai mis des "t" et "T" et le 1er produit, je l'ai supprimé (en suppriment les 3 lignes qui le composait).
Du coup dans mes Graph... plusieurs dates ont été changées en "t" ; "T" ou #Ref! et donc le calcul de semaine a lui été transformé en #Valeur! (jusque là, c'est normal :) )

Mais quand je fais actualiser dans "charge 471" (par exemple) ça enlève bien les "t" et "T" mais les erreurs #ref! et #valeur! restent.
Pourtant, la formule:

If IsError(.Cells(I, col + 1)) Then .Cells(I, col).Resize(1, 3).ClearContents 'efface les erreurs

Me semble bonne le IsError c'est ce que j'avais aussi utilisé avant.
Je te transmets le fichier excel où j'ai fait ce que j'ai dit plus haut.
 

Pièces jointes

  • Exemple tableau suivi Rev20 (1).xlsm
    255 KB · Affichages: 16

vgendron

XLDnaute Barbatruc
Hello
voir la rev21
Le problème vient du fait que les t, T et ref ne sont pas tous enlevés.. enfin je crois
dans le fichier que tu m'as envoyé, j'ai relancé les actualisations, et les derniers ref restent..

la boucle de suppression ne va pas au bout des datas..
elle prend la valeur de A2.. qui elle, ne compte pas les ref....
j'ai donc ajouté des formules en A3..
à voir et adapter je pense.
je te laisse faire le test, car je n'ai pas compris, à quel moment et ou, l'utilisateur met des t ou T..
 

Pièces jointes

  • Exemple tableau suivi Rev21.xlsm
    248.1 KB · Affichages: 19

Danybrett

XLDnaute Junior
Salut :)

Désolé pour le retard de ma réponse, mais je testais le fichier excel.
Et je confirme qu'il répond exactement à mes attentes, il est parfait :D

Un grand merci à vous !!! Je n'aurais jamais réussi à atteindre un tel résultat sans vous :p
Je me perpétrais de revenir vers vous si jamais j'ai un problème.

Sur ce, bonne journée et encore merci ;)
(si besoin je reste en vue de ce forum)
 

Discussions similaires

Réponses
12
Affichages
242
Réponses
7
Affichages
319

Statistiques des forums

Discussions
312 194
Messages
2 086 068
Membres
103 110
dernier inscrit
Privé