Probléme Création de TCD sous VBA

balou88

XLDnaute Nouveau
Bonjour à tout les membres de XLD,


J'ai actuellement un probléme sur un code VBA qui me permet de créer un TCD sur un fichier à partir d'une feuille d'un autre fichier. Etant assez novice en VBA, j'ai utilisé l'option enregistreur de Macro malheuresement un message d'erreur apparait lorsque je relance mon pgm à partir d'un bouton : "Erreur d'execution 5 : Argument ou appel de procédure incorrect"

Un probléme fréquent pour la création de TCD me direz vous, j'ai pu remarquer sur différents forum que pas mal de personnes étaient confrontées à ce pb, sans pour autant pouvoir trouver la solution au mien.

j'ai renommé mon TCD créé afin d'éviter les problémes du genre "Tableau croisé dynamiqueN" n'éxiste pas...mais rien y fait et je m'arrache les cheveux depuis environ 2 semaines!! Je vous copie/colle mon pgm en éspérant qu'une âme charritable pourra m'aider!


Code:
Sub Indicateur_perf()


'Ouverture de la base de contrôle#####

filetoopen = Application.GetOpenFilename("Fichiers Excel(*.xls;*.xlsx;*.xlsm), *.xls", , "Choisir le fichier à ouvrir")
If filetoopen = False Then
MsgBox "Operation annulée", vbExclamation
Exit Sub
End If
Workbooks.Open filetoopen
 
'Création du TCD

    Windows("mon_fichier_base").Activate
    Workbooks("mon_fichier_destination") _
        .PivotCaches.Add(SourceType:=xlDatabase, _
    SourceData:="[mon_fichier_base]Base!R18C1:R4122C57").CreatePivotTable _
    TableDestination:="[mon_fichier_destination]Feuil1!R1C1", _
        TableName:="TCD_Col", DefaultVersion:=xlPivotTableVersion12_

    Windows("mon_fichier_destination"). _
        Activate
    Sheets("Feuil1").Select
    Cells(1, 1).Select
    
'Mise en place des données

    With ActiveSheet.PivotTables("TCD_Col").PivotFields("Mois")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("TCD_Col").PivotFields("Mois")
        .Orientation = xlPageField
        .Position = 1
    End With
    ActiveWindow.SmallScroll Down:=-15
    With ActiveSheet.PivotTables("TCD_Col").PivotFields( _
        "Collection")
        .Orientation = xlRowField
        .Position = 1
    End With
    ActiveSheet.PivotTables("TCD_Col").AddDataField ActiveSheet. _
        PivotTables("TCD_Col").PivotFields("Quantité fabriquée"), _
        "Nombre de Quantité fabriquée", xlCount
    With ActiveSheet.PivotTables("TCD_Col").PivotFields( _
        "Nombre de Quantité fabriquée")
        .Caption = "Somme de Quantité fabriquée"
        .Function = xlSum
    End With
    ActiveSheet.PivotTables("TCD_Col").AddDataField ActiveSheet. _
        PivotTables("TCD_Col").PivotFields("Quantité contrôlée"), _
        "Nombre de Quantité contrôlée", xlCount
    ActiveSheet.PivotTables("TCD_Col").AddDataField ActiveSheet. _
        PivotTables("TCD_Col").PivotFields( _
        "Quantité refusé / contrôlée"), "Nombre de Quantité refusé / contrôlée", _
        xlCount
    With ActiveSheet.PivotTables("TCD_Col").PivotFields( _
        "Nombre de Quantité contrôlée")
        .Caption = "Somme de Quantité contrôlée"
        .Function = xlSum
    End With
End Sub


Il semblerai que l'erreur se situe au niveau de: "DefaultVersion:=xlPivotTableVersion12_"

Et pour information j'utilise XL2007.


En espérant avoir été assez précis dans ma demande, j'éspére qu'une solution est possible!


merci à tous!


A+
 
G

Guest

Guest
Re : Probléme Création de TCD sous VBA

Bonjour,

Sans les fichiers, difficiles de savoir ce qui se passe.
Mais déjà ceci est faux (Trait de continuation de ligne ' _' en fin de creation de TCD):
Code:
 Workbooks("mon_fichier_destination") _
.PivotCaches.Add(SourceType:=xlDatabase, _
SourceData:="[mon_fichier_base]Base!R18C1:R4122C57").CreatePivotTable _
TableDestination:="[mon_fichier_destination]Feuil1!R1C1", _
TableName:="TCD_Col", DefaultVersion:=xlPivotTableVersion12_ 'ici _ n'a pas sa place'

