Tableaux croisés / MAJ VBA longue ou incomplète
Résolu
Mashensky
-
Mashensky Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
Mashensky Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai écrit une macro relativement simple pour mettre à jour en un clic-bouton les TCD de mon document, et les calculs qui en découlent.
J'ai 16 petits TCD (10 lignes, 13 colonnes chacun), qui vont 2 par 2, et dont je fais découler, pour chaque paire, un petit tableau de 10 lignes et 13 colonnes qui compare le résultat du TCD 1 à celui du TCD 2.
Les TCD sont tous basés sur la même database, donc je n'ai besoin, dans la macro, que d'en mettre à jour un, et tous les autres sont automatiquement mis à jour en même temps.
Sur chaque paire, le premier n'a aucun filtre, le second en a un en "filtre de rapport".
Quand je fais tourner la macro, elle prend énormément de temps.
Du coup, en cherchant un peu sur le net, j'ai trouvé que si je mettais en tête de macro "Application.Calculation = xlCalculationManual" puis en fin de macro, "Application.Calculation = xlCalculationAutomatic", ma macro tournait en quelques secondes au lieu de 10 minutes (sic !)
MAIS... quand je désactive ainsi le calcul automatique, alors mes TCD se mettent à jour bizarrement, et pour chacun d'entre eux (avec ou sans filtre de rapport préalable), il n'y a plus que 4 lignes et 2 colonnes. Pourtant, quand je vérifie la base de donnée des TCD, elle est correcte (MAJ auto dans la macro pour ne pas louper une nouvelle ligne de la database), et si je fais une actualisation manuelle du TCD, tous les TCD reviennent au format "normal" avec les 10 lignes x 13 colonnes dont j'ai besoin.
En tête de macro, j'ai déjà mis :
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
(tout repassé en "true" en fin de macro), mais il semble vraiment que ça soit le calcul automatique qui plombe l'exécution de la macro.
Alors si l'un d'entre vous a une solution (et/ou une explication) à mon problème, je suis preneuse !! Merci d'avance pour votre aide précieuse.
J'ai écrit une macro relativement simple pour mettre à jour en un clic-bouton les TCD de mon document, et les calculs qui en découlent.
J'ai 16 petits TCD (10 lignes, 13 colonnes chacun), qui vont 2 par 2, et dont je fais découler, pour chaque paire, un petit tableau de 10 lignes et 13 colonnes qui compare le résultat du TCD 1 à celui du TCD 2.
Les TCD sont tous basés sur la même database, donc je n'ai besoin, dans la macro, que d'en mettre à jour un, et tous les autres sont automatiquement mis à jour en même temps.
Sur chaque paire, le premier n'a aucun filtre, le second en a un en "filtre de rapport".
Quand je fais tourner la macro, elle prend énormément de temps.
Du coup, en cherchant un peu sur le net, j'ai trouvé que si je mettais en tête de macro "Application.Calculation = xlCalculationManual" puis en fin de macro, "Application.Calculation = xlCalculationAutomatic", ma macro tournait en quelques secondes au lieu de 10 minutes (sic !)
MAIS... quand je désactive ainsi le calcul automatique, alors mes TCD se mettent à jour bizarrement, et pour chacun d'entre eux (avec ou sans filtre de rapport préalable), il n'y a plus que 4 lignes et 2 colonnes. Pourtant, quand je vérifie la base de donnée des TCD, elle est correcte (MAJ auto dans la macro pour ne pas louper une nouvelle ligne de la database), et si je fais une actualisation manuelle du TCD, tous les TCD reviennent au format "normal" avec les 10 lignes x 13 colonnes dont j'ai besoin.
En tête de macro, j'ai déjà mis :
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
(tout repassé en "true" en fin de macro), mais il semble vraiment que ça soit le calcul automatique qui plombe l'exécution de la macro.
Alors si l'un d'entre vous a une solution (et/ou une explication) à mon problème, je suis preneuse !! Merci d'avance pour votre aide précieuse.
A voir également:
- Tableaux croisés / MAJ VBA longue ou incomplète
- Tableaux croisés dynamiques - Guide
- È maj - Guide
- Maj chrome - Accueil - Applications & Logiciels
- Maj windows 10 - Accueil - Mise à jour
- Min to maj - Guide
1 réponse
Bonjour,
A tester dans l'ordre, mais sans garantie. Bizarre qu'il mette 10' à recalculer ça...
Essaie déjà en enlevant le Application.ScreenUpdating = False. Tu le remettras en tout dernier pour tester avec quand tu auras résolu tes pb. Mais vu le peu de cellules concernées je ne penses pas que tu gagnes beaucoup à l'utiliser.
Avant de remettre le calcul automatique essaie de rafraichir tous tes TCD avec :
Si ça ne suffit pas enlève et rafraichit-les un par un dans l'ordre logique (si TCD2 a besoin du TCD1, faire d'abord TCD1) :
Si tu as des formules et si tu comptes remettre Application.ScreenUpdating = False :
normalement excel s'y retrouve très bien, mais si toujours pb tu peux calculer tes feuilles individuellement mais dans l'ordre logique :
Si Feuil3 a besoin des résultats de Feuil1 calcule celle-ci en premier.
Sheets("Feuil1").calculate
Sheets("Feuil3").calculate
'etc
Et si tu as plusieurs plages dépendantes sur une même feuille tu peux rentrer dans le détail en cas de besoin en précisant la plage :
Sheets("Feuil1").[A:C].calculate ' des colonnes entières
Sheets("Feuil1").[F1:K10].calculate ' une plage
Un fichier nous permettrait de tester...
eric
A tester dans l'ordre, mais sans garantie. Bizarre qu'il mette 10' à recalculer ça...
Essaie déjà en enlevant le Application.ScreenUpdating = False. Tu le remettras en tout dernier pour tester avec quand tu auras résolu tes pb. Mais vu le peu de cellules concernées je ne penses pas que tu gagnes beaucoup à l'utiliser.
Avant de remettre le calcul automatique essaie de rafraichir tous tes TCD avec :
ThisWorkbook.RefreshAll
Si ça ne suffit pas enlève et rafraichit-les un par un dans l'ordre logique (si TCD2 a besoin du TCD1, faire d'abord TCD1) :
Sheets("Feuil1").PivotTables("Tableau croisé dynamique1").PivotCache.Refresh 'etc
Si tu as des formules et si tu comptes remettre Application.ScreenUpdating = False :
normalement excel s'y retrouve très bien, mais si toujours pb tu peux calculer tes feuilles individuellement mais dans l'ordre logique :
Si Feuil3 a besoin des résultats de Feuil1 calcule celle-ci en premier.
Sheets("Feuil1").calculate
Sheets("Feuil3").calculate
'etc
Et si tu as plusieurs plages dépendantes sur une même feuille tu peux rentrer dans le détail en cas de besoin en précisant la plage :
Sheets("Feuil1").[A:C].calculate ' des colonnes entières
Sheets("Feuil1").[F1:K10].calculate ' une plage
Un fichier nous permettrait de tester...
eric
Merci pour cette réponse complète :-D