Graphique croisé dynamique - bouton

GuillauMittal

XLDnaute Nouveau
Bonjour à tous !

Mon premier poste sur ce forum qui m'a déjà beaucoup aidé. Mais j'ai un nouveau souci pour lequel je n'ai pas trouvé de réponse.

Je m'explique :

A partir d'une base de donnée du type de celle située en pièce jointe, (Année, Mois, Lieu, Donnée, Ratio), plutôt que de modifier les paramètre du graphique en passant par le tableau, j'aimerais :

- Insérer des cases à cocher permettant de sélectionner / déséctionner, ou le Brésil, ou la France, ou les 2.
- Insérer des cases à cocher permettant de sélectionner / désectionner, ou Janvier, ou Février, ou les 2.
- Insérer une liste déroulante permettant de choisir la donnée à afficher, à savoir la longeur, la taille ou le poids.

J'ai déjà réussi, avec mes faibles compétences en Macro / VBA, à imputer une macro sur un bouton qui va sélectionner la donnée Brésil par exemple, mais lorsque je décoche la case la donnée de disparaît pas du graphique.

En feuille 1 de la pièce jointe se trouve la base de donnée et le graphique, en feuille 2 se trouve, en terme d'apparence, le résultat auquel j'aimerais arriver.

Merci d'avance et cordialement.
 

Pièces jointes

  • ExempleDL.xlsm
    23 KB · Affichages: 45

PMO2

XLDnaute Accro
Re : Graphique croisé dynamique - bouton

Bonjour,

Une piste avec cet exemple.

1) Copiez le code suivant dans un module Standard
Code:
'/// Variables de portée module ///
Dim PF As PivotField
Dim PI As PivotItem
Dim OBJ As Object
'//////////////////////////////////

Sub Zonedeliste2_QuandChangement()
Dim i&
'---
Set OBJ = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
Set PF = ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Donnée")
'---
Application.ScreenUpdating = False
'---
PF.ClearAllFilters
PF.CurrentPage = "(All)"
'---
For Each PI In PF.PivotItems
  If PI.Name <> OBJ.List(OBJ.Value) Then PI.Visible = False
Next PI
'---
Application.ScreenUpdating = True
End Sub

Sub Brésil_Clic()
Set OBJ = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
Set PF = ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Lieu")
'---
Call TraitementCheckBoxes
End Sub

Sub France_Clic()
Set OBJ = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
Set PF = ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Lieu")
'---
Call TraitementCheckBoxes
End Sub

Sub Janvier_Clic()
Set OBJ = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
Set PF = ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Mois")
'---
Call TraitementCheckBoxes
End Sub

Sub Fevrier_Clic()
Set OBJ = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
Set PF = ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Mois")
'---
Call TraitementCheckBoxes
End Sub

Sub TraitementCheckBoxes(Optional dummy As Byte)
With PF.PivotItems(OBJ.Caption)
  If OBJ.Value = 1 Then
    .Visible = True
  Else
    On Error Resume Next  'il faut au moins 1 PivotItem qui soit visible
    .Visible = False
    If Err <> 0 Then OBJ.Value = 1 'si erreur, on rétablit la CheckBox à True
  End If
End With
End Sub

2) Affectez une macro à chaque contrôle de formulaire (Excel.ListBox et Excel.CheckBoxes) par le biais de la boîte de dialogue "Affecter une macro" comme le montre l'image suivante
zzzzz.JPG
 

Pièces jointes

  • ExempleDL_pmo.xlsm
    29.6 KB · Affichages: 42

GuillauMittal

XLDnaute Nouveau
Re : Graphique croisé dynamique - bouton

Hélas on ne choisit pas forcément dans le cadre professionnel !

J'ai un léger problème sur cette ligne de code pour chacune des macros "Clic" cependant :

"Set OBJ = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object" est surligné en jaune quand j'ouvre le déboggeur.

Désolé de cette question supplémentaire et merci encore !
 

PMO2

XLDnaute Accro
Re : Graphique croisé dynamique - bouton

Set OBJ = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
Bonjour,
Vous avez lancé directement la procédure à partir du VBE (ou de la boîte de dialogue de macros).

1) Shapes(Application.Caller) => qui a appelé ?
2) OLEFormat.Object => identifie l'objet appelant

Set OBJ = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
J'affecte donc dans ma variable OBJ (As Object) l'objet appelant.

Si c'est autre chose que l'un des contrôles de formulaire qui appelle la procédure, alors le programme plante car ce n'est pas l'objet attendu.

Pour éviter cette mésaventure, mettez un argument optionnel bidon dans chaque Sub comme suit
Code:
Sub Brésil_Clic(Optional dummy As Byte)

*****
@ tototiti2008

Bonjour tototiti2008,
Comme on peut s'en rendre compte à la lecture de ce message, c'est l'éditeur de texte de ExcelDownloads qui fait des siennes en ajoutant un espace superflu.
A plus.
 

GuillauMittal

XLDnaute Nouveau
Re : Graphique croisé dynamique - bouton

C'est en te répondant que j'ai compris mon erreur, j'avais mal imputé les macros. Merci !

EDIT @ PMO2 : Effectivement, je me suis rendu compte de ma stupidité. Je n'en suis qu'aux balbutiements du langage VBA, mais punaise quel potentiel...
 

Discussions similaires

Statistiques des forums

Discussions
312 379
Messages
2 087 761
Membres
103 661
dernier inscrit
fcleves