Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Créer un TCD en vba dont le fichier source de données est variable

MaDesn

XLDnaute Nouveau
Bonjour à tous,

Mon entreprise reçoit chaque mois de nouvelles données et doit en faire un rapport précis. De ce fait, la construction de rapport sur l'excel qu'ils ont construit leur prend chaque mois une journée entière. Je viens d'arriver et ne suis chez eux que pour une courte période, mon objectif est donc de leur créer un tableau excel avec le plus d'étapes possibles automatisées pour leur faire gagner du temps.

En gros, chaque fois, ils téléchargent les données excels brutes du mois précédent. Mon objectif est leur créer un fichier excel où ils n'ont qu'à appuyer sur un bouton et à sélectionner le fichier qu'ils viennent de télécharger pour que leur TCD se fasse automatiquement, avec les bons filtres et que le reste de mes tableaux de rapport se remplissent automatiquement grâce au TCD.

Petite précision supplémentaire, le fichier de données qu'ils téléchargent chaque mois se construit toujours de la même façon et c'est toujours la même feuille qui les intéresse, elle s'appelle "ONICS 6$". Aussi, je sais que normalement on ne créé pas de TCD par VBA, mais mon but ici est de vraiment leur simplifier le travail au maximum pour que cette tâche leur prenne moins de cinq minutes?

Voilà le code que j'ai créé pour leur faire sélectionner le dossier de donnée du mois (sachant que dans le fichier excel où se trouveront les TCD, il y aura déjà une feuille par mois de programmées) :

VB:
Sub CreerTCD()

Dim boiteDialogue As FileDialog
Dim chemin_dossier As String
Dim chemin_feuille As String

'demander à l'utilisateur de sélectionner un dossier
Set boiteDialogue = Application.FileDialog(msoFileDialogFilePicker)
boiteDialogue.AllowMultiSelect = False
boiteDialogue.Title = "Merci de sélectionner le dossier avec les données du mois"
boiteDialogue.Show

'vérifier qu'un dossier a été sélectionné
If boiteDialogue.SelectedItems(1) = "" Then
    MsgBox ("Merci de sélectionner le dossier avec les données du mois")
   
    Else
   
'trouver le chemin du dossier
chemin_dossier = boiteDialogue.SelectedItems(1)

Cells(1, 3).Select
Cells(1, 3).Value = chemin_dossier

End If
End Sub

Ma question est donc, quel code utiliser pour créer le TCD en fonction du chemin_dossier ?

Voici le code que j'ai tenté mais qui ne marche pas :

Code:
Workbooks("TCD RU01.xlsx").Connections.Add("Données",Array( _
"OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source="chemin_dossier &";Mode=Share Deny Write;Extende" _
        , _
        "d Properties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine " _
        , _
        "Type=37;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New" _
        , _
        " Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Com" _
        , _
        "pact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Byp" _
        , "ass UserInfo Validation=False"), Array("'ONICS 6$'"), 3"
       
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlExternal, SourceData:= _
        ActiveWorkbook.Connections("202008"), Version:=xlPivotTableVersion14). _
        CreatePivotTable TableDestination:="0820!R1C4", TableName:= _
        "Tableau croisé dynamique2", DefaultVersion:=xlPivotTableVersion14
       
       
    Cells(1, 4).Select
    ActiveWorkbook.ShowPivotTableFieldList = True
    ActiveSheet.PivotTables("Tableau croisé dynamique2").AddDataField ActiveSheet. _
        PivotTables("Tableau croisé dynamique2").PivotFields("Numéro de la demande"), _
        "Nombre de Numéro de la demande", xlCount
    With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
        "Région concernée")
        .Orientation = xlPageField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
        "Ligne concernée")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Motif")
        .Orientation = xlColumnField
        .Position = 1
    End With
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 3
    ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
        "Région concernée").ClearAllFilters
    ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
        "Région concernée").CurrentPage = "Hauts-de-France"
 

chris

XLDnaute Barbatruc
Bonjour

Sur tous les forums on te conseilleras de ne pas créer de TCD par VBA.

On crée un TCD manuellement une fois pour toutes et on en change simplement la source ou mieux on le batit sur une fichier externe qui, écrasé au fil du temps par les nouvelles données, sera automatiquement restitué.

Depuis la version 2010, on dispose de PowerQuery (en add on puis intégré à partir de 2016) qui facilite encore plus ce process
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…