非ActiveX滚动条更改事件?

时间:2017-04-29 08:54:11

标签: vba excel-vba excel

我正在使用现代Excel滚动条(不是旧的ActiveX类型,即开发人员>插入>表单控件>滚动条),并且想要检测它的值何时更改。我找不到关于此类对象的更改事件的任何信息。您可以在点击时分配宏,但我希望我的代码在滚动上运行。

我已尝试将其链接到隐藏工作表上的单元格,并使用隐藏工作表的工作表更改事件但事件不会触发。我也尝试过没有成功的Workbook_SheetChange事件。

如何为非ActiveX滚动条模拟On_Scroll事件?感谢。

2 个答案:

答案 0 :(得分:3)

因此,您按照所描述的菜单路径(开发人员>插入>表单控件>滚动条),您可以将滚动条“绘制”到电子表格中。然后右键单击滚动条并选择“指定宏”:

enter image description here

请注意,滚动条的左上角有一个名称 - “滚动条1”。将建议使用宏名称 - 您可以保留该名称,然后单击“新建”:

enter image description here

现在您可以编写VBA代码了。目前尚不清楚最佳实践是什么才能获得对该特定滚动条对象的引用。我在下面的方式是:

  • 鉴于滚动条是Shape以及表单控件,我们可以从Application.Caller
  • 获取其名称
  • 迭代ScrollBars类的Worksheet成员,直到我们找到匹配的对象
  • 从对象获取Value属性以获取滚动条中拇指的当前位置

请注意,ScrollBars类的Worksheet成员是“隐藏的”,如果您转到VBE对象浏览器,右键单击“搜索结果”并选择“显示”即可看到它隐藏成员然后搜索ScrollBars。 Google为此提供的内容很少,因为显然排名较高的搜索都是关于Excel中的常规滚动条,或者是您在UserForm中使用的滚动条。无论如何,适合我的代码是:

Option Explicit

Sub ScrollBar1_Change()

    Dim strCaller As String
    Dim objScrollBar As Object
    Dim dblScrollValue As Double

    ' the scroll bar has a shape - so you can get the shape name
    strCaller = Application.Caller

    ' iterate hidden scrollbars member of worksheet class to get the object
    For Each objScrollBar In Sheet1.ScrollBars
        If objScrollBar.Name = strCaller Then
            Exit For
        End If
    Next

    ' get the scroll bar value
    dblScrollValue = objScrollBar.Value

    ' do something with the value
    MsgBox dblScrollValue

End Sub

答案 1 :(得分:0)

我是这样处理的。通过将值公开插入链接的单元格(具有它已有的值),将触发Change事件。

Private Sub ScrollBar11_Change()
    Range(ScrollBar11.LinkedCell) = ScrollBar11.Value
End Sub