Excel VBA userform scrollbars 与 鼠标滚轮
Userform 窗体,插入滚动条 scrollbars 运行后,鼠标滚轮不起作用。
这个需要写什么代码吗?哪位高手能指点一下?谢谢! 展开
1、上下滚动表格:在Excel工作表中,选择某个单元格,然后上下滚动滚轮,表格将上下滚动。这有点类似点击滚动条的上下箭头。但点击滚动条的上下箭头每次只能滚动一行, 而滚动鼠标滚轮可以滚动一行或多行。在Windows XP或Windows Vista中,可以在控制面板中设置每次滚动的行数。以Vista为例,方法是:单击“开始→控制面板→鼠标”,弹出“鼠标属性”对话框,选择“滑轮”选 项卡,在“垂直滚动”区域中,选择“一次滚动下列行数”,并设置所需的数量。如果选择“一次滚动一个屏幕”,则每滚动一次滚轮,Excel表格将滚动屏幕 所显示的行数,相当于按PageUp或PageDown键。这种方法同样适用于Word或在浏览器中浏览网页。
2、左右滚动表格:在表格中按下滚轮,鼠标变成下面的形状,然后左右拖动鼠标,即可左右滚动表格,如果上下拖动鼠标,也可上下滚动表格。当鼠标离按下的地方越远,滚动的速度就越快。再次按下鼠标或滚动一下滚轮会取消这种滚动。
不过依据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帮助文档看看吧。
我建议你不要搞复杂了,除非你去了解一下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
正如你所见,需要写很多代码,而且子类化非常“危险”,在调试时任何错误都可能导致崩溃。
2、微调的话,可以用滚动条控件。拉小把中间的方块隐藏掉。如果是每次调整1和-1,max 和min属性设置为max:1,min:-1,smallchang:1。这样通过每一次点击来监视SpinButton的值来反应用户点击的是上/下按钮。
3、通过SpinButton的值的变化来设置相应的触发。