在不打开图表工作簿或使其不可见的情况下更新 PowerPoint 图表


Sub OO()
Dim oPPApp As Object, oPPPrsn As Object, oPPSlide As Object
Dim oPPShape As Object
Dim FlName As String
'~~> Change this to the relevant file
FlName = "C:Userslich_Documentstest.pptx"

'~~> Establish an PowerPoint application object
On Error Resume Next
Set oPPApp = GetObject(, "PowerPoint.Application")
If Err.Number <> 0 Then
Set oPPApp = CreateObject("PowerPoint.Application")
End If
Err.Clear
On Error GoTo 0
oPPApp.Visible = True
Set oPPPrsn = oPPApp.Presentations.Open(FlName, WithWindow:=msoFalse) 
Set oPPSlide = oPPPrsn.Slides(2)
With oPPSlide.Shapes("Chart1").Chart.ChartData
.ActivateChartDataWindow
.Workbook.Worksheets("Sheet1").Range("B2").Value = 0.1231
.Workbook.Close
End With

End Sub

正如您在上面看到的,我正在尝试在 vba 中编辑图表数据。

但是由于我以后控制了许多图表,因此我想使工作簿不可见(或者如果可能的话根本不打开它(

With oPPSlide.Shapes("Chart1").Chart.ChartData
.ActivateChartDataWindow
.Workbook.Worksheets("Sheet1").Range("B2").Value = 0.1231
.Workbook.Close
End With

在此代码中,我通过"激活图表数据窗口"方法打开并更改我想要和关闭的数据。

有没有办法使窗口不可见或编辑数据甚至无需打开?

提前感谢您的帮助。

可以根据@mooseman的答案在不Activate的情况下更新现有图表数据。

但是,如果图表是新的/在运行时插入的,据我所知,这无法通过互操作完成,因为AddChart方法会添加图表并同时创建/激活 Excel 工作簿。虽然您可能不需要调用Activate方法,但无法插入或添加不涉及打开 Excel 实例的新图表。没有办法解决这个问题,这就是 UI 的功能,而且是设计使然。

更新现有Chart/ChartData中的数据

低于本机PowerPoint VBA,但应通过适当的参考轻松移植到Excel

Sub test()
Dim PPT As PowerPoint.Application
Dim pres As Presentation
Dim sld As Slide
Dim shp As Shape
Dim cht As Chart
Dim rng As Object ' Excel.Range

Set PPT = Application 'GetObject(,"PowerPoint.Application")
Set pres = ActivePresentation
Set sld = pres.Slides(1)
Set shp = sld.Shapes(1)
Set cht = shp.Chart

Call changeData(cht, 6.3)

pres.Slides.AddSlide pres.Slides.Count + 1, sld.CustomLayout
Set sld = pres.Slides(pres.Slides.Count)
sld.Shapes.AddChart().Chart.ChartData.Workbook.Application.WindowState = -4140

Set cht = sld.Shapes(1).Chart
Call changeData(cht, 3.9)

End Sub
Sub changeData(c As Chart, v As Double)
Dim rng As Object
With c.ChartData
Set rng = .Workbook.Worksheets(1).ListObjects(1).Range
rng.Cells(2, 2).Value = v ' etc.
.Workbook.Close
End With
End Sub

要求是在 VBA 中使用With块。

一些简短的测试表明,这也可以通过 python 的 Interop 使用win32com来实现:

from win32com import client
ppt = client.Dispatch("PowerPoint.Application")
pres = ppt.ActivePresentation
sld = pres.Slides[0]
cht = sld.Shapes[0].Chart
cht.ChartData.Workbook.Worksheets[0].ListObjects[0].Range.Cells(2,2).Value = 9

同样在 C# 中:

using Microsoft.Office.Interop.PowerPoint;
public static void foo(int value = 10)
{
Application ppt = new Microsoft.Office.Interop.PowerPoint.Application();
Presentation pres = ppt.ActivePresentation;
Slide sld = pres.Slides[1];
Chart cht = sld.Shapes[1].Chart;
{
cht.ChartData
.Workbook.Worksheets[1].ListObjects[1].Range.Cells(2, 2).Value = value;
}
}

要最小化ChartData/Workbook窗口:

在实践中,我没有使用With方法的可靠运气。如果您无法使其工作,那么下一个最佳选择是立即最小化窗口:

Sub changeData(c As Chart, v As Double)
Dim rng As Object
With c.ChartData
.Activate
.Workbook.Application.WindowState = -4140 '## Minimize Excel
'## DO STUFF:
Set rng = .Workbook.Worksheets(1).ListObjects(1).Range
rng.Cells(2, 2).Value = v ' etc.
.Workbook.Close
End With
End Sub

请注意,此方法确实会在屏幕上短暂闪烁Excel,这很糟糕,因为在那短暂的瞬间,它可以拦截击键/等。

您无需激活图表数据工作表即可对其进行更改。

With oPPSlide.Shapes("Chart1").Chart.ChartData
'this updates the value in the datasheet
.Workbook.Sheets(1).Range("B2").Value = 0.1231 
End with

您还可以将图表数据表设置为等于 Excel 工作表中的范围

path2 = "C:JohnDoeVasquez_061118.xlsm"
Set xlWorkBook = Workbooks.Open(FileName:=path2, ReadOnly:=True)
With oPPSlide.Shapes("Chart1").Chart.ChartData
'this updates the value in the datasheet
.Workbook.Sheets(1).Range("A1:B2").Value = xlWorkBook.Sheets(1).Range("A2:B3").Value
End With

最新更新