bugg pivottables - macro graph croisé dynamique

bugg pivottables - macro graph croisé dynamique - VB/VBA/VBS - Programmation

Marsh Posté le 22-07-2015 à 10:54:30    

Bonjour à tous !!
 
Bon, je tourne en rond depuis quelque temps maintenant donc je m'en remets à vous pour m'éclairer...  
 
J'ai un fichier excel Fic1. Si je l'ouvre, il me demande d'ouvrir grâce à une macro un autre fichier excel qui contient un tableau, qu'on nommera fic2.
Dans ce fic2, toujours grâce à la macro de fic1, je crée un graphique croisé dynamique dans une nouvelle feuille.  
 
Voici mon code avec des msgBox pour le suivi de l'exéc :
 

Code :
  1. Private Sub Workbook_Open()
  2.    
  3.     Dim fd As FileDialog
  4.     Dim UserClickedOK As Boolean
  5.     Dim chemin As String
  6.     Dim nbRows As Long
  7.     Dim nbCol As Long
  8.     Dim wb1 As Workbook ' Classeur 1, qui contient la macro, donc fic1
  9.     Dim wb2 As Workbook ' fichier qui contient les données, donc fic2
  10.     Dim ws1 As Worksheet ' feuille qui contient les données dans fic2
  11.     Dim ws2 As Worksheet ' feuille qui va contenir le graphe dans fic2
  12.    
  13.     Set wb1 = ActiveWorkbook
  14.    
  15.     ' On récupère tout d'abord le chemin complet du fichier sur lequel on veut faire des stats
  16.     Set fd = Application.FileDialog(msoFileDialogFilePicker)
  17.     UserClickedOK = fd.Show
  18.    
  19.     If UserClickedOK = True Then
  20.         chemin = fd.SelectedItems.Item(1)
  21.         Workbooks.Open chemin
  22.         Set wb2 = ActiveWorkbook
  23.         Cells(2, 1).Select
  24.        
  25.         'On trouve la dernière ligne et la dernière colonne
  26.         nbRows = 2
  27.         Do While Not IsEmpty(Range("A" & nbRows))
  28.             nbRows = nbRows + 1
  29.         Loop
  30.        
  31.         nbCol = Cells(4, Cells.Columns.Count).End(xlToLeft).Column
  32.        
  33.         Set ws1 = wb2.ActiveSheet
  34.         Set ws2 = wb2.Sheets.Add
  35.        
  36.         wb2.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
  37.             ws1.Name & "!R2C1:R71C8", Version:=xlPivotTableVersion14).CreatePivotTable _
  38.             TableDestination:=ws2.Name & "!R1C1", TableName:="Tableau croisé dynamique1", _
  39.             DefaultVersion:=xlPivotTableVersion14
  40.         wb2.Sheets(ws2.Name).Select
  41.         Cells(1, 1).Select
  42.         wb2.Activate
  43.         wb2.ActiveSheet.Shapes.AddChart.Select
  44.         wb2.ActiveChart.ChartType = xlColumnClustered
  45.        
  46.         wb2.ActiveChart.SetSourceData Source:=Range(ws2.Name & "!$A$1:$C$18" )
  47.         wb2.ActiveSheet.Shapes("Graphique 1" ).IncrementLeft 264
  48.         wb2.ActiveSheet.Shapes("Graphique 1" ).IncrementTop 14.25
  49.         MsgBox "1"
  50.         wb2.ws2.PivotTables("Tableau croisé dynamique1" ).AddDataField ActiveSheet. _
  51.             PivotTables("Tableau croisé dynamique1" ).PivotFields("Libellé" ), _
  52.             "Nombre de Libellé", xlCount
  53.         MsgBox "2"
  54.         With wb2.ws2.PivotTables("Tableau croisé dynamique1" ).PivotFields("Statut" )
  55.             .Orientation = xlRowField
  56.             .Position = 1
  57.         End With
  58.         wb2.ActiveChart.ChartType = xl3DPie
  59.         wb2.ws2.ShowPivotTableFieldList = False
  60.        
  61.         wb2.ws2.ChartObjects("Graphique 1" ).Activate
  62.         wb2.ActiveChart.SeriesCollection(1).Select
  63.         wb2.ws2.ActiveChart.ApplyLayout (1)
  64.        
  65.     Else
  66.         chemin = ""
  67.         MsgBox "Le chemin n'est pas valide"
  68.     End If
  69.    
  70. End Sub


 
Ce qui est en rouge, bah... ça fonctionne pas...  

Citation :

