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 de macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 45
    Par défaut Optimisation de macro
    Bonjour tout le monde !

    Je souhaiterai votre avis sur une macro que j'ai faite. Je suis convaincu qu'elle n'est absolument pas optimisée et d'ailleurs elle met environ 2 minutes pour s'executer. Bon après celle-ci doit traiter un tableau d'environ 100 colonnes sur 60000 lignes...(petit fichier de 35 Mo)

    Je suis ouvert à toute critique qui pourrait me permettre de m'améliorer et d'améliorer ma macro

    Je vous remercie par avance si vous jetez un coup d'oeil à la macro et que vous pouvez m'apporter votre contribution !

    Bonne journée à vous la communauté

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    Sub Donnees()
     
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
     
    Dim Source As String
    Dim Cible As String
    Dim Col As Long 'col pour la commune
    Dim Col2 As Long 'col pour la superficie des constructions
    Dim Col3 As Long 'col pour le type en habitation
    Dim Col4 As Long 'col pour le type de construction (maison ou appartement)
    Dim Col5 As Long 'col pour le nombre de nouvelles contructions
    Dim Col6 As Long 'col pour l'année de construction
    Dim Col7 As Long 'col pour le nombre de nouvelles maisons
    Dim Col8 As Long 'col pour le nombre de nouveaux appartements
    Dim Ligne As Long
    Dim Ligne2 As Long
    Dim DernLigne As Long
    Dim DernLigne2 As Long
    Dim DernCol As Long
     
    Dim SomSup As String
    Dim SomNewConsM As String
    Dim SomNewConsA As String
    Dim SomNewConsMi As String
    Dim SomNewConsDep As String
    Dim SomNewConsAct As String
    Dim SomSupNewCons As String
     
    Source = "source"
    Cible = "tableau"
    DernLigne = Sheets(Source).Range("A" & Rows.Count).End(xlUp).Row
    DernLigne2 = Sheets(Cible).Range("A" & Rows.Count).End(xlUp).Row
    DernCol = Sheets(Source).Cells(1, Columns.Count).End(xlToLeft).Column
    Ligne2 = 3
     
     
    For Col = 1 To DernCol
        If Sheets(Source).Cells(1, Col).Value = "idcomtxt" Then Exit For 'trouve la colonne de la commune
    Next
     
    For Col2 = 1 To DernCol
        If Sheets(Source).Cells(1, Col2).Value = "dcntpa" Then Exit For 'trouve la colonne de la superficie
    Next
     
    For Col3 = 1 To DernCol
        If Sheets(Source).Cells(1, Col3).Value = "tpevdom_s" Then Exit For 'trouve le type de construction en habitation
    Next
     
    For Col4 = 1 To DernCol
        If Sheets(Source).Cells(1, Col4).Value = "tlocdomin" Then Exit For 'trouve la colonne du type de construction en appart ou maison ou mixte ou dépendance ou activité
    Next
     
    For Col5 = 1 To DernCol
        If Sheets(Source).Cells(1, Col5).Value = "nlochabit" Then Exit For 'trouve la colonne nombre de construction nouvelles
    Next
     
    For Col6 = 1 To DernCol
        If Sheets(Source).Cells(1, Col6).Value = "jannatmin" Then Exit For 'trouve la colonne de la date de construction
    Next
     
    For Col7 = 1 To DernCol
        If Sheets(Source).Cells(1, Col7).Value = "nlocmaison" Then Exit For 'trouve la colonne de nombre de maisons nouvelles
    Next
     
    For Col8 = 1 To DernCol
        If Sheets(Source).Cells(1, Col8).Value = "nlocappt" Then Exit For 'trouve la colonne de nombre d'appartements nouveaux
    Next
     
    'MsgBox ("Col1 " & Col & " ; Col2 " & Col2 & " ; Col3 " & Col3 & " ; Col4 " & Col4 & " ; Col5 " & Col5 & " ; Col6 " & Col6)
     
    For Ligne2 = 3 To DernLigne2
        SomSup = 0
        SomNewConsM = 0
        SomNewConsA = 0
        SomNewConsMi = 0
        SomNewConsDep = 0
        SomNewConsAct = 0
        SomSupNewCons = 0
     
        For Ligne = 2 To DernLigne
            If Sheets(Cible).Cells(Ligne2, 1) = Sheets(Source).Cells(Ligne, Col) Then 'correspondance des communes
     
                If Sheets(Source).Cells(Ligne, Col5) = "" Then      'on calcule nlochabit en faisant la somme de nlocmaison + nlocappt
                    Sheets(Source).Cells(Ligne, Col5) = Sheets(Source).Cells(Ligne, Col7).Value + Sheets(Source).Cells(Ligne, Col8).Value
                End If
     
                If Sheets(Source).Cells(Ligne, Col5) > 0 Then                           'calcul du SomSup
                    If Sheets(Source).Cells(Ligne, Col3) = "HABITATION" Then
                        If Sheets(Source).Cells(Ligne, Col2) < 10000 Then
                            SomSup = SomSup + Sheets(Source).Cells(Ligne, Col2).Value
                        End If
                    End If
                End If
     
     
                If Sheets(Source).Cells(Ligne, Col6) >= 1999 Then                   'calcul des somnewcons
                    If Sheets(Source).Cells(Ligne, Col3) = "HABITATION" Then
     
                        If Sheets(Source).Cells(Ligne, Col4) = "MAISON" Then
                            SomNewConsM = SomNewConsM + 1
                            SomSupNewCons = SomSupNewCons + Sheets(Source).Cells(Ligne, Col2).Value
                        End If
                        If Sheets(Source).Cells(Ligne, Col4) = "APPARTEMENT" Then
                            SomNewConsA = SomNewConsA + 1
                            SomSupNewCons = SomSupNewCons + Sheets(Source).Cells(Ligne, Col2).Value
                        End If
                        If Sheets(Source).Cells(Ligne, Col4) = "MIXTE" Then
                            SomNewConsMi = SomNewConsMi + 1
                            SomSupNewCons = SomSupNewCons + Sheets(Source).Cells(Ligne, Col2).Value
                        End If
                        If Sheets(Source).Cells(Ligne, Col4) = "DEPENDANCE" Then
                            SomNewConsDep = SomNewConsDep + 1
                            SomSupNewCons = SomSupNewCons + Sheets(Source).Cells(Ligne, Col2).Value
                        End If
                        If Sheets(Source).Cells(Ligne, Col4) = "ACTIVITE" Then
                            SomNewConsAct = SomNewConsAct + 1
                            SomSupNewCons = SomSupNewCons + Sheets(Source).Cells(Ligne, Col2).Value
                        End If
                    End If
                End If
     
            End If
        Next
        Sheets(Cible).Cells(Ligne2, 2) = SomSup                                         'place les valeurs calculées dans le tableau
        Sheets(Cible).Cells(Ligne2, 3) = SomNewConsM
        Sheets(Cible).Cells(Ligne2, 4) = SomNewConsA
        Sheets(Cible).Cells(Ligne2, 5) = SomNewConsMi
        Sheets(Cible).Cells(Ligne2, 6) = SomNewConsDep
        Sheets(Cible).Cells(Ligne2, 7) = SomNewConsAct
        Sheets(Cible).Cells(Ligne2, 8) = SomSupNewCons
    Next
     
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    End Sub
    PS : je viens de recréer ce post ici, car je ne sais pas si le premier post (identique en tous points) était dans la bonne section du forum.. Désolé pour le doublon

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    oulalah!!! 35 MO tu dis???!!!!!
    ca c'est déjà un problème pour le pauvre petit excel que tu utilise c'est même rédhibitoire( tout bonnement impensable)
    ensuite sans aller dans les détails je vois que tu fait 36 fois la même boucle sur différente ligne s
    tu peut très bien le faire en une
    mais dans tout les cas le poids de ton fichier va te créer des soucis alehatoirement selon l'uc dispos de ton PC
    c'est donc a mon sens inutile d'aller plus loin dans le développement de ton fichier si tu compte rester dans cet accabit
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 45
    Par défaut
    Bonjour !

    Merci pour la réponse !

    C'est bien aussi ce que je me disais

    Du coup ce que j'ai fait, car au final je n'ai besoin d'exploiter que 6 colonnes du tableau pour ce traitement, c'est de supprimer par une autre macro toutes les colonnes dont je n'ai pas besoin pour le tri des données, histoire de faire galérer un peu moins le pc qui va utiliser ça

Discussions similaires

  1. [XL-2003] Optimiser une macro VBA
    Par momo93240 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/07/2011, 16h46
  2. [XL-2000] Optimisation de macro
    Par kev159 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/09/2010, 11h05
  3. [XL-2003] Optimisation de macro travaillant sur d'autres classeurs
    Par diude54 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 06/09/2009, 09h35
  4. [XL-2003] Optimiser une macro de mise en forme d'un Tableau
    Par mouncefdi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/04/2009, 12h19
  5. Optimiser une macro
    Par PiliSql dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 20/05/2008, 20h18

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