【问题标题】:vba pass ActiveX contol object to modulevba 将 ActiveX 控制对象传递给模块
【发布时间】:2016-05-06 23:54:30
【问题描述】:

我已经很好地扫描了 SO,但找不到解决方案。

  • 我的 Excel 工作簿中有许多工作表
  • 每个工作表都有相同的 ActiveX 切换按钮集合
  • 这些切换按钮控制数据透视图中数据的过滤。
    过滤“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 对象是空的......所以我想我在某个地方出现了严重错误!我已经尝试了该代码的多种变体,但似乎无法使其正常工作!欢迎所有建议!

【问题讨论】:

    标签: vba excel controls


    【解决方案1】:

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

    如果我认为是这样的话:

    1. 工作表类中的代码可以访问该工作表的 OleObjects。
    2. 模块中的代码不能直接访问 OleObjects 集合,因为它们是类的全局但不在模块中。..

    使用您定义的代码:

    With ActiveSheet
    

    但不要使用 .作为与的一部分的一部分。即 With 没有用,因为它没有被使用。 我认为您需要限定对象。

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

    希望对你有用。

    【讨论】:

    • 感谢@PaulG 的说明。直到我找到自己的解决方案才看到它!在传递对象方面,我是个初学者!
    • 不用担心 - 随时:)
    【解决方案2】:

    找到了!就目前而言,调用的参数太多......所以我稍后会减少它。

    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
    

    【讨论】:

      猜你喜欢
      • 2016-10-15
      • 1970-01-01
      • 2017-01-11
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多