Selection de valeurs d'un champ TCD fonctionne sur 2007 mais pas 2010

Selection de valeurs d'un champ TCD fonctionne sur 2007 mais pas 2010 - VB/VBA/VBS - Programmation

Marsh Posté le 19-12-2014 à 19:11:06    

Bonjour,
 
J'ai créé un TCD sur VBA 2003 (qui fonctionne egalement sur VBA 2007). Mais lors du code de la condition (sélection) de valeurs sur un champ de tableau croisé dynamique, il y a une erreur "incompatibilité de type" lors de l'execution de la macro sur VBA 2010 [b](ligne code 131 et 132)

Code :
  1. . J'ai joint le code ci-dessous.
  2. Pourriez vous me dire, SVP, pourquoi cette partie de code ne fonctionne pas sur VBA 2010 alors qu'il n'y a aucun probleme sur les versions 2007 et 2003 ?
  3. En vous remerciant.
  4. [cpp]Sub FFonctionnement()
  5. '
  6. ' Macro enregistrée le 15/01/2013 par b276573
  7. '
  8. '
  9.     'Sheets("intéresst" ).Select
  10.     'ActiveWindow.SelectedSheets.Visible = False
  11.     'And sht.Name <> "nom onglet" à ajouter si on veut laisser un autre onglet egalement
  12.  
  13.    Dim sht As Object
  14.    For Each sht In ActiveWorkbook.Worksheets
  15.    If sht.Name <> "Extraction H - frais fonct" Then sht.Visible = False
  16.    Next sht
  17.    Application.DisplayAlerts = False
  18.    Worksheets("Extraction H - frais fonct" ).Name = "Base"
  19.  
  20.  
  21.     Worksheets("Base" ).Activate
  22.     ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
  23.         "'Base'!R1C1:R65000C22" ).CreatePivotTable TableDestination:="", TableName:= _
  24.         "Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
  25.     ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
  26.     ActiveSheet.Cells(3, 1).Select
  27.     ActiveSheet.PivotTables("Tableau croisé dynamique1" ).AddFields RowFields:= _
  28.         Array("Service Herakles", "centre de frais", "Données" )
  29.            
  30.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields( _
  31.         "Solde Réalise 2012" )
  32.         .Orientation = xlDataField
  33.         .Caption = "Réalisé 2012"
  34.         .Position = 1
  35.         .Function = xlSum
  36.         .NumberFormat = "#,##0"
  37.     End With
  38.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields( _
  39.         "Solde Réalisé" )
  40.         .Orientation = xlDataField
  41.         .Caption = "Réalisé 2013"
  42.         .Position = 2
  43.         .Function = xlSum
  44.         .NumberFormat = "#,##0"
  45.     End With
  46.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields( _
  47.         "ENGAGE" )
  48.         .Orientation = xlDataField
  49.         .Caption = "Engagé"
  50.         .Position = 3
  51.         .Function = xlSum
  52.         .NumberFormat = "#,##0"
  53.     End With
  54.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("Actu3 2012" )
  55.         .Orientation = xlDataField
  56.         .Caption = "Actu 2012"
  57.         .Position = 4
  58.         .Function = xlSum
  59.         .NumberFormat = "#,##0"
  60.     End With
  61.        With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("Notif 2013" )
  62.         .Orientation = xlDataField
  63.         .Caption = " Budget 2013"
  64.         .Position = 5
  65.         .Function = xlSum
  66.         .NumberFormat = "#,##0"
  67.     End With
  68.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).DataPivotField
  69.         .Orientation = xlColumnField
  70.         .Position = 1
  71.     End With
  72.    
  73.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("Etablissement" ): .Orientation = xlPageField: .Position = 1: End With
  74.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("Secteur Herakles" ): .Orientation = xlPageField: .Position = 2: End With
  75.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("poste" ): .Orientation = xlPageField: .Position = 3: End With
  76.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("lib poste" ): .Orientation = xlPageField: .Position = 4: End With
  77.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("Sous-section / Centre de frais" ): .Orientation = xlPageField: .Position = 5: End With
  78.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("Type de poste" ): .Orientation = xlPageField: .Position = 6: End With
  79.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("direction Herakles" ): .Orientation = xlPageField: .Position = 7: End With
  80.     ActiveWorkbook.ShowPivotTableFieldList = False
  81.    
  82.     ActiveWorkbook.ShowPivotTableFieldList = True
  83.     ActiveWorkbook.ShowPivotTableFieldList = False
  84.     Columns("H:H" ).ColumnWidth = 20.14
  85.     Rows("10:10" ).RowHeight = 27.75
  86.     'Range("H10" ) = " Engagé N non " & Chr(10) & "soldé à date"
  87.     'Range("H10" ).Select
  88.     'With Selection
  89.         '.HorizontalAlignment = xlGeneral
  90.         '.VerticalAlignment = xlBottom
  91.         '.WrapText = True
  92.         '.Orientation = 0
  93.         '.AddIndent = False
  94.         '.IndentLevel = 0
  95.         '.ShrinkToFit = False
  96.         '.ReadingOrder = xlContext
  97.         '.MergeCells = False
  98.     'End With
  99.     ActiveSheet.PivotTables("Tableau croisé dynamique1" ).CalculatedFields.Add _
  100.         "Engagé + réel", "='Solde Réalisé' +'ENGAGE'", True
  101.     ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("Engagé + réel" ). _
  102.         Orientation = xlDataField
  103.     ActiveSheet.PivotTables("Tableau croisé dynamique1" ).DisplayErrorString = True
  104.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields( _
  105.         "Somme de Engagé + réel" )
  106.         .NumberFormat = "#,##0"
  107.     End With
  108.     ActiveSheet.PivotTables("Tableau croisé dynamique1" ).DataPivotField.PivotItems( _
  109.         "Somme de Engagé + réel" ).Caption = "Engagé + réalisé"
  110.    
  111.    
  112.    
  113.     ActiveSheet.PivotTables("Tableau croisé dynamique1" ).CalculatedFields.Add _
  114.         "Avancement", "='Solde Réalisé' /'Notif 2013'", True
  115.     ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("Avancement" ). _
  116.         Orientation = xlDataField
  117.     ActiveSheet.PivotTables("Tableau croisé dynamique1" ).DisplayErrorString = True
  118.     Range("I12" ).Select
  119.     With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields( _
  120.         "Somme de Avancement" )
  121.         .NumberFormat = "0%"
  122.     End With
  123.     ActiveSheet.PivotTables("Tableau croisé dynamique1" ).DataPivotField.PivotItems( _
  124.         "Somme de Avancement" ).Caption = "Avancement %"
  125.  
  126.     Columns("A:A" ).ColumnWidth = 35
  127.    
  128.     Dim AB As PivotItem
  129. For Each AB In ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields("Service Herakles" ).PivotItems
  130. If (AB.Name <> "(vide)" ) Then
  131. With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields( _
  132. "Service Herakles" ).PivotItems(AB.Name).Visible = True
  133. End With
  134. Else:
  135. With ActiveSheet.PivotTables("Tableau croisé dynamique1" ).PivotFields( _
  136. "Service Herakles" )
  137. .PivotItems(AB.Name).Visible = False
  138. End With
  139. End If
  140. Next AB


 
 
