Rapport de message :*
 

Re: Optimiser mes macros en VBA

Titre du sujet : Re: Optimiser mes macros en VBA
par Mth le 08/09/2010 23:24:52

Bonsoir zorbrax,

Belle perte de poids en effet :) Ceci dit il en reste, accessoirement, tu as une image dans ton onglet "Menu", vois combien elle pèse, sait-on jamais.

Pour le critère DBL2, tu peux ajouter une autre ligne de code, par exemple:
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("DBL2"). _
        CurrentPage = "OK"

En fait je ne sais pas si j'ai bien compris ta question, mais tu veux pouvoir choisir à la fois la région (qui est en filtre) et la question (qui est en étiquette de colonne dans le TCD)?
Si c'est ça, je te joins un fichier différent, j'ai éliminé l'onglet "Menu", et j'ai intégré dans l'onglet TCD deux listes déroulantes, une pour choisir la région, l'autre pour choisir la question.
En suite on clique sur le bouton et le TCD s'affiche avec les paramètres demandés.

Pour les listes déroulantes, tu peux les voir dans le menu "Données" / "Validation" (j'ai placé la liste des régions et des questions dans l'onglet "Correspondance")

Pour le TCD; je ne suis pas calée en VBA mais avec l'enregistreur de macros et quelques arrangements quand même, voici le code que tu pourras tester dans le fichier (les commentaires sont en vert):
Sub Affiche()

'Pour bloquer la mise à jour de l'affichage
' A remettre absolument en fin de macro
Application.ScreenUpdating = False

'Définition des variables
' VQuest pour la question choisie
'VOldQuest pour l'ancienne question
'VRegion pour la région choisie
Dim VQuest As String, VOldQuest As String, VRegion As String

'Les variables prennent les valeurs de l'onglet TCD1
' en cellules C2 C3 et C14
VRegion = Sheets("TCD1").Range("C2")
VOldQuest = Sheets("TCD1").Range("C14")
VQuest = Sheets("TCD1").Range("C3")

'Une série d'instructions (on peut en mettre une seule) va être exécutée sur le Tableau croisé dynamique1
'instructions placées entre le WITH et le End WITH

'Première instruction: Le champ "Régions" prend la valeur de la variable VRegion
With ActiveSheet.PivotTables("Tableau croisé dynamique1")
         .PivotFields("Régions").CurrentPage = VRegion
   
'Si on clique sur le bouton sans changer la question
'on saute le traitement, si non on l'exécute
    If VQuest <> VOldQuest Then
        'Si la question n'est pas vide (si non on saute le traitement)
        ' on place le champ VQuest dans le TCD
        'code obtenu avec l'enregistreur de macros
        If VQuest <> "" Then
            With .PivotFields(VQuest)
                .Orientation = xlColumnField
                .Position = 1
            End With
         End If
         'Si l'ancienne question n'est pas vide, on retire le champ VOldQuest du TCD
         If VOldQuest <> "" Then
            With .PivotFields(VOldQuest)
                .Orientation = xlHidden
            End With
         End If
    End If
End With
   
' Pour obliger la cellule C14 à passer à la ligne
'si non se perd à la mise à jour du TCD
Range("C14").WrapText = True

'Rétablit la mise à jour de l'affichage
Application.ScreenUpdating = True
   
   
End Sub
(testé sur 2007, je n'ai pas la possibilité de vérifier sur les autres versions)

Voilà, je te laisse regarder si cela peut te convenir.

Très bonne soirée et à bientôt,

Mth