Excel VBA userform scrollbars 与 鼠标滚轮

请教一下
Userform 窗体,插入滚动条 scrollbars 运行后,鼠标滚轮不起作用。
这个需要写什么代码吗?哪位高手能指点一下?谢谢!

1、上下滚动表格:在Excel工作表中,选择某个单元格,然后上下滚动滚轮,表格将上下滚动。这有点类似点击滚动条的上下箭头。但点击滚动条的上下箭头每次只能滚动一行, 而滚动鼠标滚轮可以滚动一行或多行。在Windows XP或Windows Vista中,可以在控制面板中设置每次滚动的行数。以Vista为例,方法是:单击“开始→控制面板→鼠标”,弹出“鼠标属性”对话框,选择“滑轮”选 项卡,在“垂直滚动”区域中,选择“一次滚动下列行数”,并设置所需的数量。如果选择“一次滚动一个屏幕”,则每滚动一次滚轮,Excel表格将滚动屏幕 所显示的行数,相当于按PageUp或PageDown键。这种方法同样适用于Word或在浏览器中浏览网页。

  2、左右滚动表格:在表格中按下滚轮,鼠标变成下面的形状,然后左右拖动鼠标,即可左右滚动表格,如果上下拖动鼠标,也可上下滚动表格。当鼠标离按下的地方越远,滚动的速度就越快。再次按下鼠标或滚动一下滚轮会取消这种滚动。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-02-13
正常情况下,鼠标滚轮没有影响对scrollbars,用户单击控件两端的箭头、单击滚动块与任意一个箭头之间的区域,或者拖动滚动块时,才产生Change和scroll事件。

不过依据VB和C#编程经验,调用系统API函数可以实现这一目的。
说起来也简单,主要就几步:
1、使用Declare声明API函数,比如:
Declare Function SetWindowPos Lib "user32" ( ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
2、设置常量比如:
Private Const SWP_NOSIZE = &H1
3、使用API函数,就像宏函数一般,没有特殊用法。比如:
k=SendMessage(TextHwnd,&HBB&,-1,0)
4、释放资源
有些API函数是要成对使用的,否则系统可能崩溃的,帮助中一般会提示。
注意:第一步,要搞清楚每一个参数,第二步,要常数不同会产生什么效果,第四步,有些函数是必须匹配使用的。
以上是大纲,必须遵守--我可是使用二个月的API函数才总结出来的哟--剩下的要看你的自学能力了。
关于Scrollbars的API记不得了,下个API帮助文档看看吧。本回答被提问者和网友采纳
第2个回答  2014-12-21

我建议你不要搞复杂了,除非你去了解一下windows系统的运行机制

baidu下“事件驱动”......


再说细点:子类化窗口函数(subclass),每个控件(有自己的句柄)都有自己的窗口处理函数,就是处理各种消息的(即事件)。子类化可以自定义这种行为,你这个问题就是窗口接收鼠标滚轮消息,下面是个例子:

'在窗口加载事件中,变量保存原始的窗口函数地址,
'hwnd是窗口句柄,需要用FindWindow这个API获得
preWinProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf Wndproc)
'在窗口Unload事件中,恢复原始的窗口函数地址
SetWindowLong Me.hwnd, GWL_WNDPROC, preWinProc
‘在标准模块中
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
’函数Wndproc就是句柄为hwnd的控件的子类化函数,这里处理的消息为热键
'当滚轮鼠标的滚动被用户操作时,窗口会收到WM_MOUSEWHEEL消息,请自行baidu
Public Function Wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_HOTKEY Then
        ’当按下热键时...
    End if
    Wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
    End If
End Function

正如你所见,需要写很多代码,而且子类化非常“危险”,在调试时任何错误都可能导致崩溃。

第3个回答  2016-01-12
1、VBA必须要装那个控件。而你发给别人必须带那个控件一起发。而且要求控件一起安装。所以建议不弄鼠标滚轮触发。
2、微调的话,可以用滚动条控件。拉小把中间的方块隐藏掉。如果是每次调整1和-1,max 和min属性设置为max:1,min:-1,smallchang:1。这样通过每一次点击来监视SpinButton的值来反应用户点击的是上/下按钮。
3、通过SpinButton的值的变化来设置相应的触发。