Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1769 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  bugg pivottables - macro graph croisé dynamique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

bugg pivottables - macro graph croisé dynamique

n°2262983
minimoack
Posté le 22-07-2015 à 10:54:30  profilanswer
 

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:

mood
Publicité
Posté le 22-07-2015 à 10:54:30  profilanswer
 

n°2262996
Marc L
Posté le 22-07-2015 à 12:14:26  profilanswer
 

 
           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
n°2263000
minimoack
Posté le 22-07-2015 à 12:51:42  profilanswer
 

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

n°2263001
minimoack
Posté le 22-07-2015 à 13:26:11  profilanswer
 

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...  
 

n°2263007
minimoack
Posté le 22-07-2015 à 14:25:06  profilanswer
 

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

n°2263019
minimoack
Posté le 22-07-2015 à 16:18:17  profilanswer
 

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? :??:

n°2263082
Marc L
Posté le 23-07-2015 à 09:51:35  profilanswer
 

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

n°2263088
minimoack
Posté le 23-07-2015 à 10:12:28  profilanswer
 

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?

n°2263089
minimoack
Posté le 23-07-2015 à 10:15:08  profilanswer
 

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

n°2263090
Marc L
Posté le 23-07-2015 à 10:50:13  profilanswer
 

 
           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 …
 

mood
Publicité
Posté le 23-07-2015 à 10:50:13  profilanswer
 

n°2263093
minimoack
Posté le 23-07-2015 à 10:56:47  profilanswer
 

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) ?

n°2263111
Marc L
Posté le 23-07-2015 à 16:19:10  profilanswer
 

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

n°2263135
minimoack
Posté le 24-07-2015 à 07:57:02  profilanswer
 

ok merci. Je vais creuser ... :)

n°2263407
minimoack
Posté le 28-07-2015 à 09:56:21  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  bugg pivottables - macro graph croisé dynamique

 

Sujets relatifs
Problème filtrage macroMacro copier tableau avec plusieurs critères
problèmes récupération checkbox dynamiquemacro pour copier coller lignes
Problème de macro et d'importation d'un fichier WordReproduire ligne avec plusieurs Cases d'option/Zone de groupe ET Macro
Librairie dynamique et linkersuppression fichier avec macro VB
Probleme de macro 
Plus de sujets relatifs à : bugg pivottables - macro graph croisé dynamique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR