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 d'une macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Par défaut Optimisation d'une macro
    Bonjour à tous

    J'ai cette macro qui me permet de faire un export sous PDF de plusieurs onglets au choix avec Masquage de lignes sous condition (que le les valeurs de deux colonnes comportent simultanément 0)

    La macro fonction bien à condition d'avoir un petit fichier et de petits tableaux de quelques lignes

    Par contre lorsque je l'intègre à un fichier de 70 Onglets avec des tableaux très longs, elle rame, juste pour lancer le Userform, au bout de 30 min elle n'y arrive pas

    Je voudrais vos conseils pour arriver à l'optimiser.

    Je vous reemrcie par avance et en profiete pour vous formuler mes meilleurs voeux


    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
     
    Private Sub UserForm_Activate()
    Dim Cellules As Range
    Dim N&, j&
    Application.ScreenUpdating = False
        For N = 1 To Sheets.Count
            For Each Cellules In Sheets(N).UsedRange
                If Cellules = "Année N" And Cellules.Offset(0, 1) = "Année N-1" Then
                    For j = Cellules.Row + 1 To Cellules.End(xlDown).Row
                      If Sheets(N).Cells(j, Cellules.Column) = 0 And Sheets(N).Cells(j, Cellules.Column + 1) = 0 Then
                          Sheets(N).Cells(j, 1).EntireRow.Hidden = True
                      End If
                    Next j
                  'LbFeuilles.AddItem Sheets(N).Name
                End If
            Next
        Next N
     
    End Sub
    Private Sub CmdExportPDF_Click()
    Dim Chemin$, Fiche$, NomFiche$
    Dim SheetArray() As Variant
    Dim I&, Indx&
        Chemin = ThisWorkbook.Path & Application.PathSeparator
        Fiche = "Liasses Syscohada"
    Indx = 0
        For I = 0 To LbFeuilles.ListCount - 1
            If LbFeuilles.Selected(I) Then
                ReDim Preserve SheetArray(Indx)
                SheetArray(Indx) = LbFeuilles.List(I)
                Indx = Indx + 1
            End If
        Next I
     
        If Indx > 0 Then
          Application.ScreenUpdating = False
            Sheets(SheetArray()).Select
            NomFiche = Chemin & Fiche
               ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
                  Filename:=NomFiche, _
                  Quality:=xlQualityMinimum, _
                  IncludeDocProperties:=True, _
                  IgnorePrintAreas:=False, _
                  OpenAfterPublish:=False
        End If
    Erase SheetArray
     
    Feuil1.Select
        Unload Me
    Application.Goto [A1], True
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Dim Cellules As Range
        For N = 1 To Sheets.Count
            For Each Cellules In Sheets(N).UsedRange
                If Cellules = "Année N" And Cellules.Offset(0, 1) = "Année N-1" Then
                    ' Réouverture des lignes masquées
                    Sheets(N).Cells.EntireRow.Hidden = False
                End If
            Next
        Next N
    End Sub

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Sur le code comme tel. je ne pense pas que tu puisses attendre des miracles. Si tu peux te passer du rafraîchissement de l'écran, un bon progrès serait de mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.screenupdating = false
    au début de (des) la macro(s), et, surtout par précaution:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.screenupdating = true
    à la fin de macro. Mais là tu dois être sur qu'il n'y a pas de bogue.

    Ceci étant dit, la grande faiblesse de VBA, c'est que ce n'est pas un langage compilé, mais un langage interprété. C'est donc avec l'obligation de convertir les instructions VBA en code machine, chaque fois que la ligne doit être exécutée. Et la grande faiblesse d'Excel c'est qu'il doit constamment avoir tous les classeurs qu'il a ouverts dans la mémoire vive et au complet. Dès que Windows a de la misère à fournir la mémoire vive, on parle de sérieux risques de plantage, de corruption de fichiers et de pertes de données.

    En limitant le nombre de classeurs ouverts, et en faisant le ménage de la mémoire vive (si Microsoft te laisse faire) cela devrait aider; même si cela risque à la fin de traiter une jambe cassée avec de l'Aspirin. Cela va soulager la douleur, mais cela ne corrigera pas le mal.

    Personnellement, je regarderais plus ver un langage compilé comme VB.net ou C#. (Visual Studio Community est également gratuit, à certaines conditions). Il existe des bibliothèques (des gratuites et des commerciales) pour écrire directement en PDF en partant d'un programme en .net et il est possible d'utiliser des données provenant d'Excel, même si Excel n'a rien d'un SGBD, à part le quadrillage.

    P.S. as-tu comparé si cela fonctionnait mieux en "imprimant en PDF" avec un programme "d'impression en PDF" ?

  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
    Bonjour
    Commence (au moins et entre autres), par te demander ce que fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each Cellules In Sheets(N).UsedRange
                If Cellules = "Année N" And Cellules.Offset(0, 1) = "Année N-1" Then
                    ' Réouverture des lignes masquées
                    Sheets(N).Cells.EntireRow.Hidden = False
                End If
            Next
        Next N
    Es-tu vraiment certain d'avoir à ajouter ce ralentissement en bouclant sur toutes tes cellules ?

    EDIT (et piste) : tu les connais, les feuilles concernées, non ?

  4. #4
    Membre régulier
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Par défaut
    J'ai bien essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub UserForm_terminate()
        Dim feuille As Worksheet
     
        ' Réouverture des lignes masqu?es
        For Each feuille In Worksheets
            feuille.UsedRange.Rows.Hidden = False
        Next feuille
    End Sub
    mais en vain, ça me renvoie une erreur 1004 sur la propriété du Hidden

    Ps: dans mon fichier original, j'ai plus de 70 onglets concernés

  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
    1) Je vais donc te le dire à nouveau :
    tu les connais, les feuilles concernées, non ?
    2) pourquoi l'évènement terminate du userform ?
    Je laisse maintenant (sommeil)

  6. #6
    Membre régulier
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Par défaut
    Citation Envoyé par unparia Voir le message
    1) Je vais donc te le dire à nouveau :
    tu les connais, les feuilles concernées, non ?
    2) pourquoi l'évènement terminate du userform ?
    Je laisse maintenant (sommeil)
    Si si je les connais les feuilles concernées, elle commencent même toutes par un nom commun

    L'évéènement Terminate , c'était dans un soucis d'optimisation de la macro pour que le userform se déclenche plus vite

Discussions similaires

  1. [XL-2010] Optimisation d'une macro de recherche et copie
    Par alcalis16 dans le forum Excel
    Réponses: 5
    Dernier message: 09/07/2015, 11h00
  2. [XL-2007] Optimisation d'une macro + Application à tous les onglets
    Par Identifiant75 dans le forum Excel
    Réponses: 53
    Dernier message: 05/05/2015, 20h23
  3. Optimisation d'une macro lente
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/12/2012, 23h35
  4. optimisation d'une macro
    Par Alphonss dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 29/10/2009, 16h07
  5. probleme d'optimisation d'une macro
    Par ylabarre dans le forum VBA Outlook
    Réponses: 5
    Dernier message: 28/09/2007, 17h40

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