Macro pour mettre à jour des graphiques sur PowerPoint à partir d'une feuille Excel

amine00z

XLDnaute Nouveau
Bonjour tout le monde, j'ai besoin de votre aide précieuse.

Voilà, j'arrive à me débrouiller avec VBA sur Excel mais là, ça touche un peu à PowerPoint donc je suis un peu pérdu :(.

Donc, tout ce que je veux faire c'est écrire une code qui permette de :

- Afficher une boîte de dialogue "Ouvrir" un fichier .pptx
- Parcourir tous les diapos de ce fichier .pptx, (ça doit être quelque chose comme "for each slide in ...")
- Parcourir tous les objets de la diapo et repérer les objets graphiques.
- Pour chaque graphique rencontré mettre à jour les données à partir du fichier excel qui contient la macro (quand c'est fait manuellement c'est : clic droit sur le graphique > modifier les données... > une feuille excel apparaît et la on modifie ce que l'on veut)

ça à l'air très simple, le problème c'est que je ne connais pas la terminologie des objets PowerPoint et tout ça :(.

Je ne peux pas utiliser la célèbre astuce "coller avec liaison" le graphique à partir d'Excel pour des raisons longues à expliquer, je vous épargne les détails.

Je vous remercie infiniment pour votre aide :)
 

amine00z

XLDnaute Nouveau
Re : Macro pour mettre à jour des graphiques sur PowerPoint à partir d'une feuille Ex

Merci beaucoup Pierre
Je suis entrain de suivre la piste, mais déjà j'ai un problème avec la première ligne :
PPTApp As PowerPoint.Application génère l'erreur "Type défini par l'utilisateur non défini" :(

Edit : Ah non! j'ai activé la référence et là ça passe! Je m'y remet :)
 
Dernière édition:

amine00z

XLDnaute Nouveau
Re : Macro pour mettre à jour des graphiques sur PowerPoint à partir d'une feuille Ex

En fin de compte, ça ne m'aide pas beaucoup :(
ça sert plutôt à ajouter de nouvelles diapos et de nouveaux graphes, moi ce qu'il me faut c'est qque chose qui modifie les diapos et les graphes déjà existants. Et j'ai beau retourner le code dans touts les sens, c'est inadaptable à mes besoins.

Mais merci quand même :)
 

amine00z

XLDnaute Nouveau
Re : Macro pour mettre à jour des graphiques sur PowerPoint à partir d'une feuille Ex

Bonjour chris
C'est une longue histoire, pour résumer, disons que je serai obligé de supprimer des diapos, d'en dupliquer d'autres, et de changer leur ordre au fil du temps, (je n'ai pas le choix, sinon je serai obligé de me retaper des mise en formes, des ajouts d'images et un tas d'autres taches répétitives, alors qu'un simple copier coller me fait gagner énormément de temps) et le faisant je vais perdre mes précieuses liaisons.

Voilà le structure du code que je tente de réaliser
Code:
Sub test()
Dim PPTApp As PowerPoint.Application
Dim PPTDoc As PowerPoint.Presentation
Dim myChart As Chart
Dim gChartData As ChartData
Dim gWorkBook As Excel.Workbook
Dim gWorkSheet As Excel.Worksheet


Set PPTApp = CreateObject("PowerPoint.application")
     PPTApp.Visible = True
     Set PPTDoc = PPTApp.Presentations.Open("C:\Users\HP\Desktop\Présentation1.pptx")
    
    
    ' Parcourir toutes les diapos
    For Each sld In PPTDoc.Slides

        ' Parcourir toutes les zones réservées
        For Each shp In sld.Shapes
        
            ' s'il y a un graphe
            If shp.HasChart = True Then
            Set myChart = shp.Chart
            Set gChartData = myChart.DataTable
            Set gWorkBook = gChartData.Workbook
            Set gWorkSheet = gWorkBook.Worksheets(1)
            gWorkSheet.Range("b2:c14").Value = ThisWorkbook.ActiveSheet.Range("a2:b14")
            
            End If
            
        Next shp
    
    Next sld


End Sub

J'ai le message d'erreur "incompatibilité de type" ici
Code:
Set myChart = shp.Chart
ça m'énerve je ne trouve pas de solution :mad:
 

amine00z

XLDnaute Nouveau
Re : Macro pour mettre à jour des graphiques sur PowerPoint à partir d'une feuille Ex

même avec
Code:
Dim shp As PowerPoint.Shape
j'ai la même erreur. :mad:
En faite l'idée est simple :
Boucler sur toutes les slides
Boucler sur toutes les shapes
Si une shape est un graphique alors faire la bidouille.

Ce qui m'étonne, c'est que le même code, transposé sur PowerPoint, c'est à dire avec
Code:
Dim wb As Excel.Workbook
à la place de
Code:
Dim PPTDoc As PowerPoint.Presentation
etc. et bien il marche parfaitement !!!
 

Staple1600

XLDnaute Barbatruc
Re : Macro pour mettre à jour des graphiques sur PowerPoint à partir d'une feuille Ex

Bonsoir à tous, tatiak, chris

anime00z
Un powerpoint et un fichier Excel joints (au préalable anonymisés) ne devraient-ils pas être non préjudiciables à la résolution de ta question ? ;)
On aurait déjà une base sur laquelle faire nos tests, non ?
 

amine00z

XLDnaute Nouveau
Re : Macro pour mettre à jour des graphiques sur PowerPoint à partir d'une feuille Ex

@tatiak
La condition
Code:
If Sh.Type = msoEmbeddedOLEObject Then
renvoie false car Sh.Type dans ma présentation = 14 alors que msoEmbeddedOLEObject=7 d'après la débug.

@Staple1600
Bonsoir :)
J'utilise des fichiers génériques, n'importe quel fichier pptx avec des graphes et n'importe quel fichier excel avec des données aléatoires font l'affaire, mais bon, si tu juges que c'est utile les voici

voici le code que j'utilises actuellement, sur PowerPoint pas sur Excel, et qui marche parfaitement, Je le poste à toute fin utile (bon il met les mêmes données sur tout les graphes, mais c'est juste un code de base, chacun l'adaptera à ses besoins) :
Il faut activer la référence Microsoft Excel xx Object Libraray sur PowerPoint
Mettre le chemin du fichier Excel qui contient les données à importer, lancer le code et le tour est joué
Code:
Sub UpdateData()
Dim ocht As Chart
Dim oshp As Shape
Dim osld As Slide
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim strText As String

Set ExcelApp = CreateObject("Excel.application")
ExcelApp.Visible = True
Set ExcelWorkbook = ExcelApp.Workbooks.Open("C:\chemin du fichier data.xlsx ...")


For Each osld In ActivePresentation.Slides
    For Each oshp In osld.Shapes
        If oshp.HasChart Then
        Set ocht = oshp.Chart
        ocht.ChartData.Activate
        Set wb = ocht.ChartData.Workbook
        Set ws = wb.Worksheets(1)
        ExcelWorkbook.Activate
        ws.Range("B2:D5").Value = ExcelWorkbook.Worksheets(1).Range("B2:D5").Value
        ocht.Refresh
        wb.Close
        End If
    Next oshp
Next osld

End Sub

Je crois que je vais abandonner l'idée de faire un code qui marche sur Excel, vu que celui la fait l'affaire sur PowerPoint
 

Pièces jointes

  • Nouveau Archive WinRAR ZIP (2).zip
    73.6 KB · Affichages: 62
  • Nouveau Archive WinRAR ZIP (2).zip
    73.6 KB · Affichages: 57
  • Nouveau Archive WinRAR ZIP (2).zip
    73.6 KB · Affichages: 58

Discussions similaires

Statistiques des forums

Discussions
311 741
Messages
2 082 055
Membres
101 882
dernier inscrit
XaK_