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 :

problème de perf !


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Par défaut problème de perf !
    Bonjour à tous,

    J'ai lu cette discussion et je rencontre la même problématique de choix multiples d'items dans le champ d'un TCD.

    Citation Envoyé par Daniel.C Voir le message
    Pas testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test2()
        ActiveSheet.PivotTables("PivotTable1").PivotSelect "Lieu[All]", xlLabelOnly, _
            True
        With ActiveSheet.PivotTables("PivotTable1").PivotFields("Lieu")
            For i = 1 To .PivotItems.Count
                If .PivotItems(i).Name = "Interne Paris" Then
                    .PivotItems(i).Visible = True
                Else
                    .PivotItems(i).Visible = False
                End If
            Next i
        End With
    End Sub
    La solution proposée fonctionne également pour moi. Par contre mon PivotField contient plus de 2500 valeurs et le balayage des valeurs une à une pour les passer en True ou False est excessivement long (plusieurs minutes) !
    Connaissez vous un moyen d'optimiser ce code pour rendre son exécution plus rapide ?

    Par avance merci !

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Peux-tu mettre un classeur - sans données confidentielles - en PJ ? Indique les items que tu souhaites être visibles.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Par défaut
    Bonjour,
    Merci pour votre réponse rapide !

    Voici un exemple de fichier anonymisé.
    Avec le fichier original on est à plus de 2 minutes ... (les données ont des noms beaucoup plus longs...), ici environ 25s mais c'est toujours trop ..
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    J'ai fait une autre approche en modifiant la source du tableau grâce à un filtre avancé :

    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
    Private Sub Bouton_Valider_Click()
     
        Application.ScreenUpdating = False
        Application.EnableEvents = False
     
        Dim Ctrl As Control
        Dim TableApplications() As String
        Dim i As Integer
        i = 0
     
        Dim PI As Object
     
        Dim oTCD As PivotTable
        Dim oTCD_Appli As PivotField
        Dim Ligne As Long
        Dim Plage As Range
        Dim Criteres As Range
        Set oTCD = Worksheets("TestAp").PivotTables("Tableau croisé dynamique1")
        Set oTCD_Appli = oTCD.PivotFields("AP")
     
        Dim DateStart
     
        'On stocke dans un dico les champs choisis dans la fenêtre (checkbox = true) :
        With Sheets("OrgaAp")
            .[G2:M65536].ClearContents
            Ligne = 1
            Set monDicoAppli = CreateObject("Scripting.Dictionary")
            For Each Ctrl In Me.Controls
                If TypeOf Ctrl Is MSForms.Checkbox Then
                    If Ctrl.Value = True Then
                        monDicoAppli.Add Ctrl.Name, Ctrl.Name
                        Ligne = Ligne + 1
                        .Cells(Ligne, 13) = "=""=" & Ctrl.Name & """"
                    End If
                End If
            Next Ctrl
            Unload Me
            Set Criteres = .Range(.[M1], .Cells(.Rows.Count, 13).End(xlUp))
            .Range(.[A1], .Cells(.Rows.Count, 5).End(xlUp)).AdvancedFilter xlFilterCopy, Criteres, .[G1:K1]
            Set Plage = .Range(.[G1], .Cells(.Rows.Count, 11).End(xlUp))
        End With
        With Sheets("TestAp")
            .PivotTables("Tableau croisé dynamique1").SourceData = "OrgaAp!" & Plage.Address(1, 1, xlR1C1)
        End With
        'pour calculer le temps d'éxcécution ...
        Application.EnableEvents = True
        Application.ScreenUpdating = True
     
        monDicoAppli.RemoveAll
     
     
    End Sub
    Regarde le classeur joint.
    Fichiers attachés Fichiers attachés

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Par défaut
    Merci Daniel.
    C'est effectivement une idée, je vais étudier ça plus en détail.

    Autres précisions, la table OrgaAp est juste un référentiel,
    et l'onglet TestAp permet de faire un filtre global sur les TCD d'une dizaine d'autres onglets. (Les vrais données sont dans une source de données externe sur laquelle pointe des TCD présents dans chacun des autres onglets.)

    Le but est donc de choisir des champs dans l'onglet TestAp pour les appliquer à tous les autres onglets (qui contiennent les mêmes champs de recherches mais bcp plus de champ de données)

    La méthode de modification de la source du tableau me parait ideale pour l'onglet TestAp, mais plus complexe dans les autres onglets (sources de données externe, pouvant dépasser les 65000 lignes...)

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Par défaut
    Bonjour à tous,

    J'ai un début de solution !

    Le temps d'éxécution du fichier exemple est passé de 23s à 1s.
    Et pour mon fichier original, de 2min30 à 43s ...

    Pour cela il suffit en début de code :
    -> d'empêcher le recalcul du TCD à chaque fois qu'on sélectionne un champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        MonTCD.ManualUpdate = True
    -> d'empêcher le tri automatique des champs du TCD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        MonTCD.MonPivotField.AutoSort xlManual, MonTCD.MonPivotField.Name
    -> au cas où, d'empêcher le recalul de la page excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Application.Calculation = xlCalculationManual

    Et bien sûr on réactive tout, à la fin du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        MonTCD.MonPivotField.AutoSort xlAscending, MonTCD.MonPivotField.Name
        MonTCD.ManualUpdate = False
        Application.Calculation = xlCalculationAutomatic
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    je joins le fichier Excel corrigé.

    J'espère pouvoir faire diminuer encore ce temps dans mon fichier original ..

    ++
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Problème de perf sous Tomcat 5.5
    Par gamodio dans le forum Tomcat et TomEE
    Réponses: 14
    Dernier message: 18/07/2006, 11h48
  2. [VBA-E] Problème de perf'
    Par MatMeuh dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/07/2006, 16h22
  3. Réponses: 11
    Dernier message: 19/06/2006, 16h54
  4. problèmes de perfs IE6/Firefox
    Par fredoche dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 26/08/2005, 17h44
  5. Problème de perfs Sous requetes IN
    Par ias83 dans le forum SQL
    Réponses: 4
    Dernier message: 15/06/2005, 12h39

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