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 :

Améliorer vitesse de calcul d'une macro simple [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Tchad

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Par défaut Améliorer vitesse de calcul d'une macro simple
    Bonjour,

    J'ai un système de gestion qui gère l'ensemble de l'activité. Je n'ai pas vraiment de problème, tout fonctionne correctement.
    En revanche je suis à la recherche d'efficacité et de rapidité.
    Sur une de mes fonctionnalités, j'effectue un calcul de temps de service.
    Ci dessous le code:

    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
     
    Private Sub Generate_Click()
     
    Dim FC As Worksheet
    Dim DT As Worksheet
    Dim FP As Workbook
    Dim ML As Worksheet
    Dim FD As Workbook
    Dim dat As Worksheet
     
     
    Dim l As Variant
    Dim c As Variant
    Dim d As Variant
    Dim li As Long
     
    Dim r As Long
    Dim cn As Variant
    Dim tri As Variant
    Dim ro As Long
    Dim lig As Long
    Dim mln As Variant
    Dim nam As Variant
    Dim col As Long
     
     
     
    Set FC = Sheets("flight control")
    Set DT = Sheets("data fdp")
     
    c = FC.Range("E5").Value
     
        l = FC.Range("A49:A5000").End(xlUp).Row + 1
     
        For r = DT.Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
     
        If FC.Range("E5") = DT.Range("A" & r) Then
     
        FC.Range("A" & l) = DT.Range("A" & r)
        FC.Range("B" & l) = DT.Range("B" & r)
        FC.Range("C" & l) = DT.Range("C" & r)
        FC.Range("D" & l) = DT.Range("D" & r)
        FC.Range("E" & l) = DT.Range("E" & r)
        FC.Range("F" & l) = DT.Range("F" & r)
        FC.Range("G" & l) = DT.Range("G" & r)
        FC.Range("H" & l) = DT.Range("H" & r)
        FC.Range("I" & l) = DT.Range("I" & r)
     
        l = l + 1
     
     
        End If
     
        Next r
     
    tri = FC.Range("E5").Value
     
    Set cn = Range("O3:O100").Find(tri)
    ro = cn.Row
     
    FC.Range("D3") = FC.Range("M" & ro).Value
     
     
     
    Set FD = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & "flight data.xlsm")
    Set nam = Workbooks("Flight data").Sheets("data").Range("BX3:BX50").Find(FC.Range("E5"))
    col = nam.Row
    Set dat = Sheets("data")
     
        If dat.Range("BX" & col).Value = FC.Range("E5") Then
        FC.Range("C27") = dat.Range("BZ" & col).Value
        FC.Range("C28") = dat.Range("CA" & col).Value
        FC.Range("H28") = dat.Range("BY" & col).Value
        FC.Range("E20") = dat.Range("CD" & col).Value
        FC.Range("B20") = dat.Range("CF" & col).Value
     
     
    End If
     
    FD.Close savechanges:=True
     
    End Sub
    La ligne 34 fait que le calcul est long, car parcourant toutes les lignes à la recherche de la condition. Pour moi ce temps est acceptable, il faut compter 5 secondes, mais pour les opérateurs qui ils trouvent que cela est un peu long.

    J'ai donc essayé de modifier le code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For r = DT.Range("A1:A5000").End(xlUp).Row To 1 Step -1
    Cela a très bien fonctionné, ils sont devenus contents car le calcul était pratiquement instantané...et pour cause cela ne calcul pas.

    Ma question est donc la suivante: quelle méthode permettrait de remplacer cette ligne permettant de gagner en performance sans pour autant tout réécrire? Ce n'est pas que je ne veux pas refaire mais j'estime que quand une solution fonctionne, c'est bien d'améliorer mais il ne faut pas que le temps gagné d'un côté soit perdu de l'autre, sachant que cela n'est pas mon métier de faire du code.

    Merci de votre retour et bonne journée.

  2. #2
    Invité de passage
    Homme Profil pro
    Automation and IT Bid manager
    Inscrit en
    Août 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Automation and IT Bid manager
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2017
    Messages : 1
    Par défaut Screenupdating
    Salut,

    As-tu essayé avec en début de Sub :

    Application.screenupdating=False??

  3. #3
    Membre actif
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Tchad

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Par défaut
    Salut,

    En fait je l'ai sur l'autre macro qui appelle celle là, je l'ai rajouté et ca fait pareil.

    Merci pour le conseil en tout cas.

  4. #4
    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
    Bonjour
    Intéresse-toi à la méthode Range.Find (rubrique Range.Find, méthode de ton aide interne VBA) beaucoup plus rapide que de parcourir en boucle.
    Je me demande à ce propos quelle peut bien être l'utilité de la parcourir de bas en haut, puisque tu ne modifies pas la numérotation des lignes (ni ajout, ni suppression)

  5. #5
    Membre actif
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Tchad

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Par défaut
    Rebonjour,

    J'ai trouvé ma solution, j'ai simplement défini le nombre de lignes comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Nblig = DT.Cells(5000, 1).End(xlUp).Row
     
     For r = 1 To Nblig
    Merci MarcL pour le tri, j'avais commencé comme ça, je les réessayé mais cela ne me conviens pas. En effet si je fais ça cela m'oblige à appliquer des formules sur toutes mes lignes alors qu'ici je ne le fais que sur les lignes sélectionnées. Cela me fait gagner du poids de fichier. Mais cela ne se voit pas dans ce que je vous ai exposé, désolé je n'ai pas tout mis par souci de clarté.

    Merci unparia, j'ai essayé de modifier avec .find, mais comme je n'ai pas trop le temps ma solution me va bien. En revanche je l'utilise dans d'autres endroits et il est vrai qu'elle est plus rapide et certainement plus adaptée. Pour le xlup, évidemment il est plus logique en xldown, surtout que je traite les données les plus récentes, donc ajoutées en dernier. Je ne l'ai pas corrigé sur le code ci dessus mais ce sera fait sur mon fichier.

    Merci encore pour l'aide et bonne journée,

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par romainorleans Voir le message
    En effet si je fais ça cela m'oblige à appliquer des formules sur toutes mes lignes
    Et non ‼  Comme pourtant clairement indiqué tant dans le tutoriel comme dans l'aide d'Excel …
    Une unique formule et temporaire qui plus est, donc n'augmente en rien le poids du classeur
    et sans boucle et plus rapide que ton code actuel; pour preuve les nombreux exemples dans les discussions de ce forum !
    En suivant le tutoriel, s'entrainer déjà manuellement, souvent un code est inutile quand c'est ponctuel !
    Une fois compris ce B-A-BA d'Excel, si vraiment besoin de l'automatiser, moins de dix lignes de code sont nécessaires …

  7. #7
    Membre actif
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Tchad

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Par défaut
    Merci Marc, mais je crois que l'on ne parle pas de la même chose. Mon fichier fait bien plus que d'importer des données.
    Ces données sont soit traitées par Excel classique, soit par VBA.
    Et à moins qu'il soit possible sur 5000 lignes de conditionner l'application d'une formule à de multiples conditions, et dans ce cas cela passerait par du VBA, je suis obligé de tout traiter.
    Concernant le filtre avancé je sais le faire ce n'est pas le problème. Le problème est de l'appliquer à chaque ouverture et ensuite de copier les données vers une autre feuille.
    Comme je l'ai dit je ne dis pas que mon code est parfait mais il fonctionne très bien comme ça et je n'ai pas le temps - pour le moment - de revenir dessus. Je cherchais simplement à contenter les utilisateurs de quelques secondes de calcul, ce qui est fait.
    Je partagerais bien le dossier avec toi mais j'ai lu le post s'y afférant...et la plupart de vos signatures donc je m'abstient.

    Bref merci pour les conseils que je prends volontiers, et crois moi j'essaye de me documenter avant de venir je ne suis pas qu'un consommateur. Quelque fois il est aussi simple de poser simplement la question sur la route empruntée; là j'ai compris qu'elle n'est pas bonne, j'y remédierai...

    Merci encore et bonne soirée,

  8. #8
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par romainorleans Voir le message
    quelle méthode permettrait de remplacer cette ligne permettant de gagner en performance sans pour autant tout réécrire?
    Bonjour, justement le problème est là car vu la méthode employée - la boucle - il n'y a pas d'alternative
    à part travailler en mémoire avec une variable tableau contenant les données (cf tutoriels du forum).
    (ou encore via la méthode Find évoquée ci-dessous …)

    Pourtant c'est simple avec le B-A-BA d'Excel et sans boucle comme par exemple via un filtre avancé (là aussi voir le tutoriel) …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

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

Discussions similaires

  1. Améliorer vitesse de chargement d'une MasterPage
    Par amamildor dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 29/11/2009, 17h47
  2. [XL-2003] Accélerer le calcul d'une macro
    Par Yvanou dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 31/08/2009, 15h46
  3. [A-00] pb de calcul sur une requete simple
    Par secretaire59 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/10/2008, 10h50
  4. Mémoire Insuffisante pour une macro simple
    Par ted the Ors dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 08/09/2008, 12h02
  5. macro pour calculer la vitesse d'execution d'une macro
    Par victorzecat dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/12/2007, 14h34

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