使用 VBA 确定在 PowerPoint 中选择了分组集中的哪个选项按钮
With VBA determine which option button in a grouped set is selected in PowerPoint
我已经尝试了很多变体但都没有成功,我已经失去了理智。我需要根据在给定组中选择哪个选项按钮来设置一组变量。有 3 个组,简单标记为 OptionGroup1、OptionGroup2 和 OptionGroup3。当开始按钮被执行时,我需要确定选择了哪些选项并设置相应的变量以便在代码中的其他地方使用。 PowerPoint 绝对与 excel 不同,我似乎无法获得正确的语法。这种特殊的尝试给了我“运行时错误 438”、“对象不支持此 属性 或方法”
Set myDocument = ActivePresentation.Slides(1)
Select Case myDocument.Shapes.GroupName = OptionGroup2
Case Is = 1: ACLDelay = 1
Case Is = 2: ACLDelay = 2
Case Is = 3: ACLDelay = 3
Case Is = 4: ACLDelay = Int((4 * Rnd) + 1)
End Select
Select Case myDocument.Shapes.GroupName = OptionGroup1
Case Is = 1: RunInt = 15
Case Is = 2: RunInt = 60
Case Is = 3: RunInt = 30
Case Is = 4: RunInt = 5
End Select
Select Case myDocument.Shapes.GroupName = OptionGroup1
Case Is = 1: MODDelay = 1.5
Case Is = 2: MODDelay = 1
Case Is = 3: MODDelay = 2
Case Is = 4: MODDelay = 0.5
End Select
作为 10 的初学者,您需要重新组织选项组的 Select 结构。
Select Case MyDocument.Shapes.Groupname
Case OptionGroup1
Case optionGroup2
Case OptionGroup3
End Select
如果 'MyDocument.Shapes.Groupname, OptionaGroup1,2,3' 所有可以比较的 yield 字符串,上述构造将起作用。要锻炼每个 case 子句中发生的情况,您需要提供我在上面的评论中要求的信息。当你这样做时,我会更新这个答案。
请尝试下一种方法。 "Opt1", "Opt1"等应该是选项按钮的名称(你也可以使用他们的标题,但代码必须修改):
Sub testOptButtGroupName()
Dim ap As Presentation, sh As Shape, opB As MSForms.OptionButton
Dim RunInt As Long, ACLDelay As Long 'you probably have to declare these variable at the module level
Set ap = ActivePresentation
For Each sh In ap.Slides(1).Shapes
If sh.Type = msoOLEControlObject Then
If TypeName(sh.OLEFormat.Object) = "OptionButton" Then
Select Case sh.OLEFormat.Object.GroupName
Case "OptionGroup1"
Select Case sh.Name
Case "Opt1"
If sh.OLEFormat.Object.Value = True Then RunInt = 15
Case "Opt2"
If sh.OLEFormat.Object.Value = True Then RunInt = 60
'and so on...
End Select
Case "OptionGroup2"
Select Case sh.Name
Case "Opt5"
If sh.OLEFormat.Object.Value = True Then ACLDelay = 1
Case "Opt6"
If sh.OLEFormat.Object.Value = True Then ACLDelay = 2
'and so on...
End Select
'and so on...
End Select
End If
End If
Next
Debug.Print RunInt, ACLDelay
End Sub
事实上,使用控件名称没有必要使用它们的组成员资格...
我现在就离开办公室。如果有什么不清楚的地方,请不要犹豫,要求澄清。当我在家的时候我会澄清它们。
我使用简单的 IF 语句来解决我的问题。这不是最有效的方法,但目前有效。
If OptionButtonACL1s.Value = True Then
ACLDelay = 1
End If
If OptionButtonACL2s.Value = True Then
ACLDelay = 2
End If
If OptionButtonACL3s.Value = True Then
ACLDelay = 3
End If
If OptionButtonACLr.Value = True Then
ACLDelay = Int((10 * Rnd) + 1)
End If
If OptionButtonMOD5s.Value = True Then
MODDelay = 0.5
End If
If OptionButtonMOD1s.Value = True Then
MODDelay = 1
End If
If OptionButtonMOD15.Value = True Then
MODDelay = 1.5
End If
If OptionButtonMOD2s.Value = True Then
MODDelay = 2
End If
If OptionButtonRT5m.Value = True Then
RunInt = 5
End If
If OptionButtonRT15m.Value = True Then
RunInt = 15
End If
If OptionButtonRT30m.Value = True Then
RunInt = 30
End If
If OptionButtonRT1h.Value = True Then
RunInt = 60
End If
我已经尝试了很多变体但都没有成功,我已经失去了理智。我需要根据在给定组中选择哪个选项按钮来设置一组变量。有 3 个组,简单标记为 OptionGroup1、OptionGroup2 和 OptionGroup3。当开始按钮被执行时,我需要确定选择了哪些选项并设置相应的变量以便在代码中的其他地方使用。 PowerPoint 绝对与 excel 不同,我似乎无法获得正确的语法。这种特殊的尝试给了我“运行时错误 438”、“对象不支持此 属性 或方法”
Set myDocument = ActivePresentation.Slides(1)
Select Case myDocument.Shapes.GroupName = OptionGroup2
Case Is = 1: ACLDelay = 1
Case Is = 2: ACLDelay = 2
Case Is = 3: ACLDelay = 3
Case Is = 4: ACLDelay = Int((4 * Rnd) + 1)
End Select
Select Case myDocument.Shapes.GroupName = OptionGroup1
Case Is = 1: RunInt = 15
Case Is = 2: RunInt = 60
Case Is = 3: RunInt = 30
Case Is = 4: RunInt = 5
End Select
Select Case myDocument.Shapes.GroupName = OptionGroup1
Case Is = 1: MODDelay = 1.5
Case Is = 2: MODDelay = 1
Case Is = 3: MODDelay = 2
Case Is = 4: MODDelay = 0.5
End Select
作为 10 的初学者,您需要重新组织选项组的 Select 结构。
Select Case MyDocument.Shapes.Groupname
Case OptionGroup1
Case optionGroup2
Case OptionGroup3
End Select
如果 'MyDocument.Shapes.Groupname, OptionaGroup1,2,3' 所有可以比较的 yield 字符串,上述构造将起作用。要锻炼每个 case 子句中发生的情况,您需要提供我在上面的评论中要求的信息。当你这样做时,我会更新这个答案。
请尝试下一种方法。 "Opt1", "Opt1"等应该是选项按钮的名称(你也可以使用他们的标题,但代码必须修改):
Sub testOptButtGroupName()
Dim ap As Presentation, sh As Shape, opB As MSForms.OptionButton
Dim RunInt As Long, ACLDelay As Long 'you probably have to declare these variable at the module level
Set ap = ActivePresentation
For Each sh In ap.Slides(1).Shapes
If sh.Type = msoOLEControlObject Then
If TypeName(sh.OLEFormat.Object) = "OptionButton" Then
Select Case sh.OLEFormat.Object.GroupName
Case "OptionGroup1"
Select Case sh.Name
Case "Opt1"
If sh.OLEFormat.Object.Value = True Then RunInt = 15
Case "Opt2"
If sh.OLEFormat.Object.Value = True Then RunInt = 60
'and so on...
End Select
Case "OptionGroup2"
Select Case sh.Name
Case "Opt5"
If sh.OLEFormat.Object.Value = True Then ACLDelay = 1
Case "Opt6"
If sh.OLEFormat.Object.Value = True Then ACLDelay = 2
'and so on...
End Select
'and so on...
End Select
End If
End If
Next
Debug.Print RunInt, ACLDelay
End Sub
事实上,使用控件名称没有必要使用它们的组成员资格...
我现在就离开办公室。如果有什么不清楚的地方,请不要犹豫,要求澄清。当我在家的时候我会澄清它们。
我使用简单的 IF 语句来解决我的问题。这不是最有效的方法,但目前有效。
If OptionButtonACL1s.Value = True Then
ACLDelay = 1
End If
If OptionButtonACL2s.Value = True Then
ACLDelay = 2
End If
If OptionButtonACL3s.Value = True Then
ACLDelay = 3
End If
If OptionButtonACLr.Value = True Then
ACLDelay = Int((10 * Rnd) + 1)
End If
If OptionButtonMOD5s.Value = True Then
MODDelay = 0.5
End If
If OptionButtonMOD1s.Value = True Then
MODDelay = 1
End If
If OptionButtonMOD15.Value = True Then
MODDelay = 1.5
End If
If OptionButtonMOD2s.Value = True Then
MODDelay = 2
End If
If OptionButtonRT5m.Value = True Then
RunInt = 5
End If
If OptionButtonRT15m.Value = True Then
RunInt = 15
End If
If OptionButtonRT30m.Value = True Then
RunInt = 30
End If
If OptionButtonRT1h.Value = True Then
RunInt = 60
End If