vba将ActiveX控件对象传递给模块

时间:2016-01-29 09:43:29

标签: excel vba excel-vba controls

我对SO进行了很好的扫描,但无法找到解决方案。

  • 我在Excel工作簿中有许多工作表
  • 每张工作表都有一组相同的ActiveX Togglebuttons
  • 这些切换按钮控制数据透视表中数据的过滤。
    过滤“1”或“全部”
  • 我希望切换按钮在单击时更改颜色。

    当所有代码与纸张连接时,我的工作正常。

    这里我传递“tgl_butt”作为按钮名称

d

dim Ctrl as OLEObject
  With ActiveSheet
'
' change button colour
'
For Each Ctrl In OLEObjects
   If TypeName(Ctrl.Object) = "ToggleButton" Then
     If Ctrl.Name = Tgl_butt Then
        If BooValue = True Then
           OLEObjects(Ctrl.Name).Object.BackColor = RGB(255, 255, 0) ' in = yellow
           Else
           OLEObjects(Ctrl.Name).Object.BackColor = RGB(184, 204, 228) 'out = blue
       End If
    End If
 End If
Next Ctrl
End With

我现在正试图将此代码放入一个模块中,以便所有包含切换按钮的工作表可以共享它。

Call do_filter(Tgl_but.Value, "Tgl_name",  Ctrl)

然后在模块中..

Public Sub do_filter(BooValue As Boolean, Tgl_butt As String,Ctrl As OLEObject)

With ActiveSheet
  Dim myCtrl 'As OLEObject
   For Each myCtrl In Ctrl
      If TypeName(myCtrl.Object) = "ToggleButton" Then
         If myCtrl.Name = Tgl_butt Then
            If BooValue = True Then
               Ctrl(myCtrl.Name).Object.BackColor = RGB(255, 255, 0) ' in = yellow
            Else
               Ctrl(myCtrl.Name).Object.BackColor = RGB(184, 204, 228) 'out = blue
            End If
         End If
     End If
   Next myCtrl
End With

上面的代码出现“需要对象”错误。 Ctrl对象是空的...所以我想我某处有一些严重的错误!我已经尝试了很多这个代码的变体,但似乎无法让它工作!欢迎所有建议!

2 个答案:

答案 0 :(得分:0)

因此,您最初将代码放在工作表类中,并且它有效。然后你在一个模块中推广它,它不起作用。是吗?

如果是这种情况,我估计:

  1. 工作表类中的代码可以访问该工作表的OleObjects。
  2. 模块中的代码无法直接访问OleObjects集合,因为它们是类的全局,但不是模块中的。
  3. 使用您定义的代码:

    With ActiveSheet
    

    但不要使用。部分作为With的一部分。因为它没有被使用,所以没有用。 我认为你需要对这个对象进行限定。

    所以我会尝试使用ActiveSheet.OleObjects(或者如果使用With,则在OleObjects集合前放置一个。)。

    希望对你有用。

答案 1 :(得分:0)

发现它!现在,Call有太多的参数......所以我稍后会把它剪掉。

Dim inputsheet As Worksheet
Set inputsheet = Worksheets("blah")

Call change_colour(Tgl_EHCP.Value, "Tgl_name", inputsheet.OLEObjects("Tgl_name"))

Public Sub change_colour(BooValue As Boolean, Tgl_butt As String, tgl_button As OLEObject)
'
' change button colour
'
With ActiveSheet
  Dim myCtrl As OLEObject
  If BooValue = True Then
     tgl_button.Object.BackColor = RGB(255, 255, 0)
     Else
     tgl_button.Object.BackColor = RGB(184, 204, 228)
  End If
End With
End Sub