Bonjour,

Envoyé par
elbe06
Merci pour votre réponse.
Cela n'est pas dans l'accès à la base que le temps est long, mais dans les calculs des formules une fois les données copiées dans la feuille.
Il y a plusieurs zones de la feuille qui contiennent des formules :
Mais le problème se situe quand je crée la 2e feuille, j'ai l'impression que le document Excel est recalculé de nombreuses fois, beaucoup que plus que pour la 1ére, alors que les données sont de même taille.
J'ai essayé EnableCalculation à false pendant la définition des zones et à true pour le calcul mais cela ne change rien.
Je ne suis pas un expert en C# et je ne connais pas MySQL; mais je connais (au moins un peu) Excel. J'ai l'impression que tu affrontes les limites d'Excel. Excel est un bien gentil garçon très (trop) polyvalent, mais il a une faiblesse : il doit avoir tout le classeur en mémoire vive pour travailler. Puisque la première feuille semble bien se passer et que la seconde passe mal, cela me fait penser à un problème de mémoire vive disponible insuffisante, d'autant plus qu'une formule qui travaille sur des tableaux prend également beaucoup de mémoire. Cela veut donc dire qu'Excel est en compétition avec tous les programmes qui s'exécutent en mémoire vive pour garder son classeur. Cela inclut tous les services même les plus inutiles, comme la mise à jour automatique des programmes que les fabricants changent une fois par année.
Commence par jeter un œil sur la quantité de mémoire vive disponible avant de lancer ton programme et après ta première feuille. Tu devrais avoir une première indication sur les besoins en mémoire, en pensant que tu dois quand même en avoir un peu plus pour effectuer les calculs.
Ajout 16 sept 2015:
Deux autres choses que tu peux aussi regarder:
Si ce sont des choses que tu connais, mes plus plates excuses.
Tu peux éviter l'affichage dans Excel de toutes tes opérations intermédiaires et gagner du temps, souvent de manière appréciable:
En VBA cela se ferait comme ça et cela devrait se ressembler en C#, sauf qu'il faut ajouter ton objet Excel ou ton objet "addin" dans ton instruction:
Au début du processus :
application.screenupdating = false 'l'écran restera figé sur son dernier affichage
À la fin du processus :
application.screenupdating = tue ' l'affichage revient à la normale.
Également, si tu n'as pas besoin de conserver les formules, mais juste les résultats, tu peux utiliser les fonctions intrinsèques d'Excel directement dans ton code et sans les ajouter à ta feuille, en passant par WorksheetFunction et le nom de la fonction en anglais.
Par exemple, en VBA, pour mettre la somme de "A1:A10" dans "A12":
1 2 3 4 5
| Sub total()
Set myRange = Worksheets("Feuil1").Range("A1:a10")
Answer = Application.WorksheetFunction.Sum(myRange)
Range("a12").Value = Answer
End Sub |
J'ai adapté un exemple de l'aide de VBA-Excel 2010. J'ai bien essayé les vieilles méthodes pour faire plus court, mais VBA est maintenant bien capricieux, je trouve. (En principe, je devrais être content parce que plus capricieux veut dire moins passoire et plus formel, mais cela dérange mes habitudes.)
Partager