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

Posted

技术标签:

【中文标题】Excel 表单控件和 ActiveX 控件的区别【英文标题】:Differences between Excel's Form Controls & ActiveX Controls 【发布时间】:2018-10-13 02:48:30 【问题描述】:

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

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

我发现一些在线代码示例可以与我的控件一起使用,但其他代码示例不能。怎么会?

我如何处理每种类型,如何区分?

【问题讨论】:

通过您的一个 cmets 得知这篇文章。做一个伟大的规范! 【参考方案1】:

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

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

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


概述:

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

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

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

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

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

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

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


两种类型的控件

    表单控件

    ActiveX 控件

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

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

(点击图片放大)

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


(来源:my answer)


控制可用性

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

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

Office.com:Why are form-related commands or controls on the ribbon disabled?

Office.com:Overview of forms, Form controls, and ActiveX controls on a worksheet

MSDN:Add Controls to a User Form


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

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

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

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

来源:this和this)

另请参阅:

***:ActiveX

Symantec.com:Discussion of ActiveX Vulnerabilities

极客指南:What ActiveX Controls Are and Why They’re Dangerous


选项按钮(单选按钮)

在 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

Shapes.AddShape Method (Excel)

Shape Properties (Excel)

Characters Object (Excel)


使用 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

OLEObjects.Add Method (Excel)

BackColor, ForeColor Properties (ActiveX Controls)


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

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  

更多信息:

Office.com:Add a checkbox or option button (Form controls)

Office.com:Add a checkbox, option button, or toggle button (ActiveX controls)

Office.com:Overview of forms, Form controls, and ActiveX controls on a worksheet

Office.com:Enable selection through choice controls (check and list boxes)

Office.com:Add, edit, find, and delete rows by using a data form

MSDN:VBA Shape Members

MSDN:Using ActiveX Controls on Sheets (Office)

Exceldemy:How to Use Form Controls in Excel

MSDN:Using Windows Forms Controls on Excel Worksheets (Visual Studio)

微软技术网:Behaviour of ActiveX controls embedded in Office documents

堆栈溢出:What is the difference between “Form Controls” and “ActiveX Control” in Excel 2010?

【讨论】:

这很漂亮。谢谢! ?

以上是关于Excel 表单控件和 ActiveX 控件的区别的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA:无法访问表单控件?

activex 控件和 activex 对象有啥区别?

非 IE WebBrowser ActiveX 控件

直接在 Excel 工作表上使用 ActiveX 控件的必要条件和充分条件是啥?

更改某些 ActiveX 和表单控件的选项卡顺序

将控件(ActiveX或非ActiveX)添加到图表(Excel VBA)