【问题标题】:Is there a future for PowerPoint VBA/VSTO? [closed]PowerPoint VBA/VSTO 有前途吗? [关闭]
【发布时间】:2009-11-11 14:26:08
【问题描述】:

有人知道在 PowerPoint 中进行 VBA/VSTO 编程的未来会怎样吗?我一直在从事一个 Office 自动化项目,发现使用 PowerPoint 尤其令人沮丧,因为它似乎比 Excel 或 Word 中的 VBA 支持低一级。

感觉就像 MS 正试图在 PowerPoint 中逐步取消对 VBA 的支持,因为他们在 2007 版中放弃了宏录制并且对象模型缺乏一些关键功能支持。

【问题讨论】:

  • 这已经很老了,但对于正在寻找以编程方式使用 PowerPoint(或其他 Office 程序)的方法的其他人(比如我自己)来说,这可能会感兴趣:github.com/NetOfficeFw/NetOffice

标签: vba vsto powerpoint


【解决方案1】:

我不确定这是否是您想听到的答案,但在 PowerPoint 中使用 VBA 进行开发实际上是不错的。我做了很多(以及 Word 和 Excel),它足够强大。可以使用 VBA 进行编程的 PowerPoint OM 会随着每个新版本的 PPT 进行更新。在 PPT 2007 中,您可以针对幻灯片上的 any 对象创建自定义 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
    

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

【讨论】:

  • 感谢宅男和洞穴的回复!在我们公司,我们做了很多带有嵌入式图表的演示,这是一个痛苦的发展。 2007 SP2 改进了 OM (+) 并导致更多图表崩溃 (-),但它们仍然存在差距。示例:您可以知道用户点击了图表,但您无法知道选择了哪个图表元素。 2010 年我还没有尝试过。
  • 我对此做了更多检查。看来,虽然 GetChartElement 方法在 PPT 中可用,但由于缺少任何可以提供正确(窗口,而不是屏幕)X、Y 坐标的事件,它不能(很容易?)被访问。有很多示例适用于 Excel,但相同的示例在 PowerPoint 中不起作用。我尝试使用 GetCursorPos API 调用和 WindowSelectionChange 事件来获取 X、Y 值,但运气不佳。微软似乎完全疏忽了这种方法,使这种方法可用,但在 PowerPoint 中却毫无用处。
【解决方案2】:

Powerpoint 从来都不是 VBA 开发的流行平台。我可以理解在这种情况下删除 VBA 的 UI 功能。 Tt 很容易在 Excel 和 Word 的基础上包含对 Powerpoint 的 VBA 支持 - 如果有的话,这不会很快消失。从长远来看,我的钱将用于遗留支持,微软对问题的帮助很差甚至根本不存在。

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

【讨论】:

  • 我认为这些 cmets 在很大程度上是正确的。我认为宏记录器的问题虽然更复杂。如果您深入挖掘,您会发现来自 Microsoft 的各种参考资料,指出当他们在 2007 年重新制作 OM 的图表和形状部分时,这对宏记录器代码产生了影响。
【解决方案3】:

我同意 PPT 远低于其他 vba。最重要的是,它似乎有问题,请参阅 Weird bug on powerpoint vba

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

auto_open 只能以迂回的方式通过创建插件来实现

【讨论】:

  • 我不同意这个答案。似乎您在链接到的问题中得到了答案... skp.mvps.org/autoevents.htm 另外,为什么创建插件是“坏事”?在我工作过的几乎所有环境中,您都希望确保所有用户都可以访问代码,因此将代码与 ppt 文件一起打包是一种不好的做法。
【解决方案4】:

请参阅此article 以总结为什么 VSTO 是可行的方法。与 Excel 的 VBA 相比,但同样适用于 Powerpoint。

【讨论】:

  • 您的文章很好地讨论了 VBA 与 VSTO;然而,这并没有解决这个问题,它围绕着 PowerPoint 自动化及其支持展开。
  • 是的,我同意 Mathias 的观点,我觉得我真的应该对你投反对票,但链接质量很高。 :) 我敢肯定,如果你留下你的答案,其他人不会那么好。 xie xie 链接 Bhuvan
  • 2012 来了又去,现在有了 Office 2013 ......很好 以编程方式使用 DataModel OM 新的 DataModel 对象模型(VBA 对象模型的一部分)使您能够以编程方式加载和刷新数据来源。
  • 我们发现 VSTO 非常有限,并且仍然使用旧的 COM API。这很好用,你可以用 C# 编写整个东西。
猜你喜欢
  • 2011-03-17
  • 1970-01-01
  • 2010-11-07
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多