【问题标题】:Adding event code to checkbox in PowerPoint VBA将事件代码添加到 PowerPoint VBA 中的复选框
【发布时间】:2015-05-26 20:03:47
【问题描述】:

我正在开发一个 PowerPoint 2010 幻灯片,向用户展示一系列页面,其中包含一个语句、一个复选框(由标签元素构建以启用更改复选框的大小)和每页上的前进/后退箭头。

由于这将用于具有不同数量页面的众多项目,我正在使用 PowerPoint VBA 动态构建“甲板”,以便从包含单个语句列表的 Excel 电子表格动态构建页面。

我已经能够编写 VBA 代码来打开 Excel 文件,将语句读入 PowerPoint 中的数组,并使用页面上的所有元素构建适当数量的页面。至此,一切正常。我遇到困难的地方是将单击操作分配给复选框。

这是页面构建例程调用以插入复选框的代码(显然在此之前还有更多代码用于访问 Excel 文件、创建页面和添加“语句”文本框...所有哪个有效):

Sub AddSelectBox(Index As Integer, pptBuildingSlide As Slide)

'Add Checkbox
    With pptBuildingSlide.Shapes.AddOLEObject(Left:=342, Top:=294, Width:=42, Height:=42, ClassName:="Forms.Label.1")
        .Name = "label" & Index
        .OLEFormat.Object.Font.Name = "Wingdings 2"
        .OLEFormat.Object.Font.Charset = "2"
        .OLEFormat.Object.Caption = "£"
        .OLEFormat.Object.Font.Size = 40
    End With

'Add Checkbox Click Code
'(CODE FOR ADDING CLICK EVENT TO EACH BOX GOES HERE)

End Sub

每个页面上的复选框都有一个谨慎的名称,与页码相关(例如 Label1、Label2 等)。我需要将以下代码添加到每个页面上的每个复选框以切换复选标记,以便稍后在程序中我可以通过阅读“标题”属性看到哪些被选中。 (字体设置为“Wingdings 2”以在点击时给出一个空白框和一个选中框)

Private Sub Label1_Click()

   If Label1.Caption = "£" Then
       Label1.Caption = "R"
   Else
       Label1.Caption = "£"
   End If

End Sub

我在网上搜索了动态添加事件代码的任何引用,并找到了许多示例(例如Assign on-click VBA function to a dynamically created button on Excel Userform),但几乎所有示例都是针对 Excel 或 Access。我应该指出,编码“不是我的日常工作”,而且我已经成功地阅读了“掌握 Office 2003 的 VBA”和网络搜索……所以我将这些示例转换为 PowerPoint 的能力不足。感谢您提供的任何帮助。

5/29 附加信息:
我遇到了.CreateEventProc 方法作为将代码写入VBA 的一种方式。我找到的示例是在this site 为 Excel 编写的。我已经做到了这一点(消息框代码将替换为点击代码,但我只是将其用于测试以避免引入其他错误)...

Sub CreateEventProcedure()
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule
    Dim LineNum As Long
    Const DQUOTE = """" ' one " character

    Set VBProj = ActivePresentation.VBProject
    Set VBComp = VBProj.VBComponents(Slides(1))
    Set CodeMod = VBComp.CodeModule

    With CodeMod
        LineNum = .CreateEventProc("Click", "Label1")
        LineNum = LineNum + 1
        .InsertLines LineNum, "    MsgBox " & DQUOTE & "Hello World" & DQUOTE
    End With
End Sub

...但在(slides(1)) 处得到“编译错误:未定义子或函数”。任何清理它的帮助(如果它实际上是一个合适的解决方案)将不胜感激。

【问题讨论】:

  • 我认为您需要在创建形状时将 `ClassName:="Forms.Label.1"` 更改为 `ClassName:="Forms.CheckBox.1"`。如果您使用的是普通形状,您可以将宏的名称附加到 OnAction 属性。您可以在设计时将宏添加到卡片组,并将OnAction 字符串设置为.OnAction="NameOfDeck!NameOfMacro"
  • 谢谢。我使用的是 Label.1 而不是 CheckBox.1,因为我需要复选框大于不可调整大小的标准 CheckBox 对象。在由 VBA 构建后,我可以通过手动将 Label1_Click( ) 代码输入到每个页面上的标签来切换框,但无法弄清楚如何让 VBA 以编程方式即时添加代码。您描述的OnAction 方法是否值得采用这种方法?

标签: vba dynamic powerpoint buttonclick


【解决方案1】:

你必须使用标签吗? (我了解尺寸,但您可以添加一个更容易的形状。)

基于: 这只有在您允许访问安全中的 VBE 时才有效(不能在代码中完成)

    Sub makeBox()
Dim strCode As String
With ActivePresentation.Slides(1).Shapes.AddShape(msoShapeRectangle, 10, 10, 20, 20)
.Fill.Visible = False
.Line.Visible = False
With .TextFrame.TextRange.Font
.Name = "Wingdings 2"
.Size = 40
.Color.RGB = vbBlack
End With
.TextFrame.TextRange = "£"
With .ActionSettings(ppMouseClick)
.Action = ppActionRunMacro
.Run = "chex"
End With
End With
strCode = "Sub chex(oshp As Shape)" & vbCrLf & "If oshp.TextFrame.TextRange =" & Chr(34) & "£" & Chr(34) & "Then" _
& vbCrLf & "oshp.TextFrame.TextRange = " & Chr(34) & "R" & Chr(34) & vbCrLf _
& "Else" & vbCrLf & "oshp.TextFrame.TextRange =" & Chr(34) & "£" & Chr(34) & vbCrLf & "End If" & vbCrLf & "End Sub"
With ActivePresentation.VBProject.VBComponents.Add(vbext_ct_StdModule)
.CodeModule.AddFromString (strCode)
End With
End Sub

【讨论】:

  • 谢谢约翰。以干净的演示文稿运行代码,因为它似乎不依赖于我的任何代码。收到“编译错误:变量未在 .Add(vbext_ct_StdModule) 上定义。注释掉最后的“With...”代码部分,代码运行,绘制框但没有 onClick 操作(可能注释掉了魔法。)
  • 一个简单的 google 搜索显示您需要添加对 Microsoft Visual Basic for Applications Extensibility 5.3 的引用。取自http://www.cpearson.com/excel/vbe.aspx:VBIDE 是一个对象库,它定义了构成 VBProject 和 Visual Basic 编辑器的所有对象和值。要添加此引用,请打开 VBA 编辑器,在编辑器中打开您的 VBProject,然后转到“工具”菜单。在那里,选择 References 。在 References 对话框中,向下滚动到 Microsoft Visual Basic for Applications Extensibility 5.3 并选中该项。
  • chipsLetten - 昨晚在研究 .CreateEventProc 时发现了参考。 John 的代码现在可以工作了。
  • @John Wilson 谢谢!我会投票给你的答案,但没有足够的分数。为我投票吧!如果你有时间,你可以看看我添加到 OP 的附加信息。如果您对 .CreateEventProc 有任何经验,我们将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 2017-12-02
  • 2015-07-27
  • 1970-01-01
相关资源
最近更新 更多