PowerPoint VBA / VSTO有未来吗?

时间:2009-11-11 14:26:09

标签: vba vsto powerpoint powerpoint-vba

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

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

4 个答案:

答案 0 :(得分: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
    
  3. 在常规模块中,您可以使用以下命令启动/停止事件处理:

    Public newPPTEvents As New clsPPTEvents
    Sub StartEvents()
        Set newPPTEvents.PPTEvent = Application
    End Sub
    Sub EndEvents()
        Set newPPTEvents.PPTEvent = Nothing
    End Sub
    
  4. 请注意,在#2中的代码中,由于GetCursorPos返回的内容,它不起作用,即屏幕X,Y。在查看事件时,看起来GetChartElement需要的是Window或Pane边界框的坐标或只是图表本身。

答案 1 :(得分:4)

Powerpoint从未成为VBA开发的热门平台。我可以理解在该上下文中删除VBA的UI功能。 Tt非常容易包含VBA对Powerpoint的强大支持和Excel - 如果有的话,它不会很快消失。从长远来看,我的资金将用于传统支持,微软对问题的帮助很小甚至不存在。

请记住,MS完全是向后兼容性 - 当他们放弃时,他们会非常小心。

答案 2 :(得分:1)

我同意PPT远低于其他vba。最重要的是,它看起来像马车 Weird bug on powerpoint vba

模型事件很尴尬,就像没有自动执行一样 How to automatically trigger the App Object initialization in Powerpoint?

auto_open只能通过创建插件才能以一种环绕的方式实现接收你的ppt并且不知道如何安装插件的用户:(

答案 3 :(得分:0)

请参阅此article,了解为什么选择VSTO。与VBA for Excel相比,但同样适用于Powerpoint。

相关问题