Erreur '1004' : erreur définie par l'application ou par l'objet


 
Quand j'ai enregistré la macro, il me met juste ActiveSheet.PivotTables, j'ai précisé le wb et le ws pour être plus précise, mais même si je les enlève, ça bugg.. No se...
 
une idée ?
 
 :jap:  :jap:  :jap:

Reply

Marsh Posté le 22-07-2015 à 10:54:30   

Reply

Marsh Posté le 22-07-2015 à 12:14:26    

 
           Bonjour,
 
           dans la définition d'une variable objet de type feuille, sa référence au classeur est forcément incluse :
           c'est idiot dans cette ligne - et les suivantes - de précéder cette variable objet par celle d'un classeur !
 
           Tester donc sans wb2.
 
           Autre point : plus loin dans la ligne figure ActiveSheet pour le même pivot : donc s'il n'est pas dans la feuille active ! …
 


Message édité par Marc L le 22-07-2015 à 12:24:52
Reply

Marsh Posté le 22-07-2015 à 12:51:42    

Ok merci beaucoup ;) tout marche nikel ! :jap:

Reply

Marsh Posté le 22-07-2015 à 13:26:11    

Ah si, autre chose dont je viens de m'apercevoir.  
 
J'ai rajouté cette ligne :  

Code :
  1. Selection.AutoFilter
  2.         ws1.Range("$A$2:$H$" & nbRows).AutoFilter Field:=6, Criteria1:="Document"


 
Et je voudrais que mon graphes ne prennent en compte que certaines données. En gros j'ai mon tableau :
 
Libellé                   TypeDoc                  Statut
A                         Document                stoppé
B                            x                          terminé
C                            y                         en cours
 
Et je voudrais un camembert pour les "Document", statistiques sur les statuts.  
 
Sauf qu'actuellement, même si j'ai mis un filtre, il ne filtre pas dans le graphique en fait...  
 

Reply

Marsh Posté le 22-07-2015 à 14:25:06    

sorry, je suis stupide [:rofl]  
 
J'ai juste à réenregistrer ma macro en rajoutant un filtre sur le graphe croisé dyna :sol:

Reply

Marsh Posté le 22-07-2015 à 16:18:17    

Bon maintenant une autre question, je n'y arrive pas avec un enregistrement de macro, ni en codant.  
 
Il y a 3 statuts possibles : S1, S2 et S3.  
Il peut y en avoir que 2 dans le tableau, au lieu de 3.  
 
J'aimerais changer les couleurs de mon graphe (camembert avec %) pour que S1 soit toujours vert, S2 orange et S3 rouge.
 
C'est possible? :??:

Reply

Marsh Posté le 23-07-2015 à 09:51:35    

 
           Là je ne visualise pas …
 
           Si chaque statut correspond à une série, modifier alors la couleur de la série …
 

Reply

Marsh Posté le 23-07-2015 à 10:12:28    

Libellé                   TypeDoc                  Statut
A                         Document                stoppé
B                            x                          terminé
C                            y                         en cours  
 
Libellé                   TypeDoc             Statut
A                         Document                stoppé
B                            x                         stoppé
C                            y                         en cours  
 
 
Dans mes tableaux ci-dessus, j'ai soit 2, soit 3 statuts, qui sont les valeurs de mon camembert :  
graphe 1 : 33% - 33% - 33%
graphe 2 : 66% - 33%
 
Du coup, vu que je n'ai pas toujours le même nombre de secteurs, car pas le même nombre de statut dans mon graphe, comment je peux spécifier que tel statut prend tel couleur?

Reply

Marsh Posté le 23-07-2015 à 10:15:08    

J'ai fait ça grâce à l'enregistrement de macro :  

Code :
  1. wb2.ActiveChart.Legend.Select
  2.         wb2.ActiveChart.Legend.LegendEntries(1).Select
  3.         With Selection.Format.Fill
  4.             .Visible = msoTrue
  5.             .ForeColor.RGB = RGB(146, 208, 80)
  6.             .Solid
  7.         End With
  8.         MsgBox "4"
  9.         With Selection.Format.Fill
  10.             .Visible = msoTrue
  11.             .ForeColor.RGB = RGB(255, 0, 0)
  12.             .Transparency = 0
  13.             .Solid
  14.         End With
  15.         ActiveChart.Legend.LegendEntries(2).Select
  16.         With Selection.Format.Fill
  17.             .Visible = msoTrue
  18.             .ForeColor.RGB = RGB(255, 0, 0)
  19.             .Solid
  20.         End With
  21.         With Selection.Format.Fill
  22.             .Visible = msoTrue
  23.             .ForeColor.RGB = RGB(146, 208, 80)
  24.             .Transparency = 0
  25.             .Solid
  26.         End With


 
