Excel中的表单控件和ActiveX控件之间的差异概述

时间:2018-05-02 21:47:04

标签: excel vba controls activex userform

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

表单控件 ActiveX控件之间的区别是什么?我应该使用哪一个?

我发现在线的一些代码示例使用我的控件,但其他代码没有。怎么会?

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

1 个答案:

答案 0 :(得分:17)

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

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

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

概述:

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

    • 两种类型的控件都可以在工作表中使用,但仅ActiveX 控件可用于 userforms

    • 表单控件是 Shapes 集合的一部分(就像绘图对象一样),因此被称为:*<code>worksheet</code>* **<code>.</code> <code>Shapes("</code>** *<code>controlname</code>* **<code>")</code>**

    • ActiveX控件基本上是工作表的一部分,因此被称为:
      *<code>worksheet</code>* **<code>.</code>** *<code>controlname</code>*

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

  • 有些网站讨论也讨论数据表。这只是一个专门用于数据输入/操作数据的 ,所以调用它们会更有意义(更熟悉的声音) & #34;数据录入用户形式&#34;

  • Office文档有时也会将工作表作为表单引用。虽然这在技术上是正确的,但不要让这让您感到困惑。想想&#34;形式&#34;用于一般意义

    dictionary image: form

两种控件

  1. 表单控件

  2. ActiveX控件

  3. 两个人的表现,行为和控制方式相似,但不完全相同。 (列出here。)

    例如,让我们比较两种类型的组合框。在某些编程语言中,类似的控件被称为&#34;下拉菜单&#34; &#34;下拉列表&#34; 。在Excel中,我们有&#34; 表单控件组合框&#34; ,以及&#34; ActiveX控件组合框< /强>&#34;

    compare control types (点击图片放大。)

    &#34;默认名称&#34;适用于手动创建的控件。以编程方式创建的控件没有(或要求)默认名称,因此应在创建时立即分配。

    differences between controls

    (来源:my answer

    控制可用性

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

    chart of controls

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

      

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

         

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

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

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

           

      example
         来源thisthis

    •   

    另见:

    选项按钮(单选按钮)

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

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

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

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

      

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

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

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

    处理控制事件:

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

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

    Click事件添加程序:

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

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

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

      • 点击新建...

      • ,在VBE中创建新程序
      • 点击记录...

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

      assign events (点击图片放大。)

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

    Macros dialog

    ActiveX控件事件

    ActiveX控件有一个更广泛的列表可以设置为响应的事件列表

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

    activeX events (点击图片放大。)

    控制用户表单上的事件处理:

    事件也可用于用户表单的控件。由于只能将ActiveX控件放置为用户表单,因此您将拥有更多编码+更多功能&#34;交易。

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

    例如,为了使此用户表单在表单 的任何位置响应MouseMove ,相同的事件代码为应用于用户形式,文本框,选项按钮和框架

    A userform with controls responding to events

    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  
    

    更多信息: