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 Controls 和 ActiveX 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,同时选择要分组的每个其他控件。右键单击组框控件并选择
Grouping
→Group
。
下面的前两个链接是用于处理每种类型的选项按钮的单独说明。
处理控制事件:
表单控件事件(仅限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 控件的区别的主要内容,如果未能解决你的问题,请参考以下文章