- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么Excel中提供两种控件? (2个按钮,2个组合框,2个复选框等)
窗体控件和ActiveX控件有什么区别?我应该使用哪一个?
我发现一些代码示例可以在控件上在线使用,而另一些则不能。怎么会?
如何处理每种类型,如何区分?
最佳答案
Excel可用的两种控件存在[永恒的]混淆-不同的在线资源使用的对比术语加剧了这种情况。
这只是Form Controls和ActiveX Controls之间差异的一般概述(基于我的旧笔记,这些内容最终帮助我找出了差异!)请访问随附的链接,以获取有关每个控件(包括代码和示例项目)的更多详细信息。 ☺
(改编自我的原始帖子here-现在已关闭)
概述:
控件有两种类型:表单控件和ActiveX控件:
两种类型的控件都可以在工作表上使用,但只有ActiveX控件可以在用户窗体上使用。
表单控件是Shapes集合的一部分(就像“绘图对象”一样),因此被称为:
ActiveX控件基本上是工作表的一部分,因此被称为:
两种类型的控件都可以在工作表中创建,修改和删除,也可以使用VBA进行编程删除,但是,两种类型的控件在使用VBA引用它们时的语法略有不同。
一些讨论的站点还讨论了数据表单。这仅是专门为数据输入/处理而设计的用户表单,因此将它们(听起来更熟悉)称为“数据输入用户表单”会更有意义。
Office文档有时也将工作表称为表单。尽管从技术上讲这是正确的,但不要让此混淆。认为“形式”一词是一般意义上的使用:
两种控制方式
表单控件
ActiveX控件
两者的外观,行为和控制类似,但不完全相同。 (列出here。)
例如,让我们比较两种组合框。在某些编程语言中,可比较的控件称为“下拉菜单”或“下拉列表”。在Excel中,我们有一个“表单控件组合框”和一个“ ActiveX控件组合框”:
(点击图片放大。)
☆“默认名称”适用于手动创建的控件。以编程方式创建的控件没有(或不需要)默认名称,因此应在创建后立即分配一个默认名称。
(来源: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工具箱的扩展。您可以像使用任何标准内置控件一样使用ActiveX控件,例如CheckBox控件。当您将ActiveX控件添加到应用程序时,它将成为开发和运行时环境的一部分,并为您的应用程序提供新功能。
ActiveX控件被实现为可在任何OLE容器中使用的进程内服务器(通常是小对象)。请注意,仅当在旨在了解ActiveX控件的OLE容器中使用ActiveX控件的全部功能时,才可用。
这种容器类型称为控件容器或控件对象,可以使用控件的属性和方法来操作ActiveX控件,并以事件的形式接收来自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...
在“分配宏”对话框中:
选择一个现有过程,然后单击“确定”,或者,
通过单击“新建...”在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
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
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
关于excel - 概述Excel中的窗体控件和ActiveX控件之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50144020/
我创建了一个安装在客户端计算机上的 ActiveX 控件。现在我已经在 ActiveX 控件中进行了一些更改,现在希望更改的 ActiveX 应该在客户端计算机中自动更新。 我已将安装文件的版本从 1
我用 C# 创建了一个 com 组件,并使用 Regasm 注册了该组件。我现在可以通过使用 ActiveXObject(...) 在 IE 中使用它。然而,这只在我更改 IE 安全设置并允许运行
我以前做过,但我完全忘记了如何签署 activeX 控件? 最佳答案 Digital Signing for ActiveX Components (MSDN) 关于activex - 签署 Acti
我有一个多页网页流 (jsp)。用户完成大量工作后,我需要使用 activex 组件,如果机器上没有显示,用户会在顶部显示黄色条以接受组件,接受后页面将重新加载,用户必须重复所有操作工作,请注意页面已
背景 有一个由 VB 创建的旧 ActiveX 控件。我将此 ActiveX 控件添加到我的 Excel 工作簿并设置了一些属性。这些属性是在保存书籍时保存的。具体来说,它们在 VB 代码中使用 Pr
我有一个想要从 SAP 调用的自定义 ActiveX 控件。 在这种情况下我不能使用 PI,我还有什么其他选择? 最佳答案 看节目 SAPRDEMO_ACTIVEX_INTEGRATION 举个例子。
我的 .NET 程序中有 WebBrowser 控件。实际上使用哪个 .net 包装器(wpf 或 winforms)并不重要,因为它们都包装 ActiveX 组件“Microsoft Interne
我有一个正在注册多个 dll 的安装程序,需要知道这是否成功。 最佳答案 这似乎对我有用:http://www.nirsoft.net/utils/registered_dll_view.html 关
如何将 ActiveX 应用程序转换为 NPAPI 应用程序? 我找到的所有方法都是为 NPAPI 实现入口点和映射函数。 (NPP_GetEntryPoints...)除了使用 Framework
“ActiveX 控件——小程序构建 block ——可以用于创建分布式应用程序,这些应用程序可以通过 Web 浏览器在 Internet 上运行。示例包括用于收集数据、查看某些类型的文件和显示动画的
微软发布了 Edge 浏览器,该浏览器不支持 ActiveX。 我有一个应用程序需要从 Windows 注册表获取信息,因此我对 ActiveX 的替代方案有一些疑问: 有没有办法通过 Edge 或类
我正在使用现有的 SDK 编写一个附加组件,该 SDK 没有类似 webview 的组件,但允许使用 ActiveX 控件。 所以我想到的唯一想法是找到一个实现网络浏览器的 ActiveX 控件,或者
嗨,我有一个这样的 ActiveX: CMyActiveX 类: 公共(public) CComObjectRootEx... ... { HRESULT FinalContruct(){return
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我有一个放置在 IE 浏览器容器中的 ActiveX 控件。该控件创建另一个启用了 WS_POPUP 和 WS_LAYERED 属性的对话框窗口,以便能够使用 SetLayeredWindowAttr
几天前,我在 Internet Explorer 中搜索了一种无需打印对话框直接打印的方法,并找到了这个 solution . 在此解决方案中,使用 ActiveX 对象“Shell.Explorer
我在服务器端使用 ASP.NET,在客户端使用 JavaScript。 我正在尝试开发一些有助于用户进行故障排除的页面,我想知道是否有一种方法可以通过编程方式确定以下内容: 如果 ActiveX 在
在 Visual Studio 2008 中,我可以创建一个 MFC activex 项目,它提供了一个向导来创建单个 activex 控件。我现在想在这个项目中创建新控件。 我找不到任何方法来做到这
我正在尝试为一个简单的 hello world 消息框运行 activex 控件。 首先,我创建了类库,现在有了 dll,然后我创建了 HTML 页面并调用了 activeX 控件:
免责声明:我没有签署文件的经验,这是我第一次。 我们的网站有一个通配符 SSL 证书。现在我们要在我们的一个站点上托管一个 ActiveX 控件。当我尝试使用该证书对我的 cab 文件进行签名时,它会
我是一名优秀的程序员,十分优秀!