Rapport de tableau croisé dynamique [Résolu]

Signaler
Messages postés
12
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
27 mars 2007
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
Bonjour,

Je souhaite, depuis Visual Basic, créer un rapport de tableau croisé dynamique dans Excel.
Mon document Excel est déjà créé avec un onglet rempli des donnés qui me sont nécessaires.

Par où dois-je commencer ? Avez vous des codes d'exemples à me donner ? Quels sont les références et composants à insérer dans mon projet ?

Merci.
 

11 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Bienvenue,

Pour les prochains lecteurs, tu peux cliquer le bouton "Accepter..." sur la réponse qui a résolu ton problème.

MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Tu peux toujours rechercher avec ces mots
CreatePivotTable
PivotTables
PivotCaches
.....................donc, finalement, en recherchant Pivot tout court, tu trouveras certainement toutes sortes de codes...

Et tu peux aussi utiliser l'enregistreur de macro d'Excel, effectuer les tâches nécessaires, puis regarder le code et l'adapter.
À partir de ce code, il ne te reste qu'à l'insérer dans VB en utilisant tes objets WorkBook, WorkSheet,... préalablement créés.

MPi
Messages postés
12
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
27 mars 2007

Ok, merci de ton aide qui m'a servi à démarrer.


J'en suis là :


    
     Dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")

     Dim waExcel: Set waExcel = CreateObject("Excel.Application")

     StrPath = "C:\TEST"

    StrFich = "Test.txt"

     

     If FSO.FileExists(StrPath & StrFich) Then

     waExcel.Visible = True

     waExcel.Workbooks.OpenText StrPath & StrFich, , 2, , , False, False, True, False, False, False

     waExcel.Workbooks(StrFich).SaveAs StrPath & Left(StrFich, Len(StrFich) - 4) & ".xls", , , , , , 4

        End If

      

    waExcel.Workbooks.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _

     "Test!R1C1:R2182C13").CreatePivotTable TableDestination:="", _

     TableName:="Tableau croisé dynamique3"


Message d'erreur sur la partie en gras : "Erreur 438" Cet objet ne gère pas cette propriété ou méthode
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Ce petit bout de code fonctionne chez moi.
La plage de données qui doit servir à créer le tableau croisé doit contenir des entêtes. S'il n'y en a pas dans le fichier texte, il faudra les ajouter manuellement ou par code.
Il te restera ensuite à faire la disposition des champs...

Option Explicit

Private xlApp As Excel.Application
Private xlBook As Excel.Workbook
Private xlSheet As Excel.Worksheet

Private Sub Créer_Click()
    ' créer un nouveau fichier Excel
    ' à partir d'un fichier texte
    ' délimité avec des points-virgules

    Set xlApp = New Excel.Application
  
    ' Création - l'onglet par défaut se nomme comme le fichier => "Texte"
    xlApp.Workbooks.OpenText FileName:=App.Path & "\Texte.txt", DataType:=xlDelimited, SemiColon:=True
   
    ' Sauvegarder
    xlApp.ActiveWorkbook.SaveAs FileName:=App.Path & "\Test.xls", FileFormat:=xlExcel5
    xlApp.Visible = True
   
    'Création d'objets Excel
    Set xlBook = xlApp.ActiveWorkbook
    'Set xlSheet = xlApp.ActiveSheet   ' facultatif ici
   
    'sélectionne la plage s'il n'y a pas d'espaces
    Range("A1").CurrentRegion.Select      'facultatif, je pense
   
    'Création d'un tableau croisé dynamique
    xlBook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
     "Test!R1C1:R2182C13").CreatePivotTable TableDestination:="", _
     TableName:="Tableau croisé dynamique3"
    
End Sub

N'oublie pas, lorsque tu quittes le programme, de fermer l'application Excel et de tout mettre les objets utilisés = Nothing
    xlApp.Quit
    Set xlBook = Nothing
    Set xlApp = Nothing

MPi
Messages postés
12
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
27 mars 2007

xlBook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Test111!R1C1:R2182C13").CreatePivotTable TableDestination:="", _
TableName:="Tableau croisé dynamique3"

Je suis bloqué ici : Erreur d'execution 438, cet objet ne gère pas cette propriété ou méthode.

J'ai bien des entêtes dans mon fichier.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Est-ce que Test111 est bien le nom de l'onglet ?

Sinon, il faudrait que tu utilises une variable qui contiendrait le nom de l'onglet

MPi
Messages postés
12
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
27 mars 2007

Mon onglet est bien Test111 mais en fait mon problème vient avant cette partie là.

Quand je mets ça dans mon code :

Option Explicit

Private xlApp As Excel.Application
Private xlBook As Excel.Workbook
Private xlSheet As Excel.Worksheet

sur xlApp As Excel.Application, j'ai le message "Type défini par l'utilisateur non défini".
Faut-il mettre une référence, un composant ?

Merci à toi en tout cas, c'est très gentil de m'aider !
Messages postés
12
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
27 mars 2007

Ok, j'ai trouvé l'erreur :
Tout d'abord pour pouvoir utiliser Excel dans
un projet Visual Basic vous devez rajouter dans le menu
Projets - Références, Microsoft Excel x.x

Je continue ....
Messages postés
12
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
27 mars 2007

Ca fonctionne !!

Merci à toi.

Par contre dans la partie :
xlBook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Test!R1C1:R2182C13").CreatePivotTable TableDestination:="", _
TableName:="Tableau croisé dynamique3"

Le R1C1:R2182C13 me dérange, en effet ma source de données ne fera pas toujours le même nombre de lignes.
Comment lui faire sélectionner autrement le nombre de lignes ?
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Tu pourrais essayer quelque chose comme ça, si les données commencent toujours à la ligne 1
Dim Ligne as Long, Colonne as Integer
Ligne = Cells.find("*",Range("A1"),,,xlbyRows,xlPrevious).row
Colonne = Cells.Find("*", Range("A1"),,,xlbyColumns,xlPrevious).column
......
xlBook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Test!R1C1:R " & Ligne & " C" & Colonne).CreatePivotTable TableDestination: ="", _
TableName:="Tableau croisé dynamique3"

Je n'ai pas testé, mais ça devrait ressembler à ça

MPi
Messages postés
12
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
27 mars 2007

Ca fonctionne parfaitement MPi !

Mille mercis !