使用 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