从一组ActiveX选项按钮返回索引值

时间:2016-10-06 12:48:48

标签: excel vba excel-vba activex radio-button

首先让我说我是医科学生,而不是程序员。我写了一个电子表格,可以作为50个问题的考试。每个问题都有15个多项选择答案,我使用ActiveX选项按钮分组到每个问题编号。

我使用Activex而不是表单选项按钮,因为我将检查中的原始数据转储到工作表的隐藏区域,每个选项按钮标题引用原始数据中的单元格以显示不同的答案选项。通过这种方式,我可以通过添加问题和答案选项表轻松创建新考试。我没有看到如何使用表单选项按钮执行此操作。

但ActiveX选项按钮似乎无法将索引值返回到单个单元格。所以,我为每个按钮写了以下内容:

Sub OptionButton1_Click()
  Range("B21") = "A"
End Sub

Sub OptionButton2_Click()
  Range("B21") = "B"
End Sub

Sub OptionButton3_Click()
  Range("B21") = "C"
End Sub

......等等。每个问题十五个按钮。五十个问题。我的工作表非常慢,无法在较慢的计算机上一直加载和崩溃。必须有一个更简单的方法。有什么建议?理想情况下,我想要一小段代码,只要选择了该组中的任何选项按钮,就可以将每个组的索引值返回到特定单元格。任何帮助将不胜感激。

另一方面......如果有人可以帮我弄清楚如何更改表单选项按钮的标题以引用给定的单元格,那么基本上可以帮助我的另一条帮助就是。那也可以解决我的问题。

1 个答案:

答案 0 :(得分:0)

创建组事件的方法是使用自定义类来包装要分组的控件,并使用模块级别集合来保持包装器类引用的活动。

在查看您的工作簿后,我确定您可以根据OptionButton的名称派生索引。

enter image description here

类:OptionWrapper

Option Explicit

Public WithEvents MyOptionButton As MSForms.OptionButton

Private Sub MyOptionButton_Click()
    Dim Letters()
    Dim lRow As Long, lAnswer As Long, ID As Long
    Letters = Array("O", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N")

    ID = Replace(MyOptionButton.Name, "OptionButton", "")

    lRow = Int(ID / 15 + 1) * 21
    lAnswer = ID Mod 15

    Cells(lRow, "B") = Letters(lAnswer)

End Sub

考试工作表代码模块

Private OptionsCollection As Collection

Private Sub Worksheet_Activate()
    Dim obj As OLEObject
    Dim wrap As OptionWrapper

    Set OptionsCollection = New Collection

    For Each obj In ActiveSheet.OLEObjects

        If TypeOf obj.Object Is MSForms.OptionButton Then
            Set wrap = New OptionWrapper
            Set wrap.MyOptionButton = obj.Object
            OptionsCollection.Add wrap
        End If

    Next
End Sub