在不打开图表工作簿或使其不可见的情况下更新 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 图表的主要内容,如果未能解决你的问题,请参考以下文章

如何手动设置 TitlePane 高度或使其适应其内容

如何在不将控制器添加到视图层次结构并使其可见的情况下从 UIViewController 获取 UIView?

自定义 UINavigationBar 使其不可见,但保持按钮可见

如何在不刷新 php 页面的情况下更新/移动我的 canvasjs 图表

显示/隐藏弹出窗口后防止生成 WM_MOUSEMOVE

在不删除数据的情况下更新数据库架构?