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 Module

Alors 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 Sub

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.

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 Sub

eric

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.

Rechercher des sujets similaires à "programme 15x lent 2013 compare 2010"