Remplacer par
Code:
Workbooks("mon_fichier_destination") _
.PivotCaches.Add(SourceType:=xlDatabase, _
SourceData:="[mon_fichier_base]Base!R18C1:R4122C57").CreatePivotTable _
TableDestination:="[mon_fichier_destination]Feuil1!R1C1", _
TableName:="TCD_Col", DefaultVersion:=xlPivotTableVersion12

A+
 

balou88

XLDnaute Nouveau
Re : Probléme Création de TCD sous VBA

Merci pour ce conseil.

Malheuresment ce n'était pas la solution miracle :)

Je ne peux pas ajouter les fichiers étant donné que ceux-ci sont plus ou moins confidentiels.
Si ça peut t'aider dans le Déboggueur il me met "xlPivotTableVersion12=3" quand je passe ma souris dessus.

Est ce vraiment possible de créer un TCD dans un fichier, pointant sur un autre fichier XL? C'est peut être simplement ça mon pb?
 
G

Guest

Guest
Re : Probléme Création de TCD sous VBA

Re,

Oui c'est possible en créant une connexion au fichier source et en utilisant cette connexion:

Code:
'
    Workbooks("Classeur2").Connections.Add "DatasTcdTest", _
        "Source de données TCD test", Array(Array( _
        "ODBC;DSN=Fichiers Excel;DBQ=C:\Users\User\Downloads\Datas.xls;DefaultDir=C:\Users\User\Downloads;DriverId=790;MaxBufferSize=2048" _
        ), Array(";PageTimeout=5;")), Array("SELECT * FROM `C:\Users\User\Downloads\Datas`.`'Feuille de donnée$'`"), 2
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlExternal, SourceData:= _
        ActiveWorkbook.Connections("DatasTcdTest"), Version:=xlPivotTableVersion12). _
        CreatePivotTable TableDestination:="Feuil1!R3C2", TableName:= _
        "Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion12

Je te conseille de le faire avec l'enregistreur de macro auparavant, pour créer la connexion aux données et construire la requête SQL idoine ("SELECT.....")

Dans le classeur 2007 Destination du tableau croisé dynamique:
Onglet 'Données'/groupe 'Données Externes'/Bouton 'A partir d'autres sources'
choisir "Provenance: Assistant connexion de données".
Dans la fenêtre qui s'ouvre choisir : "DNS ODBC"
Puis à l'étape suivant : "Fichier Excel"
Et se laisser guider par l'assistant.

A+
 

balou88

XLDnaute Nouveau
Re : Probléme Création de TCD sous VBA

Merci bien pour cette information.
Mais la connection entre mes deux fichiers était impossible du fait de la taille de ma Source (6millions de connections et des poussiéres et puis plantage^^)
Du coup je fait un copier/coller de ma source vers ma destination avec un collage spéciale de mes valeurs, et crée mon TCD à partir de cette "base_copié" avant de cacher la feuille contenant celle-ci.
C'est un peu moins élégant mais ça fonctionne tout aussi bien :p

J'aurai une autre question, au sujet de mon TCD. Je créer un filtre de champs ( cf sur les mois.) et j'aimerai déselectionner toutes les valeurs de ce filtre. comment faire?

en gros si ça peut être plus claire, je voudrai faire ceci :

Code:
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Mois").PivotItems(All).Visible = False

Mais je sais bien que ce code est faux!


Merci d'avance!!

A+
 
G

Guest

Guest
Re : Probléme Création de TCD sous VBA

Bonjour,

Pas vérifier mais cela devrait être:
Code:
Dim pvi as variant
For each pvi in ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Mois").PivotItems
  pvi.Visible = false
Next
A+
 

balou88

XLDnaute Nouveau
Re : Probléme Création de TCD sous VBA

Merci bien pour la réponse.
Malheuresment sous Excel2007 on ne peut pas décocher toutes les données du filtre d'un TCD, ce qui implique que ton code plante.
J'aimerai savoir si il est possible d'extraire de ton pvi, dans ta boucle For, la valeur "(vide)" ou "(blanck)" ce qui réglerai mon probléme étant donné que ce critére ne contient pas de donné!

En fait pour être plus claire sur mon pb, je voudrai faire des tableaux pour chaque mois, le probléme est que ma base de données se mets à jour mensuellement, et que donc à l'heure d'aujourd'hui le mois de "Octobre" (par exemple :) ) n'éxiste pas...et donc je ne peux pas lui demander de faire "(Octobre)".Visible=False!


j'éspére avoir été claire!


Merci bien!
 
G

Guest

Guest
Re : Probléme Création de TCD sous VBA

Re,

Tu comprendras qu'il y a tellement de tcd différents et en conséquences tellement de possibilités, que je ne me lancerait pas là-dedans sans un exemple précis sous les yeux.

A+
 

Discussions similaires