首先让我说我是医科学生,而不是程序员。我写了一个电子表格,可以作为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
......等等。每个问题十五个按钮。五十个问题。我的工作表非常慢,无法在较慢的计算机上一直加载和崩溃。必须有一个更简单的方法。有什么建议?理想情况下,我想要一小段代码,只要选择了该组中的任何选项按钮,就可以将每个组的索引值返回到特定单元格。任何帮助将不胜感激。
另一方面......如果有人可以帮我弄清楚如何更改表单选项按钮的标题以引用给定的单元格,那么基本上可以帮助我的另一条帮助就是。那也可以解决我的问题。
答案 0 :(得分:0)
创建组事件的方法是使用自定义类来包装要分组的控件,并使用模块级别集合来保持包装器类引用的活动。
在查看您的工作簿后,我确定您可以根据OptionButton的名称派生索引。
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