IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Reduction du temps de traitement [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Reduction du temps de traitement
    Bonjour à tous,

    Je débute en VBA et je suis arrivé à la limite de mes compétences. J’ai construis avec l’aide de la communauté un fichier qui me permet de construire des variables synthétiques avec le test Brown.Forsythe. Le problème est qu’il faut plus d’une heure de traitement ce qui me parait vraiment très long.
    Si une âme charitable pouvait me trouver une astuce ou me donner une piste pour réduire le temps de travail je suis preneur.
    Je suppose que la raison de cette lenteur est le fait que j’associe du VBA et des formules Excel que je n’arrive pas à transcrire totalement en VBA.
    Le plus important dans ce fichier est le résultat final des tableaux (BY1 :CL2) et (BY20 :BZ79), le reste des tableaux n’est qu’accessoire.

    Merci par avance
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En parcourant en vitesse le code, j'aurais tendance à abandonner le Copy/PAsteSpecial par un remplissage direct par égalité. Cela ira beaucoup plus vite.
    Un petit exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Dim shtFrom As Worksheet, shtTo As Worksheet
     With ThisWorkbook
      Set shtTo = .Worksheets("Feuil1")
      Set shtFrom = .Worksheets("A")
     End With
     shtTo.Range("A20:J20").Value = shtFrom.Range("T20:AC20").Value
    Il y a sûrement d'autres choses à faire mais j'ai lu très rapidement.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une autre chose à faire c'est de bloquer le recalcul automatique pendant que la macro fonctionne parce-que j'ai vu qu'il y a construction de formules dans ce code et qu'évidemment cela oblige Excel à effectuer le calcul de ces fonctions.
    Eventuellement désactiver la mise à jour de l'écran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Dim CalculMode As Long
     With Application
     .ScreenUpdating = False
     CalculMode = .Calculation
     .Calculation = xlCalculationManual
     End With
     ' ..... Le Code
     ' .....
     With Application
     .Calculation = CalculMode
     .ScreenUpdating = True
     End With
    Attention que si le résultat de formules créées dynamiquement pendant l'exécution doit servir lors d'un "copier/Coller" il faut forcer le recalcul.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Re,
    Merci pour les réponses,

    J’ai de quoi bosser pour avancer maintenant. Les tutos sont formidables a conditions de savoir quoi chercher.

    Merci encore pour vous être penché sur mon problème

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Re,
    Bonjour à tous,

    Je reviens vers vous aujourd’hui parce que je convaincu de la rapidité de traitement grâce aux tableaux. Cependant après une nuit blanche et plusieurs litres de café noir je n’arrive toujours pas a une ombre de début de code.
    Si vous pouviez me donner une piste pour la déclaration de mes variables sous forme de tableau j’aurai de quoi bosser sur du concret.

    Merci par avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Sub Macro2()
    Deb = Timer
       Application.ScreenUpdating = False
     
      For i = 1 To 2
        decal = 14 * i
        Sheets("A").Range("F20:S79").Offset(0, decal).Copy
        Sheets("1").Activate
        Range("A20").PasteSpecial Paste:=xlPasteValues
     
    TestABC
     
        Range("BA20:BA79").Copy
        Range("BX20").Offset(0, i).PasteSpecial Paste:=xlPasteValues
        Range("BE17:BR17").Copy
        Range("BY1").Offset(i - 1, 0).PasteSpecial Paste:=xlPasteValues
      Next i
      Application.ScreenUpdating = True
     MsgBox "J'ai bossé " & Timer - Deb & " seconde"
    End Sub
     
    Sub TestABC()
     
    'Deb = Timer
     '  Application.ScreenUpdating = False
    Dim A As Long, X As Integer, Str_Val_1 As String, Cel As Range
    For X = 1 To 14
        Select Case X
            Case 1
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R"
                Set Cel = Range("BE1")
            Case 2
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R"
                Set Cel = Range("BF1")
            Case 3
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R"
                Set Cel = Range("BG1")
            Case 4
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R"
                Set Cel = Range("BH1")
            Case 5
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R"
                Set Cel = Range("BI1")
            Case 6
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R17C61)+SIN(RC[-47]/R"
                Set Cel = Range("BJ1")
            Case 7
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R17C61)+SIN(RC[-47]/R17C62)+2*SIN(RC[-46]/R"
                Set Cel = Range("BK1")
            Case 8
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R17C61)+SIN(RC[-47]/R17C62)+SIN(RC[-46]/R17C63)+SIN(RC[-45]/R"
                Set Cel = Range("BL1")
            Case 9
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R17C61)+SIN(RC[-47]/R17C62)+SIN(RC[-46]/R17C63)+SIN(RC[-45]/R17C64)+SIN(RC[-44]/R"
                Set Cel = Range("BM1")
            Case 10
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R17C61)+SIN(RC[-47]/R17C62)+SIN(RC[-46]/R17C63)+SIN(RC[-45]/R17C64)+SIN(RC[-44]/R17C65)+SIN(RC[-43]/R"
                Set Cel = Range("BN1")
            Case 11
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R17C61)+SIN(RC[-47]/R17C62)+SIN(RC[-46]/R17C63)+SIN(RC[-45]/R17C64)+SIN(RC[-44]/R17C65)+SIN(RC[-43]/R17C66)+SIN(RC[-42]/R"
                Set Cel = Range("BO1")
            Case 12
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R17C61)+SIN(RC[-47]/R17C62)+SIN(RC[-46]/R17C63)+SIN(RC[-45]/R17C64)+SIN(RC[-44]/R17C65)+SIN(RC[-43]/R17C66)+SIN(RC[-42]/R17C67)+SIN(RC[-41]/R"
                Set Cel = Range("BP1")
            Case 13
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R17C61)+SIN(RC[-47]/R17C62)+SIN(RC[-46]/R17C63)+SIN(RC[-45]/R17C64)+SIN(RC[-44]/R17C65)+SIN(RC[-43]/R17C66)+SIN(RC[-42]/R17C67)+SIN(RC[-41]/R17C68)+SIN(RC[-40]/R"
                Set Cel = Range("BQ1")
            Case 14
                Str_Val_1 = "=RC[-1]+SIN(RC[-52]/R17C57)+SIN(RC[-51]/R17C58)+SIN(RC[-50]/R17C59)+SIN(RC[-49]/R17C60)+SIN(RC[-48]/R17C61)+SIN(RC[-47]/R17C62)+SIN(RC[-46]/R17C63)+SIN(RC[-45]/R17C64)+SIN(RC[-44]/R17C65)+SIN(RC[-43]/R17C66)+SIN(RC[-42]/R17C67)+SIN(RC[-41]/R17C68)+SIN(RC[-40]/R17C69)+SIN(RC[-39]/R"
                Set Cel = Range("BR1")
     
        End Select
        For A = 20 To 29
     
            Range("BA20").FormulaR1C1 = Str_Val_1 & A & "C56)"
            Range("BA20").AutoFill Destination:=Range("BA20:BA79"), Type:=xlFillDefault
     
        Range("BA12").Copy
            Cel.Offset(A - 1, 0).PasteSpecial Paste:=xlPasteValues
        Next A
    Next X
      ' Application.ScreenUpdating = True
    ' MsgBox "J'ai bossé " & Timer - Deb & " seconde"
    End Sub

  6. #6
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    Une fois compris comment ça marche, ça va mieux, il faut arriver à se représenter la chose :

    Optimisation du code avec les variables tableau sous Excel

    cordialement,

    Didier

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 124
    Par défaut
    Bonjour,

    tu peux transférer le contenu de tes feuilles dans des variables tableau à 2 dimensions. Les gains en performances seront très significatifs.

    Un lien utile :

    http://silkyroad.developpez.com/vba/tableaux/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation JProgressBar & temps de traitement incconu
    Par greg1602 dans le forum Composants
    Réponses: 22
    Dernier message: 30/11/2005, 20h52
  2. [Tableaux] Temps de traitement ... affichage de page
    Par mathieu77186 dans le forum Langage
    Réponses: 37
    Dernier message: 25/10/2005, 17h45
  3. [MySql] temps de traitement interminable
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 8
    Dernier message: 08/07/2005, 15h14
  4. [Perf]Utilisation des Logger et temps de traitement ?
    Par elitost dans le forum Logging
    Réponses: 6
    Dernier message: 12/04/2005, 23h13
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo