Pb sur Macro a besoin d'aide !!!

LAGUIGUI

XLDnaute Nouveau
Bonjour à tous,

Je ne suis pas débutant sur Excel, mais sur VBA....!!!!! Complètement !!!!:confused:

J'essaye de réaliser mes premières macro en VBA et j'aurais besoin d'aide pour qu'elle fonctionne comme j'aimerai.

Je joint un fichier pour décrire ce que je recherche à faire.

En Bref, je chercher à selectionner des données de TCD se trouvant dans un classeur en fonction d'une liste de critères se trouvant sur un premier TCD.

Grâce aux posts sur ce site, il a été facile de créer la premièrer partie du code qui consiste à actualiser le TCD se trouvant sur le même onglet que le TCD de sélection des critères.:D

Par contre la deuxième partie qui consiste à actualiser les TCD se trouvant sur les autres onglets ne fonctionne pas, ainsi que de combiner les deux variables "Année" et "Période"......:mad:

Ci dessous le code avec une variable et pour un seul onglet...mais normalement j'en ai une bonne quinzaine

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Selection_Liste As String
With ActiveSheet
Selection_Liste = .PivotTables('Tableau croisé dynamique2').PivotFields( _
'Point de Vente').CurrentPage
.PivotTables('Tableau croisé dynamique4').PivotFields( _
'Point de Vente').CurrentPage = Selection_Liste
.PivotTables('Tableau croisé dynamique5').PivotFields( _
'Point de vente').CurrentPage = Selection_Liste
End With
End Sub


Une amorce de la solution me suffit après j'essayerai de me débrouiller...histoire d'apprendre à me débrouiller comme un grand.....:)

En tout cas merci en avance de votre aide.
 

Pièces jointes

  • PARAMETRES TCD AUTOMATIQUE.zip
    14.5 KB · Affichages: 49
G

Guest

Guest
Re : Pb sur Macro a besoin d'aide !!!

Bonjour,

A priori ton classeur est issu d'un classeur 2007 et certaines fonctionnalités de 2007 ne fonctionne pas sous des versions antérieurs.

Alors une macro qui fonctionne sous excel 2007 (xlsm):
dans la feuille 'CHQ_IMP'
Code:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
    Dim Feuille As Worksheet
    Dim Valeur1 As String, Valeur2 As String
 
    Valeur1 = Target.PivotFields("ANNEE").CurrentPage
    Valeur2 = Target.PivotFields("PERIODE").CurrentPage
 
    For Each Feuille In Sheets(Array("CA", "CHARGE"))
        Feuille.PivotTables(1).PivotFields("ANNEE").CurrentPage = Valeur1
        Feuille.PivotTables(1).PivotFields("PERIODE").CurrentPage = Valeur2
    Next Feuille
End Sub

A+
 
Dernière modification par un modérateur:

LAGUIGUI

XLDnaute Nouveau
Re : Pb sur Macro a besoin d'aide !!!

Merci pour ta réponse Hasco, voila ce que j'ai mis dans mon classeur:


Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim Feuille As Worksheet
Dim Valeur1 As String, Valeur2 As String

Valeur1 = Target.PivotFields("ANNEE").CurrentPage
Valeur2 = Target.PivotFields("PERIODE").CurrentPage

For Each Feuille In Sheets(Array("TICK.AN", "FRAIS.RETCH", "CA.RETCH", "CHQ.IMP", "E.CAIS", "CA.VT", "D.MAG", "RETOUR1", "RETOUR2", "DI", "CHQ_DIF"))
Feuille.PivotTables(1).PivotFields("ANNEE").CurrentPage = Valeur1 Feuille.PivotTables(1).PivotFields("PERIODE").CurrentPage = Valeur2
Next Feuille
End Sub


Seulement dans la forme actuelle.... j'ai un message d'erreur:
_Erreur d'exécution '2147417848(80010108)':
La méthode 'CurrentPage' de l'objet 'PivotField' a échoué.


Alors je pense que le pb vient du fait que sur chaque onglet j'ai 2 TCD. J'avais pensé à cela en les nommant dans ma première macro....mais avec la nouvelle je sais pas trop comment procéder....!?!


Y a t'il possibilité de les citer tous, même si cela fait une macro à rallonge, ou il existe une fonction pour ne prendre que le premier TCD de l'onglet ?????

Merci
 
G

Guest

Guest
Re : Pb sur Macro a besoin d'aide !!!

Bonjour,


Question: tu-travailles sous xl2007 ou version antérieure?
Dans:

Feuille.PivotTables(1)
le 1 représente le numéro d'index du premier tcd crée dans la feuille.

Tu peux aussi ecrire, si tous les tcd concerné par la macro ont une adresse de cellule fixe (A1) dans l'exemple ci-dessous:

Code:
Feuille.Range("A1").PivotTable.PivotFields("ANNEE").CurrentPage = Valeur1

Si cela ne marche pas, essaie de joindre un fichier avec 2 ou trois feuilles et les tcd qui vont avec. Sinon, nous risquons de tourner en rond.

P.S. evite le Jaune comme couleur d'écriture dans tes post, c'est difficilement lisible.
A+
 

LAGUIGUI

XLDnaute Nouveau
Re : Pb sur Macro a besoin d'aide !!!

Bonjour Hasco,

Alors pour répondre à ta question je travaille sous xl2007.

Après quelques essais, j'ai put remarquer quelques pb:

-Le code fonctionne très bien comme tu me l'a envoyé lorsqu'il il y a un seul TCD par onglet et pour une seule sélection par critères,....mais j'en ai 2 par onglets et pour certains je doit pouvoir sélectionner Plusieurs années ou plusieurs périodes....!!! (sinon sa serait trop facile) :D

-Précision: Le TCD(1) de l'onglet "mère" doit diriger tous les TCD(1) des onglets ayant ANNEE & PERIODE. Le TCD(2) de l'onglet "mère" doit diriger tous les TCD(2) des onglets ayant ANNEE & PERIODE....
De même pour les onglets ayant en TCD(1) ANNEE & TRIMESTRE, est en TCD(2) ANNEE & PERIODE

-Malheureusement tous les TCD n'ont pas la même adresse de cellule... les viser par leurs nom serait je pense plus sur que de leurs attribuer une cellule (au cas ou quelqu'un bouge un des TCD).

Question: pense tu qu'il est préférable de rajouter une autre macro pour ces 3 onglets avec comme critères ANNEE & TRIMESTRE ou il est possible de l'intégrer dans celle qui est en fabrication ...!?!

Cijoint.fr - Service gratuit de dépôt de fichiers un fichier exemple. ( pour des raisons de confidentialité j'ai récupéré un exercice d'application de l'aide office...)


Merci de me consacrer de ton temps....!!!

PS:désolé pour le jaune....!!
 

LAGUIGUI

XLDnaute Nouveau
Re : Pb sur Macro a besoin d'aide !!!

Bonjour

J'ai réussit à automatiser à moitié mes fichiers.

Il me manque juste à régler deux pb qui sont liées.

-le premier est de réussir à distinguer le TCD(1) "mére" et le TCD(2) "mére", comme cela il me suffira de créer une deuxième macro basé sur le TCD(2) "mère" pour diriger tout les TCD(2) des différents onglets.
-Lié au premier, la possibilité de sélectionner différentes ANNEE & PERIODE.....parceque pour le moment je ne peut selectionner qu'un seul critére par champ...et sa m'enbête...!!!!

Un dernier petit coup de main svp !!!

Merçi !!!!
 
G

Guest

Guest
Re : Pb sur Macro a besoin d'aide !!!

Bonjour,

@LaGuiGui: Voici une macro à appeler soit de la feuille "CA" soit de la Feuille "RETOUR" par un bouton de commande. Je te déconseille fortement de la mettre dans un évènement Worksheet_PivotTableUpdate d'une des feuille ; car appelée à chaque changement devaleur cela entrainerait des ralentissements importants.

C'est une macro à mettre dans un module

SUPPRIMER les évènements Worksheet_PivotTableUpdate existants avant de lancer la macro.

Les noms des TDC qui se nommaient "Tableau Croisés dynamiqueN" ont été changés. Le Premier de la feuille prende le nom de celle-ci le deuxième prend le nom de la feuille suivit de 2(exemple feuille REBUT TCD1= "REBUT" TCD2= "REBUT2")

Code:
Sub MettreAjourTCD()
    Dim oFeuille As Worksheet                         'objet Feuille de calcul en cours de traitement
    Dim aFeuilles                                     'Tableau des noms de feuilles
    Dim i As Integer
    'indice de boucle for
    'PivotsField à modifer
    Dim pvtField1 As PivotField, pvtField2 As PivotField
    Dim pvtField3 As PivotField, pvtField4 As PivotField
    'PivotField Source des modifications
    Dim pvtFieldSource1 As PivotField, pvtFieldSource2 As PivotField
    Dim pvtFieldSource3 As PivotField, pvtFieldSource4 As PivotField
 
    With ActiveSheet
        If .Name = "CA" Then
            aFeuilles = Array("CHQ_IMP", "FRAIS")
            Set pvtFieldSource1 = .PivotTables("CA").PageFields("ANNEE")
            Set pvtFieldSource2 = .PivotTables("CA").PageFields("PERIODE")
            Set pvtFieldSource3 = .PivotTables("CA2").PageFields("ANNEE")
            Set pvtFieldSource4 = .PivotTables("CA2").PageFields("PERIODE")
        ElseIf .Name = "RETOUR" Then
            aFeuilles = Array("REBUT", "RETOUR (2)")
            Set pvtFieldSource1 = .PivotTables(.Name).PageFields("ANNEE")
            Set pvtFieldSource2 = .PivotTables(.Name).PageFields("TRIMESTRE")
            Set pvtFieldSource3 = .PivotTables(.Name & "2").PageFields("ANNEE")
            Set pvtFieldSource4 = .PivotTables(.Name & "2").PageFields("PERIODE")
        Else
            Exit Sub
        End If
    End With
 
    'Permettre la sélection de multiples options pour les sources
    pvtFieldSource1.EnableMultiplePageItems = True
    pvtFieldSource2.EnableMultiplePageItems = True
    pvtFieldSource3.EnableMultiplePageItems = True
    pvtFieldSource4.EnableMultiplePageItems = True
    For Each oFeuille In Sheets(aFeuilles)
        With oFeuille
            Select Case .Name
            Case "CHQ_IMP", "FRAIS"
                Set pvtField1 = .PivotTables(.Name).PageFields("ANNEE")
                Set pvtField2 = .PivotTables(.Name).PageFields("PERIODE")
                Set pvtField3 = .PivotTables(.Name & "2").PageFields("ANNEE")
                Set pvtField4 = .PivotTables(.Name & "2").PageFields("PERIODE")
            Case "REBUT", "RETOUR (2)"
                Set pvtField1 = .PivotTables(.Name).PageFields("ANNEE")
                Set pvtField2 = .PivotTables(.Name).PageFields("TRIMESTRE")
                Set pvtField3 = .PivotTables(.Name & "2").PageFields("ANNEE")
                Set pvtField4 = .PivotTables(.Name & "2").PageFields("PERIODE")
            End Select
            'Nettoyer les filtre manuels
            pvtField1.ClearManualFilter
            pvtField2.ClearManualFilter
            pvtField3.ClearManualFilter
            pvtField4.ClearManualFilter
            pvtField1.EnableMultiplePageItems = True
            pvtField2.EnableMultiplePageItems = True
            pvtField3.EnableMultiplePageItems = True
            pvtField4.EnableMultiplePageItems = True
            For i = 1 To pvtFieldSource1.PivotItems.count
                pvtField1.PivotItems(i).Visible = pvtFieldSource1.PivotItems(i).Visible
            Next i
            For i = 1 To pvtFieldSource2.PivotItems.count
                pvtField2.PivotItems(i).Visible = pvtFieldSource2.PivotItems(i).Visible
            Next i
            For i = 1 To pvtFieldSource3.PivotItems.count
                pvtField3.PivotItems(i).Visible = pvtFieldSource3.PivotItems(i).Visible
            Next i
            For i = 1 To pvtFieldSource4.PivotItems.count
                pvtField4.PivotItems(i).Visible = pvtFieldSource4.PivotItems(i).Visible
            Next i
        End With
    Next oFeuille
End Sub

@David ou Pascal,
C'est un post qui concerne 2007 sans doute à déplacer dans le forum idoine.

A++
 
G

Guest

Guest
Re : Pb sur Macro a besoin d'aide !!!

Re,

Dans le fichier joint, une autre façon de faire.
Les TCD de chaque feuille sont nommés (TCD_1) et (TCD_2)

La macro est appelée à partir des évènements WorkSheet_PivotTableUpdate avec comme paramètre le TCD qui vient d'être changé

Risque de lenteurs s'il y a beaucoup d'options dans les champs de page (ANNEE, PERIODE, TRIMESTRE)

Remplacer ".zip" par ".xlms" dans le nom du fichier joint

A+
 

LAGUIGUI

XLDnaute Nouveau
Re : Pb sur Macro a besoin d'aide !!!

Re,

Hasco, j'ai testé ta macro...mais avec moi sa fonctionne pas:
J'explique: la première partie des onglets (CHQ_IMP, FRAIS) s'actualise bien en fonction des modif faite sur les TCD de CA, mais la deuxième partie ne s'actualise pas en fonction des TCD de RETOUR....!?!

J'ai quand même essayé de l'adapter à un autre classeur (dans le même style)...pour voir !!!! La différence étant au niveau des noms de feuille, que j'ai modifié au endroit ci-dessous (de ce que j'ai compris....tout varie en fonction de ses noms !!!!)...sans succés.
Je pense qu'une partie du pb réside dans le fait que certains critères des TCD "mère" peuvent être absent des autres TCD...!!!!

With ActiveSheet
If .Name = "CA" Then
aFeuilles = Array("CHQ_IMP", "FRAIS")
Set pvtFieldSource1 = .PivotTables("CA").PageFields("ANNEE")
Set pvtFieldSource2 = .PivotTables("CA").PageFields("PERIODE")
Set pvtFieldSource3 = .PivotTables("CA2").PageFields("ANNEE")
Set pvtFieldSource4 = .PivotTables("CA2").PageFields("PERIODE")
ElseIf .Name = "RETOUR" Then
aFeuilles = Array("REBUT", "RETOUR (2)")
Set pvtFieldSource1 = .PivotTables(.Name).PageFields("ANNEE")
Set pvtFieldSource2 = .PivotTables(.Name).PageFields("TRIMESTRE")
Set pvtFieldSource3 = .PivotTables(.Name & "2").PageFields("ANNEE")
Set pvtFieldSource4 = .PivotTables(.Name & "2").PageFields("PERIODE")
Else
Exit Sub
End If
End With

'Permettre la sélection de multiples options pour les sources
pvtFieldSource1.EnableMultiplePageItems = True
pvtFieldSource2.EnableMultiplePageItems = True
pvtFieldSource3.EnableMultiplePageItems = True
pvtFieldSource4.EnableMultiplePageItems = True
For Each oFeuille In Sheets(aFeuilles)
With oFeuille
Select Case .Name
Case "CHQ_IMP", "FRAIS"
Set pvtField1 = .PivotTables(.Name).PageFields("ANNEE")
Set pvtField2 = .PivotTables(.Name).PageFields("PERIODE")
Set pvtField3 = .PivotTables(.Name & "2").PageFields("ANNEE")
Set pvtField4 = .PivotTables(.Name & "2").PageFields("PERIODE")
Case "REBUT", "RETOUR (2)"
Set pvtField1 = .PivotTables(.Name).PageFields("ANNEE")
Set pvtField2 = .PivotTables(.Name).PageFields("TRIMESTRE")
Set pvtField3 = .PivotTables(.Name & "2").PageFields("ANNEE")
Set pvtField4 = .PivotTables(.Name & "2").PageFields("PERIODE")
End Select


PS: J'arrive pas à ouvrir le fichier que tu as envoyé en dernier. J'ai plein de fichier dans le zip mais j'arrive pas à les faires fonctionner...

A +
 
G

Guest

Guest
Re : Pb sur Macro a besoin d'aide !!!

Hello,

Il faut lire les messages jusqu'au bout: pour le dernier fichier je te disait de remplacer l'extension ".zip" par ".xlsm".

Pour le reste chez moi cela semble fonctionner.


A+
 

LAGUIGUI

XLDnaute Nouveau
Re : Pb sur Macro a besoin d'aide !!!

Bonjour,

2 fois MEA CULPA, je me suis mal prit pour ouvrir le dernier fichier et pour la macro je l'ai déposé au mauvais endroit....coller dans macro et pas dans modul...je connaissai pas module !!!

Dit moi si je me trompe, mais il faut que je dépose ton code dans: Développeur => Visual Basic => explorateur de projets =>modules et qu'ensuite j'apelle la macro par Worksheet_PivotTableUpdate sur l'onglet "CA" ou "REBUT" !?!

En tout cas j'essaye comme cela et je te tiens au courant !!!

Merci encore une fois de l'aide que tu m'apporte..
 

LAGUIGUI

XLDnaute Nouveau
Re : Pb sur Macro a besoin d'aide !!!

Re, Hasco

J'ai eut le temps (et enfin réussit à comprendre comment le faire fonctionner) de tester le tout et sa fonctionne trés bien...!!!!

