【问题标题】:How to use Events with Option Button Controls on Userform [duplicate]如何在用户窗体上使用带有选项按钮控件的事件 [重复]
【发布时间】:2018-08-21 20:09:06
【问题描述】:

我正在尝试从 Excel 工作表的范围中添加一个选项按钮。

For Each Value In OptionList

    Set opt = UserForm3.Controls.Add("Forms.OptionButton.1", "radioBtn" & i, True)
    opt.Caption = Value
    opt.Top = opt.Height * i
    opt.GroupName = "Options"

    UserForm3.Width = opt.Width
    UserForm3.Height = opt.Height * (i + 2)

    i = i + 1

Next

我想创建一个事件处理程序,以便在运行来自用户的代码时选择radiobtn1。虽然我得到了很多答案,但这些都是针对工作表用户表单的。

我的目的是使用 VBA 用户表单。请帮我谈谈你的想法。

【问题讨论】:

  • 因为看起来您正在动态添加控件,所以我会查看此链接:stackoverflow.com/a/10224992/9259306
  • 有工作表用户表单和VBA用户表单吗?我以为它们都只是 Excel 用户表单 - @Mistella 提供的链接是要走的路。
  • FWIW 您将动态控件添加到表单的默认实例中,这意味着如果您执行Set frm = New UserForm3 然后frm.Show,则该实例将不会拥有它们。如果此代码在表单的代码隐藏中,我强烈建议您将所有 UserForm3 限定符替换为 Me,以便将控件添加到 当前实例 的任何位置。
  • 如果您在阅读我的回答(如下)后需要针对您的问题提供更具体的帮助,请您仔细检查以确认您使用的是哪种类型的控件,并确保您使用的是适当的语法根据组合框示例?
  • @Mat'sMug 感谢您的回答。事件处理程序仍然不起作用。

标签: vba excel controls


【解决方案1】:

只有 一种 类型的用户窗体,但是对于 Excel 可用的 两种 类型的控件存在[永恒的] 混淆——对比鲜明的 术语被不同的在线资源使用。 (只有关于 ActiveX 控件的部分适用于用户窗体。)也许我可以用有助于 理解的词语来帮助阐明。


概述:

  • 两种类型的控件:表单控件ActiveX控件

    • 两种类型的控件都可以在工作表上使用,但只有 ActiveX 控件可以在用户窗体上使用。

    • 表单控件是 Shapes 集合的一部分(就像绘图对象一样),因此被称为:

    • ActiveX 控件基本上是工作表的一部分,因此被称为:

    • 两种类型的控件都可以从工作表中创建、修改和删除,或者使用 VBA 以编程方式创建,但是,当使用 VBA 引用时,这两种类型的控件的语法略有不同给他们。

  • 一些网站还讨论了数据表单。这只不过是一个用户表单,专门用于数据输入/数据操作,因此将它们称为(听起来更熟悉)“数据输入”会更有意义用户表单”

  • Office 文档有时也将 工作表 称为表单。虽然这技术上是正确的,但不要让这让您感到困惑。把“形式”这个词想象成一般意义上的


两种类型的控件

  1. 表单控件

  2. ActiveX 控件

两者的外观、行为和控制方式相似,但并不完全相同。 (列表here。)

例如,让我们比较两种类型的组合框。在某些编程语言中,类似的控件被称为“下拉菜单”“下拉列表”。在 Excel 中,我们有一个 "Form Control Combo Box" 和一个 "ActiveX Control Combo Box"

(点击图片放大)

“默认名称”适用于手动创建的控件。以编程方式创建的控件没有(或不需要)默认名称,因此应该在创建时立即分配一个。


(来源:my answer


关于 ActiveX 控件和相关安全问题

ActiveX 控件是 VBA 工具箱的扩展。您可以像使用任何标准内置控件(例如 CheckBox 控件)一样使用 ActiveX 控件。当您将 ActiveX 控件添加到应用程序时,它会成为开发和运行时环境的一部分,并为您的应用程序提供新功能。

  • ActiveX 控件实现为可在任何 OLE 容器中使用的进程内服务器(通常是小对象)。请注意,ActiveX 控件的全部功能仅在用于识别 ActiveX 控件的 OLE 容器中时可用。

  • 这种容器类型,称为控件容器控件对象,可以通过使用控件的属性和方法,并以事件的形式接收来自 ActiveX 控件的通知。下图演示了这种交互:


    来源thisthis

另请参阅:


选项按钮(单选按钮)

在 Excel 中,这两种单选按钮实际上称为选项按钮。进一步混淆问题:

  • 表单控件的默认名称是OptionButton1

  • ActiveX 控件的默认名称是Option Button 1

区分它们的一个好方法是打开控件的属性列表(在“开发”选项卡下的功能区上,或右键单击控件并选择Properties,或按F4),因为 ActiveX 控件比简单的表单控件有更多的选项。

选项按钮和复选框可以绑定在一起(因此一次只能从组中选择一个选项),方法是将它们放在共享的组框中。

选择组框控件,然后按住 Ctrl,同时选择要分组的每个其他控件。右键单击组框控件并选择GroupingGroup

下面的前两个链接是用于处理每种类型的选项按钮的单独说明。


处理控制事件:

表单控件事件(仅限Click 事件)

表单控件事件只能响应一个事件:Click 事件。 (更多信息here。)请注意,本节不适用于用户窗体,因为它们仅使用 ActiveX 控件。

Click 事件添加过程:

  • 右键单击控件并选择Assign Macro...

  • 在“分配宏”对话框中:

    • 选择现有程序,然后单击确定

    • 通过单击New...

    • 在VBE中创建一个新过程
    • 通过单击录制...

    • 录制新宏
    • 要删除分配的事件,从Macro Name 字段中删除其名称,然后单击确定

    (点击图片放大)

要重命名、编辑或删除现有宏,请按 Alt+F8 打开Macro 界面:


ActiveX 控件事件

ActiveX 控件有一个更广泛的事件列表,可以设置它们来响应这些事件。

要将事件分配给 ActiveX 控件,请右键单击该控件并选择 View Code。在 VBE 中,您可以粘贴代码,或从 VBE 窗口右上角的下拉列表中选择特定事件

(点击图片放大)

用户窗体上的控制事件处理:

事件也可以用在用户窗体的控件中。由于只能将 ActiveX 控件放置在用户窗体中,因此您将获得“更多编码 + 更多功能”的权衡。

ActiveX 控件添加到用户窗体的方式与添加到工作表的方式相同。请记住,分配给用户表单本身(即背景)的任何事件都将在控件覆盖的任何区域中被“阻止”,因此您可能需要将相同的事件分配给控件以及用户表单。

例如,为了使这个用户窗体响应MouseMove窗体上的任何地方,相同的事件代码被应用到用户窗体、文本框、选项按钮和框架


VBA 示例

使用 VBA 添加/修改/删除表单控件选项按钮:

Sub formControl_add()
    'create form control
    Dim ws As Worksheet: Set ws = ActiveSheet
    With ws.Shapes.AddFormControl(xlOptionButton, 25, 25, 100, 100)
        .Name = "cOptionButton1"  'name control immediately (so we can find it later)
    End With
End Sub

Sub formControl_modify()
    'modify form control's properties
    Dim ws As Worksheet: Set ws = ActiveSheet
    ws.Shapes("cOptionButton1").Select
    With Selection 'shapes must be Selected before changing
        .Characters.Text = "wxyzabcd"
   End With
End Sub

Sub formControl_delete()
    'delete form control
    Dim ws As Worksheet: Set ws = ActiveSheet
    ws.Shapes("cOptionButton1").Delete
End Sub

使用 VBA 添加/修改/删除 ActiveX 命令按钮:

Sub activexControl_add()
    'create ActiveX control
    Dim ws As Worksheet: Set ws = ActiveSheet
    With ws.OLEObjects.Add("Forms.CommandButton.1")
        .Left = 25
        .Top = 25
        .Width = 75
        .Height = 75
        .Name = "xCommandButton1" 'name control immediately (so we can find it later)
    End With
End Sub

Sub activexControl_modify()
    ' modify activeX control's properties
    Dim ws As Worksheet: Set ws = ActiveSheet
    With ws.OLEObjects("xCommandButton1").Object
        .Caption = "abcxyz"
        .BackColor = vbGreen
    End With
End Sub

Sub activexControl_delete()
    ' delete activeX control
    Dim ws As Worksheet: Set ws = ActiveSheet
    ws.OLEObjects("xCommandButton1").Delete
End Sub

从表单控件组合框中添加/删除项目:

Sub ComboBox_addRemoveItems_FormControl()

    Dim ws As Worksheet: Set ws = ActiveSheet

    'add item to form control combo box
    ActiveWorkbook.Sheets("Sheet1").Shapes("Drop Down 1").ControlFormat.AddItem "abcd"

    'remove all items from from form control combo bo
    ActiveWorkbook.Sheets("Sheet1").Shapes("Drop Down 1").ControlFormat.RemoveAllItems

End Sub  

在 ActiveX 组合框中添加/删除项目:

Sub ComboBox_addRemoveItems_ActiveXControl()

    Dim ws As Worksheet: Set ws = ActiveSheet

    'add items to ActiveX combo box
    ActiveWorkbook.Sheets("Sheet1").ComboBox1.AddItem "abcd"

    'remove all items from ActiveX combo box
    ActiveWorkbook.Sheets("Sheet1").ComboBox1.Clear

End Sub  

更多信息:

【讨论】:

  • 感谢您的详细解释。但这就是我的问题需要为选项按钮添加一个事件处理程序,该按钮被动态添加到 VBA 用户表单中,并且当用户表单初始化时这些选项按钮不可用
  • @sabarigiri - 我添加了一堆信息和示例,说明如何将事件与两种类型的控件一起使用。用户窗体使用 ActiveX 控件,并可以使用与上述 ActiveX 控件事件相同的方法访问事件的完整列表。如果您有任何问题,请告诉我。 :)
  • 加我一个。现在我可以在这里推荐人了!
  • 所以你的文字说 useform 是 ActiveX 但比较图表在 userform 上对两者都有勾号...我误解了什么吗?还有一件事……能否提供有关 ActiveX 安全问题的更多信息?关键问题是什么?
  • @QHarr - 我一定在一个月前错过了这个。您对比较图表的看法是正确的;已更正,谢谢。我添加了一个指向赛门铁克讨论的链接:ActiveX 安全性,当我发现更多信息时会对此进行扩展。我正在考虑将此答案移至单独的问答中,因为即使问题已关闭,它也很受欢迎(并且我在这里也向人们推荐了控制概述)。
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2023-03-10
  • 2013-03-09
相关资源
最近更新 更多