PowerPoint VBA/VSTO有未来吗?

Sam*_*sso 7 powerpoint vba vsto powerpoint-vba

有谁知道PowerPoint中的VBA/VSTO编程的未来是什么?我一直在研究Office自动化项目,发现使用PowerPoint特别令人沮丧,因为它似乎比Excel或Word中的VBA支持低一级.

感觉MS正试图逐步淘汰PowerPoints中对VBA的支持,因为他们在2007版本中放弃了宏录制,而对象模型缺少一些关键功能支持.

Tod*_*ain 8

我不确定这是否是您想要听到的答案,但使用VBA开发PowerPoint实际上是好的.我做了很多(以及Word和Excel)并且它足够强大.可以使用VBA编程的PowerPoint OM随每个新版本的PPT更新.在PPT 2007中,您可以针对幻灯片上的任何对象创建自定义XML - 远比Excel和Word中可用的选项强大.相比之下,Word 2007具有内容控件,为了使PPT成为某种Crystal Reports轻量级替代品,它将从中受益.例如,在PPT 2010(测试版)中,您可以使用Word/Excel 2010以编程方式创建SmartArt.您还可以以编程方式更好地使用媒体元素.从OM的角度来看,VSTO并不比VBA提供更多的功能.

它可能仅取决于您的需求 - 您是否创建标准子弹幻灯片?你做扩展动画吗?你做报道吗?你在创建电子学习"应用程序"吗?如果您对OM有特定问题,我们可以尝试在这里为您提供帮助(但可能该功能不存在).

同意删除宏记录器的类型,这是一个有用的功能.直接使用PML/DML也很痛苦.有些事情我希望OM也支持.但与洞穴探险同时发生,我不相信VBA会很快消失.


注意:这不起作用.它只是作为一个起点提供,如果民众想要尝试将其发展为可能有用的东西(如果你可以使它工作,请随时编辑这篇文章).

  1. 创建一个名为"clsPPTEvents"的类
  2. 粘贴以下代码.

    Public WithEvents PPTEvent As Application
    Private Declare Function GetCursorPos Lib "user32" (ByVal lpPoint As POINTAPI) As Long
    Private Type POINTAPI
        x As Long
        y As Long
    End Type
    Dim ret As Long
    Dim mousePosition As POINTAPI
    Private Sub PPTEvent_WindowSelectionChange(ByVal Sel As Selection)
        Dim ElementID As Long
        Dim Arg1 As Long
        Dim Arg2 As Long
        With Sel
            If .Type = ppSelectionShapes Then
                Dim sr As ShapeRange
                sr = .ShapeRange
                If sr.Type = msoChart Then
                    Dim sh As Shape
                    Dim slideNumber As Integer
                    slideNumber = ActiveWindow.View.Slide.SlideIndex
                    sh = ActivePresentation.Slides(slideNumber).Shapes(sr.Name)
                    Dim crt As Chart
                    crt = sh.Chart
                    H = ActiveWindow.Height
                    w = ActiveWindow.Width
                    ret = GetCursorPos(mousePosition)
                    x = mousePosition.x
                    y = mousePosition.y
                    crt.GetChartElement(x, y, ElementID, Arg1, Arg2)
                    MsgBox("X: " & x & ", Y: " & y & vbNewLine & _
                    "ElementID: " & ElementID & ", Arg1: " & Arg1 & ", Arg2: " & Arg2)
                End If
            End If
        End With
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在常规模块中,您可以使用以下命令启动/停止事件处理:

    Public newPPTEvents As New clsPPTEvents
    Sub StartEvents()
        Set newPPTEvents.PPTEvent = Application
    End Sub
    Sub EndEvents()
        Set newPPTEvents.PPTEvent = Nothing
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)

请注意,在#2中的代码中,它不起作用,因为GetCursorPos返回的是屏幕X,Y.在查看事件时,看起来GetChartElement想要的是Window或Pane边界框的坐标或只是图表本身.