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 :

Accélérer le code suivant [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 684
    Par défaut Accélérer le code suivant
    Hello tous,

    je suis frustré avec un bout de code simplissime, mais dont les performances me déplaisent.

    Comme je n'arrive pas à tourner en dessous de la seconde pour faire le traitement, j'en appelle à vos idées

    Le code boucle sur les fichiers Xls contenus dans un répertoire, les mets en page et les enregistre sous un autre nom.
    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
    Sub BoucleFichiers()
        Dim Chemin As String, Fichier As String
        Dim xlwbk As Workbook
        Dim xlwsh As Worksheet
        Dim User As String
        Dim CurrentPath As String
        Dim NewPath As String
        'Définit le répertoire contenant les fichiers
        Chemin = Me.Txt_Path.Value '& "\"
        Dim xlapp As New Excel.Application
        'Boucle sur tous les fichiers xls du répertoire.
        Fichier = Dir(Chemin & "*.xls")
        'Utilisez la syntaxe suivante pour boucler sur tous les types de fichiers:
        'Fichier = Dir(Chemin & "*.*")
        xlapp.Visible = False
        xlapp.ScreenUpdating = False
        Do While Len(Fichier) > 0
            'écrit le résultat dans la fenêtre d'exécution (Ctrl+G).
            'Debug.Print "début " & Now
            If Chemin & Fichier <> ThisWorkbook.FullName Then
                Set xlwbk = xlapp.Workbooks.Open(Chemin & Fichier)
                Set xlwsh = xlwbk.Worksheets(1)
                xlwsh.Range("H:I").EntireColumn.Hidden = True
                With xlwsh.PageSetup
                    .BottomMargin = 70.8661417322835 'Application.CentimetersToPoints(2.5)
                    .FooterMargin = 36.8503937007874 'Application.CentimetersToPoints(1.3)
                    .HeaderMargin = 36.8503937007874 'Application.CentimetersToPoints(1.3)
                    .LeftMargin = 53.8582677165354 'Application.CentimetersToPoints(1.9)
                    .Orientation = xlLandscape
                    .PrintArea = "A1:O" & xlwsh.Range("K65536").End(xlUp).Row
                    .RightMargin = 53.8582677165354 'Application.CentimetersToPoints(1.9)
                    .TopMargin = 70.8661417322835 'Application.CentimetersToPoints(2.5)
                    .Zoom = False
                    .FitToPagesWide = 1
                    .FitToPagesTall = 1
                End With
                User = Replace(xlwsh.Range("B3").Value, " ", "_")
                Set xlwsh = Nothing
                CurrentPath = xlwbk.FullName
                NewPath = xlwbk.Path & "\" & Left(xlwbk.Name, 29) & User & ".xls"
                xlwbk.Save 'As xlwbk.Path & "\" & Left(xlwbk.Name, 29) & User & ".xls"
                xlwbk.Close True
                Name CurrentPath As NewPath
                'Debug.Print Chemin & Fichier
                'Debug.Print "fin " & Now
            End If
            Fichier = Dir()
        Loop
        xlapp.ScreenUpdating = True
        xlapp.Quit
    End Sub
    des idées SVP ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel (3e édition)
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    Dim xlapp As New Excel.Application
    ..
    pourquoi lancer une application excel supplémentaire ?

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 684
    Par défaut
    J'avais initialement codé ca sous Access, je l'ai gardé
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel (3e édition)
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    le PageSetup classique est excessivement lent, essaies avec la macroxl4 qui est beaucoup plus rapide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MacroExcel4 = "PAGE.SETUP(en_tête, pied_pg, marge_gch, _
    marge_dr, marge_haut, marge_bas, no_lig_col, quadrillage, _
    centr_hor, centr_vert, orient, papier, échelle, no_pg, ordre_impr, _
    cellules_nb, qualité, marge_en_tête, marge_pied_pg, annot, brouillon)"
    Application.ExecuteExcel4Macro MacroExcel4
    Cordialement
    Patrice

  5. #5
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 684
    Par défaut
    Héhé, merci pour cette piste, que je vais m'empresser d'adapter à mon cas !

    Merci, j'ai donc pu adapter et obtenir un temps de réponse nettement plus efficace !

    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
    Application.ScreenUpdating = False
        Do While Len(Fichier) > 0
            If Chemin & Fichier <> ThisWorkbook.FullName Then
                Set xlwbk = Application.Workbooks.Open(Chemin & Fichier)
                Set xlwsh = xlwbk.Worksheets(1)
                xlwsh.Range("H:I").EntireColumn.Hidden = True
     
                MacroExcel4 = "PAGE.SETUP(,,0.75,0.75,0.98,0.98)"
                'MacroExcel4 = "PAGE.SETUP(en_tête, pied_pg, marge_gch," & _
                                "marge_dr, marge_haut, marge_bas, no_lig_col, quadrillage, " & _
                                "centr_hor, centr_vert, orient, papier, échelle, no_pg, ordre_impr, " & _
                                "cellules_nb, qualité, marge_en_tête, marge_pied_pg, annot, brouillon)"
                Application.ExecuteExcel4Macro MacroExcel4
     
                With xlwsh.PageSetup
                    .Orientation = xlLandscape
                    .PrintArea = "A1:O" & xlwsh.Range("K65536").End(xlUp).Row
                    .Zoom = False
                    .FitToPagesWide = 1
                    .FitToPagesTall = 1
                End With
                User = Replace(xlwsh.Range("B3").Value, " ", "_")
                Set xlwsh = Nothing
                CurrentPath = xlwbk.FullName
                NewPath = xlwbk.Path & "\" & Left(xlwbk.Name, 29) & User & ".xls"
                xlwbk.Save
                xlwbk.Close True
                Name CurrentPath As NewPath
            End If
            Fichier = Dir()
     
        Loop
        Application.ScreenUpdating = True
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel (3e édition)
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  6. #6
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Le PageSetup classique est relativement lent car les propriétés sont modifiées l'une après l'autre alors qu'avec la MacroExcel4 elle sont toutes modifiées en un seul appel.
    Tu devrais encore gagner un peu de temps en passant un maximum d'arguments dans MacroExcel4 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                MacroExcel4 = "PAGE.SETUP(,,0.75,0.75,0.98,0.98,False,False,True,False,2,,True)"
                'MacroExcel4 = "PAGE.SETUP(en_tête, pied_pg, marge_gch,"marge_dr, marge_haut, marge_bas, _
                               no_lig_col, quadrillage, centr_hor, centr_vert, orient, papier, échelle, no_pg, ordre_impr, " & _
                                "cellules_nb, qualité, marge_en_tête, marge_pied_pg, annot, brouillon)"
                Application.ExecuteExcel4Macro MacroExcel4
     
                xlwsh.PageSetup.PrintArea = "A1:O" & xlwsh.Range("K65536").End(xlUp).Row
    Cordialement
    Patrice

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

Discussions similaires

  1. [XL-2010] Accélérer le code
    Par jad73 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/03/2013, 16h59
  2. Accélérer du code après l'impossible !
    Par Invité dans le forum C
    Réponses: 10
    Dernier message: 13/04/2007, 12h14
  3. Explication de code suivant sur pitch
    Par jena dans le forum Signal
    Réponses: 10
    Dernier message: 28/01/2007, 12h44
  4. Explication du code suivant
    Par dp33 dans le forum Access
    Réponses: 2
    Dernier message: 05/06/2006, 12h45
  5. [VBA-E] Peut on accélérer mon code?
    Par mustang-ffw02 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/12/2005, 02h19

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