【问题标题】:Returning an index value from a group of ActiveX Option Buttons从一组 ActiveX 选项按钮返回索引值
【发布时间】:2016-10-07 05:07:08
【问题描述】:

首先让我声明我是一名医科学生,而不是一名程序员。我写了一个电子表格,可以作为一个有 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

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

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

【问题讨论】:

  • 您可以使用验证下拉列表还是真的必须拥有这些按钮? blog.contextures.com/wp-content/uploads/2010/02/… 在隐藏的表格中,您可以获得答案,然后您只需根据您的答案创建数据验证...
  • 我认为具有正确设置的列表框会更好。你能提供一个示例工作簿吗?
  • 必须是选项按钮。该表需要模仿实际考试。它模仿的考试使用选项按钮。这似乎是一件小事,但如果我使用下拉列表,它就不会很好。最终用户希望沉浸在看起来和感觉就像真实考试的东西中。我不知道如何将示例工作表上传到这篇文章。
  • 我把项目的副本放在这里:drive.google.com/file/d/0B0_ZrvkCBTm5YmduLWc2Q25UQlk/…
  • 这是一个非常酷的电子表格。你有几个选择。当学生单击 [Next] [Previous] 时,您将通过一组将问题加载到其中的控件来获得最佳表现。您还可以有一个导航列表框,如果学生回答了问题,可以显示复选标记。

标签: vba excel activex radio-button


【解决方案1】:

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

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

类: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

【讨论】:

  • 这已经超出了我对 VB 代码的理解。但无论如何,我剪切并粘贴了它,它似乎工作得很好。非常感谢@Thomas Inzina
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
相关资源
最近更新 更多