fouding69
Messages postés10Date d'inscriptionmardi 23 octobre 2007StatutMembreDernière intervention24 novembre 2011
-
11 nov. 2011 à 23:38
Utilisateur anonyme -
20 nov. 2011 à 17:03
Bonjour
Je ne vais pas y aller par 4 chemins : j'ai 49 ans (faudra y aller doucement). Je pense parfaitement maitriser toutes les focntions standards d'Excel 2007, depuis les claissiques conditions, en passant par les tableaux dynamiques croisés, jusqu'au plus complexes calculs matriciels. J'utilise courament les macro, mais en mode "enregistrement" uniquement (je comprend néanmoins un peu le code généré). J'ai quelques vagues souvenir du vieux "basic" et donc je comprend le fonctionnement des boucles, entre autre. Voilà pour la présentation (j'ai oublié : je m'appelle Philippe !)
Je réalise un big classeur avec plusieurs feuilles à l'intérieur, imbriquées, pour les besoins de gestion analytique de ma petite PME. Il ya tellement de calculs que cela devient très très lent.
Pas d'autres solutions que de passer par du VBA, que je ne connais pas (sauf via les macro, bien sûr).
J'espère trouver une âme charitable qui pourra m'accompagner, armer de patiente, dans ma quête d'apprentissage ...
Voici donc un calcul matricelle écrit dans la cellule ED6 de la sheet "Commandes" de mon classeur :
Pour les besoin de ma feuille de calcul, je dois reporter ce calcul sur 6 colones (la variable ED$4 pouvant prendre 6 valeurs différentes, et ce, sur toute la longueur du tableau, soit 3000 lignes ... d'où la lenteur.
Sur la ligne 6 :
- Fournisseurs!$AA$6:$AA$3000 est un nom du client que je compare au nom du client de la ligne 6 colonne A (Commandes!$A6)
- Fournisseurs!$AC$6:AC$3000 est l'affection analytique que je compare donc à ED$4
- Fournisseurs!$AB$6:$AB$3000 est le montant que j'affecte au client si l'analytique est le même
Je cherche à remplacer ce lourd calcul par un code VBA sur la cellule ED6 que je devrais affecter ensuite sur la zone ED6 à EI3006
Merci par avance pour votre aide, et votre "accompagnement" pendant quelques jours.
NHenry
Messages postés15067Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mai 2023158 12 nov. 2011 à 21:26
Bonjour,
Passer par VBA n'accéléra pas forcément le calcul.
Après, je n'utilise pas Excel intensément.
---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list ---
Mon site
Je suis aussi de l'avis de Henry.
Mis à part quelques calculs très simples du genre '=E25*G25' ou encore des pourcentages c'est tout ce que j'utilise sur excel.
Après ton "Big" fichier va se retrouver à 200Mo il sera lent à l'ouverture et utilisation, plantages etc.
Nous on a l'habitude de créer des petites applications qui ouvrent le(s) fichier(s), qui lisent (ou écrivent) les données dans les cellules de notre choix et tous les calculs se font dans le petit 'soft', pas dans le classeur excel. En gros excel sert de base de données.
Sans parler que si tu utilises ce Big classeur pour la totalité de la gestion de ta PME, et que un jour ta clé usb tombe dans l'eau et que ton disque dur se fait écraser par un bus, t'es pas sorti d'affaire.
n'est pas un "lourd calcul" ! et 3000 lignes ne sont qu'une goutte d'eau, y compris sur tes 6 colonnes !
Si tu as des lenteurs observées, il y a fort à parier que :
- soit tu as (le plus vraisemblable) des références circulaires
- soit tu as plein d'autres petites choses sur tes feuilles, dont tu ne nous parles pas.
Dans le 1er cas : cherche-les en analysant ton fichier
Dans le second cas (plein de petites "bébelles" pour "enjoliver"), l'affichage lui-même te bouffe beaucoup de temps (car se met à jour à chaque formule exécutée). Il serait alors bon d'inhiber cette mise à jour pendant tout le calcul, puis de la restituer in fine?. Et oui : VBA peut alors t'y aider (regarde dans ton aide en ligne le mot ScreenUpdating )
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Vous n’avez pas trouvé la réponse que vous recherchez ?
fouding69
Messages postés10Date d'inscriptionmardi 23 octobre 2007StatutMembreDernière intervention24 novembre 2011 13 nov. 2011 à 14:40
Bonjour à tous et merci pour vos réponses.
En effet acive, je n'ai pas tout dit : ce genre de calculs (ma formule répétée sur 3000 lignes et 6 colonnes) se répêtent à plusieurs reprises dans mon classeur, sur plusieurs feuilles. d'où "ma" lenteur. le fichier xlsx fait .. 3Mo.
J'ai pris ce cas au hasard histoire de comprendre le code pour pouvoir le dupliquer ailleurs.
Je ne gère pas toute la boutique par ce classseur .. juste l'analytique, mais je multiplie les sauvegardes sur des suports différents : pas de crainte de ce coté.
J'en suis un peu revenu des multiples classeurs et des appels à références externes qui se synthétisent sur un seul tableau de bord : lent et sujet à plantages fréquents, d'où ma préférence pour un seul classeur, soit, qu'il faut ouvrir mais une fois ouvert ...
Alors en effet, j'ai quelques graphiques sur l'une de mes feuilles : est-il possible de faire en sortes que ces graphqiques (et uniquement ceux-ci) se mettent à jour par une commande, su un bouton par exemple (le reste des tableaux se calculant en mode auto).
et malgré tout, j'essaierais bien mon calcul en VBA histoire de voir si ça améliore ou pas.
fouding69
Messages postés10Date d'inscriptionmardi 23 octobre 2007StatutMembreDernière intervention24 novembre 2011 20 nov. 2011 à 14:52
Bonjour
Juste pour vous signaler que j'ai avantageusement réglé mon pb par cette astuce :
Je définie de manière dynamique le nbre de libre de mon tableau par la fonction NBVAL
j'inclus la fonction Indirect dans ma somme.
Ainsi, le calcul ne se fait plus tout le temps sur mes 3000 lignes (dimensionnement du tableau) mais uniquement sur ls lignes utilisées.
J'ai divisé par 10 le tps de calcul de mon classeur.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 20 nov. 2011 à 15:43
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("J4") = 10 Then Call Tricont
End If
End Sub
C'est tout de même incroyable, un tel niveau (ce sont les rudiments eux-mêmes qui font ici défaut)
Et même copier/coller t'est impossible ?
Ce n'est pas sérieux !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018219 20 nov. 2011 à 15:44
Oui ...
et c'est Then Tricont (sans le call)
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient