Excel 的表单控件和 ActiveX 控件之间的区别

Differences between Excel's Form Controls & ActiveX Controls

为什么 Excel 中有 2 种类型的控件(2 个按钮、2 个组合框、2 个复选框等...)

Forms 控件ActiveX 控件 有什么区别?我应该使用哪一个?

我在网上找到的一些代码示例适用于我的控件,但其他的则不能。怎么会?

如何使用每种类型,如何区分它们?

围绕 Excel 可用的 两种 类型的控件存在 [永恒的] 混乱 — 对比鲜明的 术语 加剧了这种混乱由不同的在线资源使用。

这只是表单控件ActiveX控件之间差异的一般概述(基于帮助我最终找出差异的旧笔记!)访问包含的链接以获取有关每个控件的更多详细信息,包括代码和示例项目。 ☺

(改编自我原来的 post here — 现已关闭)


概览:

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

    • 两种类型的控件都可以在工作表上使用,但是只有ActiveX控件可以在[=248上使用=]用户表单.

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

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

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

  • 一些站点讨论还讨论了一种数据形式。这 只不过是一个用户表单 专门为数据 entry/manipulation 制作的,所以称它们更有意义(听起来更熟悉) "Data Entry Userform".

  • Office 文档有时也将 工作表 称为表单。虽然这在技术上 是正确的,但不要让这让您感到困惑。将 "form" 一词视为 一般意义上的 :


两种控件

  1. 表单控件

  2. ActiveX 控件

两者在外观、行为和控制方面相似,但并不完全相同。 (名单here。)

例如,让我们比较一下组合框的两种类型。在某些编程语言中,可比较的控件被称为 "drop-down menu""drop-down list"。在Excel中,我们有一个"表单控件组合框"和一个" ActiveX 控件组合框":

(点击图片放大。)

"Default name" 适用于 手动 创建的控件。以编程方式创建的控件没有(或要求)默认名称,因此应在创建后立即分配一个默认名称。


(来源:


控制可用性

下图显示了哪些常用控件通常可用于工作表和用户表单。

其他因素可能会影响控件的可用性。


About ActiveX controls and related Security Concerns

An ActiveX control is an extension to the VBA Toolbox. You use ActiveX controls just as you would any of the standard built-in controls, such as the CheckBox control. When you add an ActiveX control to an application, it becomes part of the development and run-time environment and provides new functionality for your application.

  • An ActiveX control is implemented as an in-process server (typically a small object) that can be used in any OLE container. Note that the full functionality of an ActiveX control is available only when used within an OLE container designed to be aware of ActiveX controls.

  • This container type, called a control container or control object, can operate an ActiveX control by using the control’s properties and methods, and receives notifications from the ActiveX control in the form of events. The following figure demonstrates this interaction:


    (Source: this and this)

另请参阅:


选项按钮(单选按钮)

在Excel中,这两种单选按钮实际上叫做Option Buttons。进一步混淆问题:

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

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

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

Option buttons and checkboxes can be bound together (so only one option at a time can be selected from the group) by placing them in a shared Group Box.

Select the group box control and then hold Ctrl while selecting each of the other controls that you want to group. Right-click the group box control and choose GroupingGroup.

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


处理控制事件:

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

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

要为 Click 事件添加程序:

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

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

    • Select一个现有的程序,然后单击确定

    • 通过单击 新建...[=65=,在 VBE 中创建一个新过程]

    • 通过单击 录制...录制新宏...

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

    (点击图片放大。)

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


ActiveX 控件事件

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

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

(点击图片放大。)

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

事件也可以用在用户窗体的控件中。由于只能将 ActiveX 控件放置在用户窗体中,因此您需要进行 "more coding + more functionality" 权衡。

ActiveX 控件添加到用户窗体的方式与添加到工作表的方式相同。请记住,分配给用户窗体自身(即背景)的任何事件在控件覆盖的任何区域都将是"blocked",因此您可能需要分配控件和用户窗体的相同事件。

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


VBA 示例

Add/Modify/Delete 表单控件选项按钮使用 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

Add/Modify/Delete 使用 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

Add/Remove 个来自表单控件组合框的项目:

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  

Add/Remove 个来自 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  

更多信息: