Programme 15x plus lent en Excel 2013 comparé à 2010
Bonjour,
Actuellement j'ai toutes mes exportations de fichier .xls, initialement générer en Excel 2010, on vu leur temps démultiplier sous Excel 2013.
A savoir que mon langage de programmation est Progress (ABL) mais que j'ai pu reproduire mon problème en VB.
En générale les programmes concerné récupère les données de la bdd les stock dans une table temporaire, puis cette dernière est parcouru dans sont intégralité puis j'ajoute la valeur voulu dans la bonne cellules en utilisant soit la méthode .cells ou .range
Du coup voici un exemple le plus épuré possible où le ralentissement s'effectue sur l'instruction ws.Cells(i, j) = 5646.
Imports Microsoft.Office.Interop
Module Module1
Sub Main()
'Déclaration des variables
Dim xls As Excel.Application 'Application Excel
Dim wb As Excel.Workbook 'Classeur Excel
Dim ws As Excel.Worksheet 'Feuille Excel
Dim i As Integer
Dim j As Integer
i = 1
xls = CreateObject("Excel.Application")
wb = xls.Workbooks.Open("C:\gpi\test_vb.xlsx")
ws = wb.Worksheets(1)
Do While i < 100
j = 1
Do While j < 12
ws.Cells(i, j) = 5646
j = j + 1
Loop
i = i + 1
Loop
xls.Visible = True
End Sub
End ModuleAlors certes c'est une insertion cellule par cellule (d'où la boucle) et il y a surement mieux à faire, cependant cela n'explique pas pourquoi si j’exécute ce programme avec Excel 2010 il se termine en 10 secondes contre plus d'une minutes en Excel 2013.
Egalement j'ai testé cette boucle en VBA macro sous Excel 2013, le traitement est instantané.
Comme si par défaut il y aurait un paramétrage pour "limité quelque chose", je dis ça parce qu'en bouclant 150 000x (au lieu des 100) le script se lance et génère une erreur "dépassement de capacité" et arrête l'inscription à la ligne 32 767.
Parce que même s'il n'y a pas l'ouverture de document à faire, le traitement aurait du être de environ de même durée entre la macro et le programme extérieur.
En espérant que quelqu’un aurait une explication et solution
cordialement
Bonjour,
Déclare tes variables en 'Long' ald 'Integer'.
Cdlt.
Bonjour,
Déclare tes variables en 'Long' ald 'Integer'.
Merci, mais celà explique seulement l'erreur de capacité que j'ai sur la marcro. Dans le code test VB l'entier ne dépasse pas 100 lignes et coté prod mes éditions ne dépasse pas les 2000 lignes.
Mais je continue à croire qu'il a un paramètres par défaut (une commande à rajouter dans mes programme) qui désactive quelques chose, une propriété propre à la version 2013 d'excel !
Un peu comme ces instruction Application.ScreenUpdating = False Application.Calculation = xCalculationManual pour accélérer considérablement le traitement et ça marche, pour Excel 2013 ET 2010, de l’ordre de 4x plus rapide. Mais il y a toujours une exécution 15x plus longue en XL2014 .
Re,
Sans grande conviction
Imports Microsoft.Office.Interop
Module Module1
Sub Main()
'Déclaration des variables
Dim xls As Excel.Application 'Application Excel
Dim wb As Excel.Workbook 'Classeur Excel
Dim ws As Excel.Worksheet 'Feuille Excel
Dim i As Long, j As Long
set xls = CreateObject("Excel.Application")
set wb = xls.Workbooks.Open("C:\gpi\test_vb.xlsx")
set ws = wb.Worksheets(1)
xls.visible=msoTrue
Application.ScreenUpdating=False
i = 1
Do While i < 100
j = 1
Do While j < 12
ws.Cells(i, j) = 5646
j = j + 1
Loop
i = i + 1
Loop
Set ws=Nohing
Set wb=Nothing
set xls=Nothing
End Sub
End Module
Re,
Sans grande conviction
Imports Microsoft.Office.Interop
Module Module1
Sub Main()
'Déclaration des variables
Dim xls As Excel.Application 'Application Excel
Dim wb As Excel.Workbook 'Classeur Excel
Dim ws As Excel.Worksheet 'Feuille Excel
Dim i As Long, j As Long
set xls = CreateObject("Excel.Application")
set wb = xls.Workbooks.Open("C:\gpi\test_vb.xlsx")
set ws = wb.Worksheets(1)
xls.visible=msoTrue
Application.ScreenUpdating=False
i = 1
Do While i < 100
j = 1
Do While j < 12
ws.Cells(i, j) = 5646
j = j + 1
Loop
i = i + 1
Loop
Set ws=Nohing
Set wb=Nothing
set xls=Nothing
End Sub
End Module
Bonsoir,
une autre proposition
Sub Main()
'Déclaration des variables
Dim xls As Excel.Application 'Application Excel
Dim wb As Excel.Workbook 'Classeur Excel
Dim ws As Excel.Worksheet 'Feuille Excel
Dim i As Long, j As Long
Set xls = CreateObject("Excel.Application")
Set wb = xls.Workbooks.Open("E:\test_vb.xlsx")
Set ws = wb.Worksheets(1)
Application.ScreenUpdating = False
i = 100
j = 12
ws.Range(ws.Cells(1, 1), ws.Cells(i, j)) = 5646
Set ws = Nothing
'wb.save
Set wb = Nothing
Set xls = Nothing
End SubD'abord je me suis planté dans l'évaluation des temps, j'utilisait une VM, avec pourtant les même caractéristique que mon PC , pour faire mes test en Excel 2013 en comparant avec mon poste local en Excel 2010, mais après avoir instalé Excel 2013 en local l’écart est plutôt 2x plus long que 15x, n'empêche que c'est toujours un problème.
la valeur que j’insère ici est juste là pour testé mais en prod c'est une table tempo que je parcourt et donc les données sont rarement identique d'où l'insertion cellule par cellule du coup ceci
ws.Range(ws.Cells(1, 1), ws.Cells(i, j)) = 5646
est plus rapide sauf qu'en vrai j'ai pas la même valeur à remplir sur l'ensemble du fichier.
Application.ScreenUpdating=False
fait gagné un peu de temps (que ce soit Office 2010 ou 2013), faut bien pensé à la repassé à true en fin de programme
malgré ça je suis encore loin des temps d’exécution d'excel 2010 ...
Bonjour,
D'abord je me suis planté dans l'évaluation des temps, j'utilisait une VM, avec pourtant les même caractéristique que mon PC , pour faire mes test en Excel 2013 en comparant avec mon poste local en Excel 2010, mais après avoir instalé Excel 2013 en local l’écart est plutôt 2x plus long que 15x, n'empêche que c'est toujours un problème.
Que signifie VM?
Bonjour à tous,
une autre à tester :
Sub Main()
'Déclaration des variables
Dim xls As Excel.Application 'Application Excel
Dim wb As Excel.Workbook 'Classeur Excel
Dim ws As Excel.Worksheet 'Feuille Excel
Dim i As Long
Dim j As Long
Dim datas() As Double
i = 1
xls = CreateObject("Excel.Application")
wb = xls.Workbooks.Open("C:\gpi\test_vb.xlsx")
ws = wb.Worksheets(1)
ReDim datas(1 To 99, 1 To 11)
Do While i < 100
j = 1
Do While j < 12
datas(i, j) = 5646
j = j + 1
Loop
i = i + 1
Loop
ws.[A1].Resize(UBound(datas, 1), UBound(datas, 2)) = datas
xls.Visible = True
End Suberic
Jean-Eric a écrit :Bonjour,
D'abord je me suis planté dans l'évaluation des temps, j'utilisait une VM, avec pourtant les même caractéristique que mon PC , pour faire mes test en Excel 2013 en comparant avec mon poste local en Excel 2010, mais après avoir instalé Excel 2013 en local l’écart est plutôt 2x plus long que 15x, n'empêche que c'est toujours un problème.
Que signifie VM?
VM, signifie machine virtuelle (Virtual Machine). ce logiciel permet de faire tourner plusieurs instances d'un OS (windows, linux, ...) sur un même hardware.