Cordialement.
 
 
Yannick


Message édité par yanounou91 le 19-12-2014 à 19:11:47
Reply

Marsh Posté le 19-12-2014 à 19:11:06   

Reply

Marsh Posté le 26-12-2014 à 12:50:22    

 
           Bonjour, bonjour !
 
           Il n'y a rien dans les lignes indiquées provoquant une telle erreur …
           Tu t'es certainement trompé dans les numéros de lignes car déjà l'une d'entre-elles est vide ! :sarcastic:  
           Contrôle dans le code affiché le n° de la ligne déclenchant l'erreur par rapport à la ligne surlignée dans le VBE …
 
           Les TCD ont effectivement évolués dans la version 2010 tout comme dans la version 2013.
           Voir donc chez Microsoft la documentation relative aux nouveautés de la version …
 

Reply

Marsh Posté le 26-12-2014 à 20:55:51    

Salut, même avant ça : par exemple sous 2003 PivotItems(i).Value = (vide) est devenu sous 2007 (blank)


---------------
Myanmar 90/91 : http://gadaud.gerard.free.fr/publi [...] index.html
Reply

Marsh Posté le 27-12-2014 à 10:27:07    

Bonjour,
 
Je vous remercie de m'avoir répondu.
 
Et effectivement, les lignes qui resortent en erreur sont les 137 et 138. Sinon, dans mon post original j'ai oublié de dire que j'avais testé le code avec "Blank" au lieu de "vide" sans que cela résolve le problème.
 
Aussi, ce code fonctionne tres bien sur VAB 2007 et VBA 2003, c'est seulement sur VBA 2010 qu'il y a probleme.
 
Marc L, j'ai essayé de cherché, les différences sur la codification des TCD entre VBA 2007 et 2010 mais je n'ai rien trouvé concernant les filtres sur les valeurs de champs d'un TCD. Et je pense que c'est la que ca pose probleme. Mais merci pour la piste au sujet de la doc Microsoft, il ne me reste qu'à trouver ça.
 
Cordialement.
 
 
Yannick

Reply

Marsh Posté le 27-12-2014 à 12:15:25    

 
           Vu la ligne n°135 For Each AB in Activesheet.PivotTables … .PivotItems, pourquoi en lignes 137-139
           répéter tout le chemin alors que la variable objet AB pointe déjà sur un élément de la collection PivotItems ?!
           Du genre AB.Visible = True … Sinon à quoi bon utiliser For Each !
 
           Tout le bloc des lignes n°136 à 145 peut se réduire en une seule ligne : AB.Visible = AB.Name <> "(vide)"
 
           Sinon insérer juste entre les lignes 135 & 136 une ligne Debug.Print AB.Name permettant de visualiser dans la fenêtre VBE
           Exécution (Ctrl + G) le nom de chacun des éléments et lors d'une erreur, vérifier le dernier de la liste, le B-A-BA du débogage …
 

Reply

Marsh Posté le 27-12-2014 à 12:36:30    

Je vous remercie pour la réponse.
 
En simplifiant peut être que VBA 2010 fera fonctionner le code. Les versions précédentes étaient plus indulgentes. Des que je retourne au boulot et retrouve mon va 2010, je testerai la solution. A la base je recrivais la ligne de code pour lui dire où aller chercher la valeur "vide". Je veux dire dans quel champ aller filtrer la valeur vide.
 
Cordialement.

Reply

Marsh Posté le 27-12-2014 à 12:55:32    

 
           Vu que ton problème est au cours sur un autre forum, cas évident de cross-posting sauvage peu apprécié sur les forums,
           je te laisse continuer sur l'autre forum …
 

Reply

Marsh Posté le 27-12-2014 à 15:45:17    

Une solution sur ce forum pourrait être mieux comprise. Je comprends ta remarque. Mais je te promets qu'il arrive souvent.que pour un même problème, une réponse soit mieux comprise qu'une autre par les débutants. Parfois en cherchant sur un forum on ne parviens pas à adapter la réponse à notre cas alors qu'une autre réponse sera plus adaptable.  
 
Je te remercie pour tes réponses en tout cas.
 
Cordialement

Reply

Marsh Posté le 27-12-2014 à 19:13:48    

 
           Même si les lignes n°137 à 139 ne sont pas propres - à comparer avec les lignes n°141 à 144 - il semblerait qu'il s'agisse d'un bug,
           voie vers laquelle se tourne l'autre forum. Donc aucun intérêt de continuer en double ici …


Message édité par Marc L le 27-12-2014 à 23:11:19
Reply

Sujets relatifs:

Leave a Replay

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