ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7236|回复: 8

[求助] 工作表中的 LISTBOX如何实现鼠标滚动

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-2-19 09:11 | 显示全部楼层 |阅读模式
在论坛中找到实例可以实现窗口中的LISTBOX鼠标滚动,工作表中的LISTBOX该如何实现?谢谢!

工作表列表框滚动.zip

34.47 KB, 下载次数: 302

TA的精华主题

TA的得分主题

发表于 2021-2-19 09:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

TA的精华主题

TA的得分主题

发表于 2021-2-19 09:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
将代码中的列表指定为工作表列表:
  1. Private Function MouseProc( _
  2.                            ByVal nCode As Long, ByVal wParam As Long, _
  3.                            ByRef lParam As MOUSEHOOKSTRUCT) As Long
  4.     On Error GoTo errH    'Resume Next
  5.     If (nCode = HC_ACTION) Then
  6.         If WindowFromPoint(lParam.pt.X, lParam.pt.Y) = mListBoxHwnd Then
  7.             If wParam = WM_MOUSEWHEEL Then
  8.                 MouseProc = True
  9.                 If lParam.hwnd > 0 Then
  10.                     If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 1 Then Sheets("Sheet1").ListBox1.TopIndex = Sheets("Sheet1").ListBox1.TopIndex - 1
  11.                     If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 2 Then PostMessage mListBoxHwnd, WM_KEYDOWN, VK_UP, 0
  12.                 Else
  13.                     If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 1 Then Sheets("Sheet1").ListBox1.TopIndex = Sheets("Sheet1").ListBox1.TopIndex + 1
  14.                     If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 2 Then PostMessage mListBoxHwnd, WM_KEYDOWN, VK_DOWN, 0
  15.                 End If
  16.                 PostMessage mListBoxHwnd, WM_KEYUP, VK_UP, 0
  17.                 Exit Function
  18.             End If
  19.         Else
  20.             UnhookListBoxScroll
  21.         End If
  22.     End If
  23.     MouseProc = CallNextHookEx( _
  24.                                mLngMouseHook, nCode, wParam, ByVal lParam)
  25.     Exit Function
  26. errH:
  27.     UnhookListBoxScroll
  28. End Function
复制代码


frm.ListBox1 改为 Sheets("Sheet1").ListBox1
其他相关代码 亦指定一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-19 10:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
opiona 发表于 2021-2-19 09:43
http://club.excelhome.net/thread-1566208-1-1.html?_dsign=38d6bd0d

谢谢老师,之前的实例也是窗口中使用的,现在的listbox在工作表中该如何实现?谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-19 15:49 | 显示全部楼层
aman1516 发表于 2021-2-19 09:48
将代码中的列表指定为工作表列表:

谢谢老师!

TA的精华主题

TA的得分主题

发表于 2021-8-27 10:27 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-1-13 15:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-5-16 00:52 | 显示全部楼层
aman1516 发表于 2021-2-19 09:48
将代码中的列表指定为工作表列表:


我把frm.LISTBOX1 改成了表名sheets("明细登记".LISTBOX1 , 为什么我该表格里面弹出的窗体还是不能滚动列表呢?期待老师的回复.


Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Type MOUSEHOOKSTRUCT
    pt As POINTAPI
    hwnd As Long
    wHitTestCode As Long
    dwExtraInfo As Long
End Type

Private Declare Function FindWindow Lib "user32" _
                                    Alias "FindWindowA" ( _
                                                         ByVal lpClassName As String, _
                                                         ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLong Lib "user32.dll" _
                                       Alias "GetWindowLongA" ( _
                                                               ByVal hwnd As Long, _
                                                               ByVal nIndex As Long) As Long

Private Declare Function SetWindowsHookEx Lib "user32" _
                                          Alias "SetWindowsHookExA" ( _
                                                                     ByVal idHook As Long, _
                                                                     ByVal lpfn As Long, _
                                                                     ByVal hmod As Long, _
                                                                     ByVal dwThreadId As Long) As Long

Private Declare Function CallNextHookEx Lib "user32" ( _
                                                      ByVal hHook As Long, _
                                                      ByVal nCode As Long, _
                                                      ByVal wParam As Long, _
                                                      lParam As Any) As Long

Private Declare Function UnhookWindowsHookEx Lib "user32" ( _
                                                           ByVal hHook As Long) As Long

Private Declare Function PostMessage Lib "user32.dll" _
                                     Alias "PostMessageA" ( _
                                                           ByVal hwnd As Long, _
                                                           ByVal wMsg As Long, _
                                                           ByVal wParam As Long, _
                                                           ByVal lParam As Long) As Long

Private Declare Function WindowFromPoint Lib "user32" ( _
                                                       ByVal xPoint As Long, _
                                                       ByVal yPoint As Long) As Long

Private Declare Function GetCursorPos Lib "user32.dll" ( _
                                                        ByRef lpPoint As POINTAPI) As Long

Private Const WH_MOUSE_LL As Long = 14
Private Const WM_MOUSEWHEEL As Long = &H20A
Private Const HC_ACTION As Long = 0
Private Const GWL_HINSTANCE As Long = (-6)

Private Const WM_KEYDOWN As Long = &H100
Private Const WM_KEYUP As Long = &H101
Private Const VK_UP As Long = &H26
Private Const VK_DOWN As Long = &H28
Private Const WM_LBUTTONDOWN As Long = &H201

Private mLngMouseHook As Long
Private mListBoxHwnd As Long
Private mbHook As Boolean
Public LISTBOX_Post_Flag As Integer
Public LISTBOX_Mouse_Flag As Integer

Sub HookListBoxScroll()
    Dim lngAppInst As Long
    Dim hwndUnderCursor As Long
    Dim tPT As POINTAPI
    GetCursorPos tPT
    hwndUnderCursor = WindowFromPoint(tPT.X, tPT.Y)
    If mListBoxHwnd <> hwndUnderCursor Then
        UnhookListBoxScroll
        mListBoxHwnd = hwndUnderCursor
        lngAppInst = GetWindowLong(mListBoxHwnd, GWL_HINSTANCE)
        PostMessage mListBoxHwnd, WM_LBUTTONDOWN, 0&, 0&
        If Not mbHook Then
            mLngMouseHook = SetWindowsHookEx( _
                                             WH_MOUSE_LL, AddressOf MouseProc, lngAppInst, 0)
            mbHook = mLngMouseHook <> 0
        End If
    End If
End Sub

Sub UnhookListBoxScroll()
    If mbHook Then
        UnhookWindowsHookEx mLngMouseHook
        mLngMouseHook = 0
        mListBoxHwnd = 0
        mbHook = False
    End If
End Sub

Private Function MouseProc( _
                           ByVal nCode As Long, ByVal wParam As Long, _
                           ByRef lParam As MOUSEHOOKSTRUCT) As Long
    On Error GoTo errH    'Resume Next
    If (nCode = HC_ACTION) Then
        If WindowFromPoint(lParam.pt.X, lParam.pt.Y) = mListBoxHwnd Then
            If wParam = WM_MOUSEWHEEL Then
                MouseProc = True
                If lParam.hwnd > 0 Then
                    If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 1 Then Sheets("明细登记").ListBox1.TopIndex = Sheets("明细登记").ListBox1.TopIndex - 1
                    If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 2 Then PostMessage mListBoxHwnd, WM_KEYDOWN, VK_UP, 0
                Else
                    If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 1 Then Sheets("明细登记").ListBox1.TopIndex = Sheets("明细登记").ListBox1.TopIndex + 1
                    If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 2 Then PostMessage mListBoxHwnd, WM_KEYDOWN, VK_DOWN, 0
                End If
                PostMessage mListBoxHwnd, WM_KEYUP, VK_UP, 0
                Exit Function
            End If
        Else
            UnhookListBoxScroll
        End If
    End If
    MouseProc = CallNextHookEx( _
                               mLngMouseHook, nCode, wParam, ByVal lParam)
    Exit Function
errH:
    UnhookListBoxScroll
End Function





TA的精华主题

TA的得分主题

发表于 2023-3-17 13:12 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 09:41 , Processed in 0.045074 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表