mais c'est juste pour ces données là en question, ça ne marchera pas pour un autre tableau

Reply

Marsh Posté le 23-07-2015 à 10:50:13    

 
           Désolé, là je n'imprime pas
 
           Apparemment LegendEntries correspondrait aussi à une série, donc serait gérable pour n'importe quel tableau selon les séries …
 

Reply

Marsh Posté le 23-07-2015 à 10:50:13   

Reply

Marsh Posté le 23-07-2015 à 10:56:47    

ok donc dans ce cas là, je dois faire un test sur l'existence de la série, sinon ça va bugger s'il y en a 2 au lieu de 3 par exemple non ?
 
Et puis est-ce que je peux être sûre que LegendEntries(1) va systématiquement se référer à la même chose (statut stoppé par exemple) ?

Reply

Marsh Posté le 23-07-2015 à 16:19:10    

 
 
          Je verrais bien un rapport entre l'ordre des séries et celui de la collection LegendEntries
 

Reply

Marsh Posté le 24-07-2015 à 07:57:02    

ok merci. Je vais creuser ... :)

Reply

Marsh Posté le 28-07-2015 à 09:56:21    

J'ai trouvé ;)
 
Voici le code :  
wb2 est mon workbook
ws2 est ma feuille worksheet
c est un integer.

Code :
  1. ' On modifie les couleurs des secteurs pour que ce soit cohérent avec les couleurs qu'il y a dans le tableau
  2. ws2.ChartObjects("Graphique 1" ).Activate
  3. wb2.ActiveChart.SeriesCollection(1).Select
  4. ' On boucle sur le nombre de secteur c
  5. For c = 1 To wb2.ActiveChart.SeriesCollection(1).Points.Count
  6.             'teste la présente des étiquettes sur le graphs
  7.             If wb2.ActiveChart.SeriesCollection(1).Points(c).HasDataLabel = False Then test = 1
  8.             'récupère les informations des étiquettes
  9.             rep = wb2.ActiveChart.SeriesCollection(1).Points(c).DataLabel.Text
  10.             ws2.ChartObjects("Graphique 1" ).Activate
  11.             wb2.ActiveChart.SeriesCollection(1).Select
  12.             ' En fonction de la valeur de l'étiquette, on colorie le secteur d'une certaine manière
  13.             ' la coloration s'est faite également par enregistrement de macro
  14.             If rep Like "En approbation*" Then ' Si En approbation alors Orange
  15.                 wb2.ActiveChart.SeriesCollection(1).Points(c).Select
  16.                 With Selection.Format.Fill
  17.                     .Visible = msoTrue
  18.                     .ForeColor.ObjectThemeColor = msoThemeColorAccent6
  19.                     .ForeColor.TintAndShade = 0
  20.                     .ForeColor.Brightness = 0
  21.                     .Transparency = 0
  22.                     .Solid
  23.                 End With
  24.             End If
  25.             If rep Like "En création*" Then ' Si En création alors rouge
  26.                 wb2.ActiveChart.SeriesCollection(1).Points(c).Select
  27.                 With Selection.Format.Fill
  28.                     .Visible = msoTrue
  29.                     .ForeColor.ObjectThemeColor = msoThemeColorAccent6
  30.                     .ForeColor.TintAndShade = 0
  31.                     .ForeColor.Brightness = 0
  32.                     .Solid
  33.                 End With
  34.                 With Selection.Format.Fill
  35.                     .Visible = msoTrue
  36.                     .ForeColor.RGB = RGB(255, 0, 0)
  37.                     .Transparency = 0
  38.                     .Solid
  39.                 End With
  40.             End If
  41.             If rep Like "Officiel*" Then ' Si Officiel alors vert
  42.                 wb2.ActiveChart.SeriesCollection(1).Points(c).Select
  43.                 With Selection.Format.Fill
  44.                     .Visible = msoTrue
  45.                     .ForeColor.RGB = RGB(255, 0, 0)
  46.                     .Solid
  47.                 End With
  48.                 With Selection.Format.Fill
  49.                     .Visible = msoTrue
  50.                     .ForeColor.RGB = RGB(146, 208, 80)
  51.                     .Transparency = 0
  52.                     .Solid
  53.                 End With
  54.             End If
  55. ' On passe au prochain secteur
  56. Next c

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed