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 :

Optimisation vitesse de calcul


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 97
    Par défaut Optimisation vitesse de calcul
    Bonjour à tous, j'ai réalisé la macro ci dessous:

    Elle fonctionne parfaitement par contre son temps d’exécution est d'environ 2 minutes, c'est la boucle " For i " qui prends enormement de temps.

    Est ce qu'il y aurait une écriture différente afin d'optimiser la vitesse de calcul? Derlign vaut "221" et dercol "52".
    Et la TabBDD dispose de 55000 lignes et 51 colonnes

    Code vb : 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
    Private Sub RemplissageTableau()
    Application.ScreenUpdating = False
        Application.EnableEvents = False
        Application.Calculation = xlCalculationManual
        Dim tabBDD()
        Dim wsBDD As Object
        Dim wsResult As Object
        Dim som(9)
        Dim crit(6)
        Dim cptBDD
        Dim i, j As Long
        Set wsBDD = Worksheets("BDD")
        Set wsResult = Worksheets("Familly & Country")
        With wsBDD
            tabBDD = Range(.Cells(2, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 30)) ' Définition du tableau de travail
       End With
        With wsResult
            derlig = Cells(Rows.Count, 2).End(xlUp).Offset(0, 0).Row
            dercol = Cells(1, Cells.Columns.Count).End(xlToLeft).Offset(0, 0).Column
            For i = 2 To derlig Step 4
                For j = 4 To dercol
                    som1 = 0
                    som2 = 0
                    som3 = 0
                    som4 = 0
                    som5 = 0
                    som6 = 0
                    som7 = 0
                    som8 = 0
                    som9 = 0
                    crit2 = Sheets("Données").Cells(4, 2)  'Réel
                   crit3 = Sheets("Familly & Country").Cells(i, 1) ' Country
                   crit4 = Sheets("Familly & Country").Cells(1, j) 'Familly
                   crit5 = Sheets("Données").Cells(5, 2) 'YTD  n
                   crit6 = Sheets("Données").Cells(6, 2) 'YTD  n-1
                   For cptBDD = 1 To UBound(tabBDD, 1)
                        If (tabBDD(cptBDD, 1) = crit2) And (tabBDD(cptBDD, 30) = crit3) And (tabBDD(cptBDD, 24) = crit4) Then
                            som1 = som1 + tabBDD(cptBDD, 11) 'total1
                           som2 = som2 + tabBDD(cptBDD, 12) 'total2
                           som3 = som3 + tabBDD(cptBDD, 14) + tabBDD(cptBDD, 15) + tabBDD(cptBDD, 16) + tabBDD(cptBDD, 18) + tabBDD(cptBDD, 20) 'total3
                       ElseIf (tabBDD(cptBDD, 1) = crit5) And (tabBDD(cptBDD, 30) = crit3) And (tabBDD(cptBDD, 24) = crit4) Then
                            som4 = som4 + tabBDD(cptBDD, 11) 'total1
                           som5 = som5 + tabBDD(cptBDD, 12) 'total2
                           som6 = som6 + tabBDD(cptBDD, 14) + tabBDD(cptBDD, 15) + tabBDD(cptBDD, 16) + tabBDD(cptBDD, 18) + tabBDD(cptBDD, 20) 'total3
                       ElseIf (tabBDD(cptBDD, 1) = crit6) And (tabBDD(cptBDD, 30) = crit3) And (tabBDD(cptBDD, 24) = crit4) Then
                            som7 = som7 + tabBDD(cptBDD, 11) 'total1
                           som8 = som8 + tabBDD(cptBDD, 12) 'total2
                           som9 = som9 + tabBDD(cptBDD, 14) + tabBDD(cptBDD, 15) + tabBDD(cptBDD, 16) + tabBDD(cptBDD, 18) + tabBDD(cptBDD, 20) 'total3
                       End If
                    Next
                    .Cells(i, j) = som1 + som4 - som7 'Total 1
                   .Cells(i + 1, j) = (som2 + som5 - som8) 'Total 2
                   .Cells(i + 2, j) = ((som3 + som6 - som9) * -1) 'Total 3
                   If (som2 + som5 - som8) <= 0 Then
                        .Cells(i + 3, j) = 0
                    Else
                        .Cells(i + 3, j) = ((som3 + som6 - som9) * -1) / (som2 + som5 - som8) ' %Total
                   End If
                Next
            Next
        End With
        Cells.EntireColumn.AutoFit
    Application.Calculation = xlCalculationAutomatic
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End Sub


    Merci à vous

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Est ce qu'il y aurait une écriture différente afin d'optimiser la vitesse de calcul?
    "Ecriture" ? -->> non
    Méthodes différentes ? --->> oui --->> par exemple : constituer un tableau dynamique -->> travailler sur les éléments de ce tableau --->> réinjecter les valeurs du tableau
    Tu trouveras des sources déposées concernant ce mécanismes (utilisation du moteur de recherche de ce forum).

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Tu devrais par ailleurs commencer à t'intéresser à ce que t'offrent les différentes méthodes de l'objet WorkSheetFunction, notamment en ce qui concerne la détermination de totaux

    Bref ... Je répondrais personnellement ainsi à ta question : --->> reprendre tout à zéro et dans un esprit/démarche totalement différent.

    EDIT : pour être clair et par analogie : utiliser du super 98 pour alimenter un moteur 5 CV "trèfle" (de Citroën, pour ceux qui, âgés, connaissent) ne transformera pas en bolide le véhicule doté de ce moteur. Si l'on veut un bolide, il faut également en changer le moteur lui-même.

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 97
    Par défaut
    Citation Envoyé par unparia Voir le message
    "Ecriture" ? -->> non
    Méthodes différentes ? --->> oui --->> par exemple : constituer un tableau dynamique -->> travailler sur les éléments de ce tableau --->> réinjecter les valeurs du tableau
    Tu trouveras des sources déposées concernant ce mécanismes (utilisation du moteur de recherche de ce forum).
    Dans mon code, je passe déjà par un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     tabBDD = Range(.Cells(2, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 30))
    ce n'est pas de ça que tu veux parler?

    Peux tu me montrer la démarche pour construire le code que tu essayes de m'expliquer ?

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ce n'est pas de "cela" (ce tableau-là), dont je veux parler, mais de ce genre-là
    Si tu le "cernes", il est à appliquer ailleurs également dans ton code.
    Notamment tout ce qui est dans ton bloc :

  6. #6
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 97
    Par défaut
    Il faudrait que je renseigne "Wsresult" comme tableau comme pour "TabBDD"

    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     With wsBDD
            tabBDD = Range(.Cells(2, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 30)) ' Définition du tableau de travail
       End With
     
     
        With wsResult
           tabBDD2 = Range(.Cells(2, 4), .Cells(.Cells(Rows.Count, 2).End(xlUp).Row, Cells(1, Cells.Columns.Count).End(xlToLeft).Offset(0, 0).Column))

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Si tu veux ...
    Mais il te faut ensuite t'en servir ! C'est là, l'essentiel : t'en servir !
    Je crois que je vais maintenant te laisser. On ne peut transformer une discussion en cours complet.

Discussions similaires

  1. [XL-2010] Optimiser vitesse de calcul d'Excel
    Par sena1911 dans le forum Excel
    Réponses: 6
    Dernier message: 14/09/2017, 13h06
  2. Optimisation Vitesse d'Exécution Calcul matriciel
    Par olivier21c dans le forum Langage
    Réponses: 33
    Dernier message: 02/09/2011, 11h46
  3. [XL-2007] Optimiser la vitesse de calcul
    Par Automnep dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/05/2011, 10h55
  4. Optimisation vitesse pure
    Par Kujara dans le forum C++
    Réponses: 44
    Dernier message: 15/10/2007, 14h47
  5. optimisation vitesse
    Par WaM dans le forum C
    Réponses: 7
    Dernier message: 09/01/2006, 23h43

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