Malheureusement je ne peut pas l'adapter à mes autres fichiers parceque dés qu'un critére (PERIODE ou ANNEE) et absent d'un des TCD des onglets autres que le TCD "mère" il me renvoie un msg d'erreur "impossible de définir la propriété visible de la classe PivotItem".....normal elle existe pas...lol

Je sais que j'abuse, mais tu pense qu'il y a moyen de résoudre ce pb.....!!!!?!!!!:eek:

STP:D

Merci
 
G

Guest

Guest
Re : Pb sur Macro a besoin d'aide !!!

Hello,

Laguigui à dit:
Malheureusement je ne peut pas l'adapter à mes autres fichiers parceque dés qu'un critére (PERIODE ou ANNEE) et absent d'un des TCD des onglets autres que le TCD "mère" il me renvoie un msg d'erreur "impossible de définir la propriété visible de la classe PivotItem".....normal elle existe pas...lol

Si les critères contenus dans tes TCD ne sont pas les mêmes c'est que leurs sources de données n'est pas la même ; ou que des données ont été rajoutées dans la source sans avoir remis les TCD à jour.

donc dans la procédure de mise à jour des TCD (celle du zip contenu dans le post#10) employer la méthode RefreshTable (mais cela prend encore du temps)

Code:
Sub MettreAjourTCD(oTCD As PivotTable)
    Dim oFeuille As Worksheet                         'objet Feuille de calcul en cours de traitement
    Dim aFeuilles                                     'Tableau des noms de feuilles
    Dim i As Integer                                  'indice de boucle for
'PivotsField à modifer
    Dim pvtField1 As PivotField, pvtField2 As PivotField
    'PivotField Source des modifications
    Dim pvtFieldSource1 As PivotField, pvtFieldSource2 As PivotField
    With oTCD
        'Parent.Name renvoie le nom de la feuille
        Select Case .Parent.Name
        Case "CA": aFeuilles = Array("CHQ_IMP", "FRAIS")
        Case "RETOUR": aFeuilles = Array("REBUT", "RETOUR (2)")
        Case Else: Exit Sub
        End Select
        Set pvtFieldSource1 = .PageFields(1)
        Set pvtFieldSource2 = .PageFields(2)
    End With
    'Permettre la sélection de multiples options pour les sources
    pvtFieldSource1.EnableMultiplePageItems = True
    pvtFieldSource2.EnableMultiplePageItems = True
    'Gérer les erreurs
    On Error GoTo FinBoucles
    'Geler les évènements (sinon appel en boucle de WorkSheet_PivotTableUpdate)
    Application.EnableEvents = False
    For Each oFeuille In Sheets(aFeuilles)
        'Sur chaque feuille, travailler sur le TCD idoine
        With oFeuille
            'oTCD.Name renvoie soit "TCD_1" soit "TCD_2"
            
           [SIZE=3][COLOR=red] .PivotTables(oTCD.Name).RefreshTable[/COLOR][/SIZE]
            
            Set pvtField1 = .PivotTables(oTCD.Name).PageFields(1)
            Set pvtField2 = .PivotTables(oTCD.Name).PageFields(2)
            'Nettoyer les filtre manuels
            pvtField1.ClearManualFilter
            pvtField2.ClearManualFilter
            pvtField1.EnableMultiplePageItems = True
            pvtField2.EnableMultiplePageItems = True
            'Parcourir les options choisie dans le premier pivotField source
            For i = 1 To pvtFieldSource1.PivotItems.count
                'Modifier l'option idoine dans l'autre TCD
                pvtField1.PivotItems(i).Visible = pvtFieldSource1.PivotItems(i).Visible
            Next i
            'Parcourir les options choisie dans le deuxième pivotField source
            For i = 1 To pvtFieldSource2.PivotItems.count
                'Modifier l'option idoine dans l'autre TCD
                pvtField2.PivotItems(i).Visible = pvtFieldSource2.PivotItems(i).Visible
            Next i
        End With
    Next oFeuille
FinBoucles:
    'Rétablir la gestion des évènement
    Application.EnableEvents = True
    'Si on a une erreur,sortir de la boucle des feuilles
    If Err.Number > 0 Then
        MsgBox "L'erreur suivante s'est produite:" & vbNewLine & _
               Err.Description, vbCritical, "MettreAjourTCD"
    End If
End Sub

Sinon, je ne vois pas

A+
 

Discussions similaires