在工作表上使用 ActiveX 控件

本主题包括在工作表或图表工作表上使用 ActiveX 控件的特定信息。 有关添加和使用控件的一般信息,请参阅 在文档上使用 ActiveX 控件创建自定义对话框

在工作表上处理控件时,必须记住以下几点:

  • 除了可用于 ActiveX 控件的标准属性外,以下属性还可用于 Microsoft Excel 中的 ActiveX 控件: BottomRightCellLinkedCellListFillRangePlacementPrintObjectTopLeftCellZOrder

    这些属性可用 ActiveX 控件的名称来设置和返回。 下例滚动工作簿窗口,使 CommandButton1 位于窗口的左上角。

      Set t = Sheet1.CommandButton1.TopLeftCell
      With ActiveWindow
          .ScrollRow = t.Row
          .ScrollColumn = t.Column
      End With
    
    
  • 激活 ActiveX 控件时,将禁用某些 Microsoft Excel Visual Basic 方法和属性。 例如,当控件处于活动状态时,不能使用 Sort 方法,因此以下代码在按钮单击事件过程中失败, (因为用户单击控件后控件仍处于活动状态,) 。

      Private Sub CommandButton1.Click 
          Range("a1:a10").Sort Key1:=Range("a1") 
      End Sub 
    

    在使用失败的属性或方法之前,可以通过激活工作表上的其他元素来解决此问题。 例如,以下代码对区域进行排序:

      Private Sub CommandButton1.Click 
          Range("a1").Activate 
          Range("a1:a10").Sort Key1:=Range("a1") 
          CommandButton1.Activate 
      End Sub
    
  • 当用户双击嵌入在其他应用程序文档中的 Microsoft Excel 工作簿对其进行编辑时,该工作簿上的控件将不能正常工作。 如果用户右键单击工作簿,然后选择快捷菜单上的“打开”命令,工作簿上的控件将正常工作。

  • 用 Microsoft Excel 5.0/95 工作簿文件格式保存 Microsoft Excel 工作簿时,将丢失 ActiveX 控件信息。

  • 工作表上 ActiveX 控件的事件过程中的 Me 关键字引用的是工作表,而不是控件。

用 Visual Basic 添加控件

在 Microsoft Excel 中,用 OLEObjects 集合中的 OLEObject 对象代表 ActiveX 控件(所有 OLEObject 对象也都包含在 Shapes 集合中)。 若要用编程方式向工作表添加 ActiveX 控件,请用 OLEObjects 集合的 Add 方法。 下例向第一张工作表添加命令按钮。

Worksheets(1).OLEObjects.Add "Forms.CommandButton.1", _ 
    Left:=10, Top:=10, Height:=20, Width:=100

通过 Visual Basic 使用控件属性

绝大多数情况下,Visual Basic 代码可用名称引用 ActiveX 控件。 下例更改了控件“CommandButton1”的标题。

Sheet1.CommandButton1.Caption = "Run"

请注意,当在控件所在的工作表的类模块之外使用控件的名称时,必须用工作表的名称限定该控件的名称。

若要更改在 Visual Basic 代码中所用的控件名称,请先选择控件,然后在“属性”窗口中设置控件的“(名称)”属性。

因为 ActiveX 控件也可用 OLEObjects 集合中的 OLEObject 对象代表,所以也可用该集合中的对象来设置控件的属性。 下例设置了控件“CommandButton1”的左边位置。

Worksheets(1).OLEObjects("CommandButton1").Left = 10

没有显示为 OLEObject 对象属性的控件属性可通过由 Object 属性返回的实际控件对象来设置。 下例设置了控件“CommandButton1”的标题。

Worksheets(1).OLEObjects("CommandButton1"). _ 
    Object.Caption = "run me"

因为所有 OLE 对象也是 Shapes 集合的成员,所以也可用该集合设置多个控件的属性。 下例对齐第一张工作表上所有控件的左边缘。

For Each s In Worksheets(1).Shapes 
    If s.Type = msoOLEControlObject Then s.Left = 10 
Next

使用 Shapes 和 OLEObjects 集合的控件名称

工作表上的 ActiveX 控件具有两个名称:包含控件的形状的名称(查看工作表时,可在“名称”框中看到此名称);控件的代码名称(在“属性”窗口的“(名称)”右侧单元格中可看到此名称)。 第一次向工作表添加控件时,形状名称和代码名称是匹配的。 但是,如果您更改这两个名称中的任意一个,另一个不会随之自动更改。

在控件的事件过程名称中使用的是控件代码名称。 但是,从工作表的 ShapesOLEObjects 集合返回控件时,必须使用形状名称而不是代码名称来通过名称引用控件。 例如,假定要向工作表添加一个复选框,默认的形状名称和代码名称都是 CheckBox1。 如果通过在“属性”窗口的“(名称)”旁边键入“chkFinished”更改控件代码名称,则必须在事件过程名称中使用“chkFinished”,但仍需要使用 CheckBox1 才能从 ShapesOLEObject 集合返回控件,如下例所示。

Private Sub chkFinished_Click() 
    ActiveSheet.OLEObjects("CheckBox1").Object.Value = 1 
End Sub

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。