将事件代码添加到PowerPoint VBA

时间:2015-05-26 20:03:48

标签: vba dynamic powerpoint powerpoint-vba buttonclick

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

由于这将在具有不同页数的众多项目中使用,因此我使用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的。我应该指出编码是“不是我的日常工作”,我已经设法得到这么远的阅读“掌握VBA for Office 2003”和网络搜索...所以我将这些示例翻译成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

...但得到一个&#34;编译错误:Sub或Function未定义&#34;在(slides(1))。任何帮助清理它(如果它实际上是一个合适的解决方案)将不胜感激。

1 个答案:

答案 0 :(得分:0)

你必须使用标签吗? (我理解大小的东西,但你可以添加一个更容易的形状。)

基于以下内容的东西: 只有在允许访问安全性中的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