【问题标题】:How to add a shape in Powerpoint that calls a function (no macro)?如何在 Powerpoint 中添加调用函数(无宏)的形状?
【发布时间】:2015-07-18 11:03:40
【问题描述】:

我目前在一些视觉基础知识方面存在问题。我已使用以下代码成功地将形状添加到当前的 Powerpoint 幻灯片中:

dim pres as Microsoft.Office.Interop.Powerpoint
dim slide as pres.ActivePresentation.Slides(1)
With slide.Shapes.AddShape(Type:=Microsoft.Office.Core.MsoAutoShapeType.msoShapeActionButtonCustom, Left:=50, Top:= 50, Width:=70, Height:=30)
    .Name="Test"
End With

所以我现在要做的是该函数,无论何时(在演示模式下)单击它时,它都应该调用在同一类中定义的名为“test()”的 Sub。我做不到。我现在能做的就是使用以下代码从演示文稿中调用一个宏:

dim pres as Microsoft.Office.Interop.Powerpoint
dim slide as pres.ActivePresentation.Slides(1)
With slide.Shapes.AddShape(Type:=Microsoft.Office.Core.MsoAutoShapeType.msoShapeActionButtonCustom, Left:=50, Top:= 50, Width:=70, Height:=30)
    .Name="Test"
    With .ActionSettings(PowerPoint.PpMouseActivation.ppMouseClick)
        .Run = "test"
        .Action = PowerPoint.PpActionType.ppActionRunMacro
    End With
End With

但由于我的演示文稿中没有任何宏,这将导致错误。当我在 powerpoint 中使用集成的 Visual Basic 编辑器手动添加宏时,它会按照我的预期工作。

有没有什么方法可以直接从我的 Visual Basic 代码中调用 Sub 而无需创建宏?

我希望我说清楚了,你们理解我的问题。

提前致谢。

【问题讨论】:

    标签: vba shape powerpoint


    【解决方案1】:

    我偶然发现了我正在寻找的解决方案。我没有找到将动作引用到 powerpoint 形状的方法,但可以设法从 OLEObject 调用函数。 OLEObject 有处理程序,因此可以简单地使用点击事件。

    首先,您需要添加对 Forms 和 Visual basic for Application 的引用,只需添加即可

    Imports System.Windows.Forms
    Imports Microsoft.Vbe.Interop
    

    到您的代码。

    其次,您需要在幻灯片中添加一个 OLEObject CommandButton 并向其添加处理程序,您可以通过以下方式实现:

    Dim oshape As Microsoft.Office.Interop.PowerPoint.Shape = ppt.ActivePresentation.Slides(1).Shapes.AddOLEObject(Left:=100, Top:=100, _
            Width:=150, Height:=50, ClassName:="Forms.CommandButton.1")
        With oshape.OLEFormat.Object
            .Name = "Button1"
            .Caption = "Test"
            .Font.Bold = True
            .Font.Name = "Verdana"
            .Object.BackColor = RGB(25, 25, 50)
        End With
        AddHandler CType(oshape.OLEFormat.Object, MSForms.CommandButton).Click, _
              AddressOf Button1_Click
    

    我在vbarchiv 找到了一个非常有用的答案。

    感谢您的帮助

    【讨论】:

      【解决方案2】:

      您的代码是在启用宏的演示文稿或插件中运行的吗?

      我对你想做的事情的理解是这样的:

      1. 以编程方式向幻灯片添加形状,将其操作方法设置为运行宏“测试”,然后在幻灯片放映模式下单击。
      2. 以编程方式将宏“测试”添加到演示文稿中。

      如果正确,步骤 2 需要以下内容:

      1. 演示文稿 (.pptx) 被重新保存为启用宏的文件,例如.pptm、.potm、ppsm
      2. 该 PowerPoint 在文件/选项/信任中心/信任中心设置/开发者宏设置下设置为“信任对 VBA 项目对象模型的访问”
      3. 您添加对 Microsoft Visual Basic for Applications Extensibility 5.3 库的引用
      4. 那你然后使用VBA对象模型(这需要上面的参考)来创建一个代码模块,然后将过程插入到VBA项目中。从这里开始探索对象模型:ActivePresentation.VBProject

      这增加了一个标准代码模块:

      ActivePresentation.VBProject.VBComponents.Add vbext_ct_StdModule
      

      这会从字符串中添加一个过程(您也可以从文件中添加):

      ActivePresentation.VBProject.VBComponents(1).CodeModule.AddFromString
      

      【讨论】:

      • 嗨@JamieG,感谢您的回答,但这不是我打算做的。我正在研究加载项,并且 - 如果可能的话 - 不想创建任何宏。我希望形状从同一个类中执行一个函数。例如:我正在使用名为“addShape”的子添加形状,并希望形状在演示文稿中单击时调用子“test()”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多