在不打开图表工作簿或使其不可见的情况下更新 PowerPoint 图表
Posted
技术标签:
【中文标题】在不打开图表工作簿或使其不可见的情况下更新 PowerPoint 图表【英文标题】:Update PowerPoint chart without opening chart workbook or making it invisible 【发布时间】:2018-11-20 05:53:19 【问题描述】: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:\Users\lich_\Documents\test.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
在这段代码中,我通过“ActivateChartDataWindow”方法打开并更改我想要的数据并关闭。
有没有什么办法可以让窗口不可见或在不打开的情况下编辑数据?
提前感谢您的帮助。
【问题讨论】:
Antonio,看看我下面的解决方案。虽然有时可以在不打开 Excel 的情况下编辑现有图表数据(我的回答中给出了示例),但实际上并不总是可能的。在这种情况下,您可以最小化 Excel 窗口。 @DavidZemens Thx,我会仔细看看! 【参考方案1】:您无需激活图表数据工作表即可对其进行更改。
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:\JohnDoe\Vasquez_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
【讨论】:
您好,我删除了句子(.ActivateChartDataWindow .Workbook.Close) 并且出现错误,这是对象'ChartData'的方法'Workbook'失败 msdn.microsoft.com/en-us/vba/powerpoint-vba/articles/…这里可以看到备注(备注说明在引用该属性之前必须调用Activate方法,否则会出错)【参考方案2】:根据@mooseman 的回答,可以在没有Activate
的情况下更新现有图表数据。
但是,如果图表是在运行时新建/插入的,据我所知,这无法通过互操作完成,因为 AddChart
方法会添加图表并同时创建/激活 Excel 工作簿。虽然您可能不需要调用Activate
方法,但无法插入 或添加不涉及打开 Excel 实例的新图表。没有办法解决这个问题,这就是 UI 的功能和设计。
更新 EXISTING 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,而这很糟糕因为在那短暂的瞬间,它可以拦截击键/等等。
【讨论】:
非常感谢您的详细回答。由于我使用 Excel vba 来控制 PPT,所以最小化选项是最有效的。太感谢了。祝你有美好的一天:)以上是关于在不打开图表工作簿或使其不可见的情况下更新 PowerPoint 图表的主要内容,如果未能解决你的问题,请参考以下文章
如何在不将控制器添加到视图层次结构并使其可见的情况下从 UIViewController 获取 UIView?
自定义 UINavigationBar 使其不可见,但保持按钮可见