Tặng các bạn validation-combo box có thể sử dụng mouse wheel. (1 người xem)

  • Thread starter Thread starter nhapmon
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

nhapmon

Thành viên tích cực
Tham gia
31/10/07
Bài viết
1,179
Được thích
880
Tặng các bạn validation-combo box có thể sử dụng mouse wheel.
mình chỉ tập tành chơi VBA thôi, có chổ nào gòa mở các cao thủ chỉ giúp nha.

nhân tiện cho hỏi, vì sao mình không thể sử dụng event GotFocus trong combo box được vậy?
 

File đính kèm

Tặng các bạn validation-combo box có thể sử dụng mouse wheel.
mình chỉ tập tành chơi VBA thôi, có chổ nào gòa mở các cao thủ chỉ giúp nha.

nhân tiện cho hỏi, vì sao mình không thể sử dụng event GotFocus trong combo box được vậy?

Bác cho em hỏi, để đổi chỗ để chọn (DropDown List) và đổi địa chỉ nguồn trong List thì làm thể nào ?
(Em không phải gà mờ đâu mà em mù hẳn về VBA)
 
Upvote 0
Tặng các bạn validation-combo box có thể sử dụng mouse wheel.
mình chỉ tập tành chơi VBA thôi, có chổ nào gòa mở các cao thủ chỉ giúp nha.

nhân tiện cho hỏi, vì sao mình không thể sử dụng event GotFocus trong combo box được vậy?
Đang tập tành và còn nhờ cao thủ chỉ giúp thì đừng đưa ra "TẶNG" bạn nhé, mình không rành code, mình nghĩ mang ra tặng thì đó phải là sản phẩm đảm bảo hữu ích, sử dụng trơn tru, tốt. Ở đây nhiều tiền bối lắm, coi chừng bị sửa "cốt" .
 
Upvote 0
về nguồn thì ở đâu củng được, miễn là bạn khai báo define mane nó là list, còn bạn muốn đổi luôn tên list thì phải vào code khai báo lại

còn chổ để dropdown list thì ở đâu bạn đặt validation list thì ở đó sẽ có combo box
nếu bạn muốn dờ qua sheet khác, thì chép toàn bộ code ở sheet1 của file này sang sheet tương ứng của bạn.

bạn loenguyen thân mến,
mình vừa làm vừa học mà, trách làm chi câu chử,
sản phẩm này, mình thấy nó chạy ok có thể áp dụng được,
nhưng nếu có cao thủ nào chỉ ra những điểm không hay thì mình học thêm
 
Lần chỉnh sửa cuối:
Upvote 0
Tặng các bạn validation-combo box có thể sử dụng mouse wheel.
mình chỉ tập tành chơi VBA thôi, có chổ nào gòa mở các cao thủ chỉ giúp nha.

nhân tiện cho hỏi, vì sao mình không thể sử dụng event GotFocus trong combo box được vậy?

Bạn nói bạn "chỉ tập tành" nhưng tôi thấy code khá "khủng" ---> Cũng tầm cở ĐẠI CA của các SƯ PHỤ rồi
Thế thì tầm trình độ cở tôi trở xuống chắc... chạy làng thôi ---> Chả biết có thể "giúp" được giống gì ---> Thôi thì giúp.. xem chơi vậy!
Ẹc... Ẹc...
 
Upvote 0
Combo Box (ActiveX Control) có sẵn, mình nghĩ là không cần dùng đến code, ListFillRange có thể thay bằng Name động .
Diễn đàn hoan nghênh các sản phẩm Excel hữu ích, ứng dụng của bạn cũng vậy .
Câu chữ diễn đạt thể hiện sự tôn trọng đối với người đọc, một bài viết mà bắt người đọc đoán chữ thì không hay chút nào .
Mình cũng "gà mờ" thôi, nên có một góp ý nho nhỏ, vì những gì viết trên diễn đàn có hàng trăm, hàng ngàn người theo dõi, trong đó nhiều bậc tiền bối gạo cội của GPE .
 
Upvote 0
Tặng các bạn validation-combo box có thể sử dụng mouse wheel.
mình chỉ tập tành chơi VBA thôi, có chổ nào gòa mở các cao thủ chỉ giúp nha.

nhân tiện cho hỏi, vì sao mình không thể sử dụng event GotFocus trong combo box được vậy?

Rất là hay! Cám ơn bạn đã tặng những bài hữu ích!

Bình thường thì sự kiện đó vẫn hoạt động, nhưng có lẽ nó chạy thủ tục scroll nên nó bị ngưng hoạt động chăng?

Thôi thì bạn dùng đỡ cái này chắc sẽ tốt hơn đấy!

PHP:
Private Sub ComboBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Me.ComboBox1.DropDown
    MakeScrollableWithMouseWheel(ComboBox1) = True
End Sub
 
Upvote 0
Tôi xin mạo muội sửa lại Code trong Sheet của bạn nhé!

Sự kiện SelectionChange ngắn gọn tí:

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$F$9" Then
        Target.Value = ""
        With ComboBox1
            .Top = Target.Top
            .Left = Target.Left
            .Width = Target.Width
            .ListFillRange = ""
            .LinkedCell = "F9"
            .Visible = True
            .Activate
        End With
    End If
End Sub

Với ComboBox1 tôi dùng 4 sự kiện:

PHP:
Private Sub Combobox1_GotFocus()
    Dim str As String
    Dim cboTemp As OLEObject
    Set cboTemp = Me.OLEObjects("Combobox1")
    On Error Resume Next
    cboTemp.ListFillRange = "list"
    ComboBox1.DropDown
    MakeScrollableWithMouseWheel(ComboBox1) = True
    Set cboTemp = Nothing
End Sub

PHP:
Private Sub ComboBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    ComboBox1.DropDown
End Sub

PHP:
Private Sub ComboBox1_KeyDown(ByVal _
        KeyCode As MSForms.ReturnInteger, _
        ByVal Shift As Integer)
    'Hide combo box and move to next cell on Enter and Tab
    Select Case KeyCode
        Case 9 'tab key
            ActiveCell.Offset(0, 1).Activate
        Case 13 'enter key
            ActiveCell.Offset(1, 0).Activate
        Case 37 'left
            ActiveCell.Offset(0, -1).Activate
        Case 39 'right
            ActiveCell.Offset(0, 1).Activate
        Case 46 ' delete key
            Me.ComboBox1.Value = ""
            Me.ComboBox1.DropDown

    Case 8 ' Backspace key
            Me.ComboBox1.Value = ""
            Me.ComboBox1.DropDown

    End Select

End Sub

PHP:
Private Sub ComboBox1_LostFocus()
    Range("F9").Comment.Visible = False
    ComboBox1.Visible = False
    MakeScrollableWithMouseWheel(ComboBox1) = False
End Sub

Không biết ý bạn thế nào nhỉ?
 

File đính kèm

Upvote 0
Combo Box (ActiveX Control) có sẵn, mình nghĩ là không cần dùng đến code, ListFillRange có thể thay bằng Name động .
Diễn đàn hoan nghênh các sản phẩm Excel hữu ích, ứng dụng của bạn cũng vậy .
Câu chữ diễn đạt thể hiện sự tôn trọng đối với người đọc, một bài viết mà bắt người đọc đoán chữ thì không hay chút nào .
Mình cũng "gà mờ" thôi, nên có một góp ý nho nhỏ, vì những gì viết trên diễn đàn có hàng trăm, hàng ngàn người theo dõi, trong đó nhiều bậc tiền bối gạo cội của GPE .

Anh nghĩ rằng tác giả nói "Tặng" ở đây là tặng các hàm và các thuộc tính làm cho sử dụng được bằng scrollwheel của chuột. Với các ComboBox, ListBox thông thường không có chức năng này. Vì thế bạn ấy chia sẽ thì chúng ta hoan nghênh và trân trọng chứ em trai! Còn việc ứng dụng vào nó thì có khi người ta quen dùng với FORM chẳng hạn, bây giờ chuyển qua SHEET đôi khi lại lúng túng trong ứng dụng thì việc hỏi thêm là chuyện bình thường! Vui vẻ lên nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Thật tuyệt vời các bạn ơi! Đúng như mình đoán thì Hàm này, đúng nghĩa hơn thì thuộc tính này (Property) có thể sử dụng trên UserForm cả cho ComboBox và cho cả ListBox nữa! Với Form thì nó đơn giản vô cùng!

Các bạn tham khảo nhé!

Với ComboBox:

PHP:
Private Sub ComboBox1_Enter()
    MakeScrollableWithMouseWheel(ComboBox1) = True
End Sub

Private Sub ComboBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    ComboBox1.DropDown
End Sub

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    MakeScrollableWithMouseWheel(ComboBox1) = False
End Sub

Với ListBox càng đơn giản hơn!

PHP:
Private Sub ListBox1_Enter()
    MakeScrollableWithMouseWheel(ListBox1) = True
End Sub

Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    MakeScrollableWithMouseWheel(ListBox1) = False
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
cám ơn bạn Hoàng Trọng Nghĩa thông cảm cho mình.
và đã phát triển nó sang form.
mình đã chạy thử file của bạn sau khi đã sửa, nó chạy rất tốt. ko hiểu sao? khi mình làm nó thì event GotFocus ko có tín hiệu gì hết chơn.

thiệt ra thì code không phải do mình viết, mình chỉ lên mạng tìm từ nhiều nguồn, từ nhiều đề tài khác nhau, rồi lắp rắp lại sao cho nó chạy được. Do là hàng lắp rắp nên mình nghĩ nó ở sheet này file này thì ok, nhưng chép qua chổ khác thì nhiều khi nó bị "thủng", chứ mình không phải là tầm cở "đại ca sư phụ".

lúc post bài lên thì mình loay hoay không biết viết gì, nên đặt đại nó cái tên là vậy, không ngờ chữ "Tặng" lại gây khó chịu cho một số vị thành viên gạo cội.

rất cám ơn vì đã góp ý, lần sau nếu có khả năng post bài lên thì mình sẽ lưu ý dùng từ cho phù hợp với trình độ "lu xu bu" của mình (mà có bu thì diễm đàn mới đông được chứ hén...hihihi

chúc các bạn một ngày vui vẻ
 
Upvote 0
cám ơn bạn Hoàng Trọng Nghĩa thông cảm cho mình.
và đã phát triển nó sang form.
mình đã chạy thử file của bạn sau khi đã sửa, nó chạy rất tốt. ko hiểu sao? khi mình làm nó thì event GotFocus ko có tín hiệu gì hết chơn.

thiệt ra thì code không phải do mình viết, mình chỉ lên mạng tìm từ nhiều nguồn, từ nhiều đề tài khác nhau, rồi lắp rắp lại sao cho nó chạy được. Do là hàng lắp rắp nên mình nghĩ nó ở sheet này file này thì ok, nhưng chép qua chổ khác thì nhiều khi nó bị "thủng", chứ mình không phải là tầm cở "đại ca sư phụ".

lúc post bài lên thì mình loay hoay không biết viết gì, nên đặt đại nó cái tên là vậy, không ngờ chữ "Tặng" lại gây khó chịu cho một số vị thành viên gạo cội.

rất cám ơn vì đã góp ý, lần sau nếu có khả năng post bài lên thì mình sẽ lưu ý dùng từ cho phù hợp với trình độ "lu xu bu" của mình (mà có bu thì diễm đàn mới đông được chứ hén...hihihi

chúc các bạn một ngày vui vẻ

Có một điều đáng tiếc là khi mình xài Laptop, nó không cho scroll bằng cảm ứng.
 
Upvote 0
Mình rất thấy ứng dụng này (Scrollwheel2) rất có ý nghĩa. Tuy nhiên nó chỉ có tại 1 ô F9. Mong các bạn GPE Sửa để nó chạy trên cả cột F thi hay quá.
 
Upvote 0
Cái bảng tính tình nó cứ nhảy cà tưng khi ta di chuyển giữa các ô và không cho chúng ta Undo nhỉ? Mình trước đây cũng có viết và thủ tục nghịch VBA chơi nhưng có cứ làm cái bảng tính của mình không Undo được thật là bất tiện.
 
Upvote 0
Cái bảng tính tình nó cứ nhảy cà tưng khi ta di chuyển giữa các ô và không cho chúng ta Undo nhỉ? Mình trước đây cũng có viết và thủ tục nghịch VBA chơi nhưng có cứ làm cái bảng tính của mình không Undo được thật là bất tiện.

Hầu như các control sử dụng đều tùy thuộc vào VBA, đã dùng VBA thì hầu như không Undo lại được, vì thế bạn phải chấp nhận điều này!


Với việc ScrollWheel này đã được Thầy Siwtom viết lại, nhanh, gọn và sử dụng cho cả scrollwheel ảo của laptop, không bị cà giựt màn hình.

Tại bài #35 của topic này:

http://www.giaiphapexcel.com/forum/...u-đề-cho-Listbox-bằng-VBA&p=460699#post460699
 
Upvote 0
Mình rất thấy ứng dụng này (Scrollwheel2) rất có ý nghĩa. Tuy nhiên nó chỉ có tại 1 ô F9. Mong các bạn GPE Sửa để nó chạy trên cả cột F thi hay quá.

Làm sẳn cho bạn thì dễ quá rồi, nhưng tôi muốn bạn tự mày mò để học hỏi thêm.

Bạn tải file này của Thầy ndu96081631 về, tại bài #14 của topic này:

http://www.giaiphapexcel.com/forum/showthread.php?31233-ứng-dụng-combo-box-động&p=209972#post209972


Sau đó kết hợp với bài dưới đây và chỉnh sửa, lắp ghép lại theo ý của bạn.

http://www.giaiphapexcel.com/forum/...u-đề-cho-Listbox-bằng-VBA&p=460699#post460699
 
Upvote 0
Cảm ơn bạn đã khuyến khích! Mình mới tự học VBA, hiện nay để hiểu câu lệnh nói gì vẫn đang là vấn đề lớn với mình. Mình cũng đã tự sửa để nó chạy cả cột F.
Mình muốn xây dựng 1 File mà Dữ liệu đầu vào bao gồm Tên thuốc, đơn vị tính, giá...Trong đó Tên thuốc sử dụng ứng dụng Scrollwheel còn lại đơn vị tính, giá...thì dùng Worksheet_Change Vlookup. Bạn xem giúp mình chút nhé. Mục tiêu mình ghi trong File
 

File đính kèm

Upvote 0
Với việc ScrollWheel này đã được Thầy Siwtom viết lại, nhanh, gọn và sử dụng cho cả scrollwheel ảo của laptop, không bị cà giựt màn hình.

Tại bài #35 của topic này:

http://www.giaiphapexcel.com/forum/...u-đề-cho-Listbox-bằng-VBA&p=460699#post460699[/QUOTE]
anh Nghĩa ơi, nếu muốn áp dụng vào combo box trên sheet thì phải khai báo ra sao anh,
tôi loay hoay hoai mà hổng được, nó treo exceel và thoat luôn,
có sự khác biệt gì giữa combo box khi tạo bằng activeX control và form controls không anh.

tks anh.
 
Upvote 0
anh Nghĩa ơi, nếu muốn áp dụng vào combo box trên sheet thì phải khai báo ra sao anh,
tôi loay hoay hoai mà hổng được, nó treo excel và thoát luôn,
có sự khác biệt gì giữa combo box khi tạo bằng activeX control và form controls không anh.

tks anh.

Với hàm mà Thầy siwtom viết, chỉ thực hiện trên ComboBox của UserForm hoặc trên ActiveX Controls mà thôi. Còn trên Form Controls thì không thực hiện được.
 
Upvote 0
Với hàm mà Thầy siwtom viết, chỉ thực hiện trên ComboBox của UserForm hoặc trên ActiveX Controls mà thôi. Còn trên Form Controls thì không thực hiện được.

Sorry, tôi đã test lại, thấy hàm mà Thầy siwtom viết chỉ ứng dụng trên UserForm thôi, còn ActiveX Controls thì không thể thực hiện được.

Tôi đã thử nạp hWin bằng nhiều cách nhưng cũng không xong:

1) hWin = Application.hwnd

2) hWin = FindWindow("ThunderDFrame", Application.Caption)

Vì tôi không rành về API nên cũng không thể giúp gì cho các bạn. Chắc có lẽ phải nhờ Thầy siwtom ra tay thôi.

http://www.giaiphapexcel.com/forum/...u-đề-cho-Listbox-bằng-VBA&p=460699#post460699
 
Upvote 0
Anh cho em hỏi, e đang dùng win 8 64bit, excel 2010, e down file scrollwheel2.xls về nhưng sai ko được. Báo lỗi: "Comile error: The code in this project must be updated for un on 64-bit systems. Please review and update declare statements and then mark them with the PtrSafe attribute". A có thể update file được ko? Cám ơn anh

Tôi xin mạo muội sửa lại Code trong Sheet của bạn nhé!

Sự kiện SelectionChange ngắn gọn tí:

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$F$9" Then
        Target.Value = ""
        With ComboBox1
            .Top = Target.Top
            .Left = Target.Left
            .Width = Target.Width
            .ListFillRange = ""
            .LinkedCell = "F9"
            .Visible = True
            .Activate
        End With
    End If
End Sub

Với ComboBox1 tôi dùng 4 sự kiện:

PHP:
Private Sub Combobox1_GotFocus()
    Dim str As String
    Dim cboTemp As OLEObject
    Set cboTemp = Me.OLEObjects("Combobox1")
    On Error Resume Next
    cboTemp.ListFillRange = "list"
    ComboBox1.DropDown
    MakeScrollableWithMouseWheel(ComboBox1) = True
    Set cboTemp = Nothing
End Sub

PHP:
Private Sub ComboBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    ComboBox1.DropDown
End Sub

PHP:
Private Sub ComboBox1_KeyDown(ByVal _
        KeyCode As MSForms.ReturnInteger, _
        ByVal Shift As Integer)
    'Hide combo box and move to next cell on Enter and Tab
    Select Case KeyCode
        Case 9 'tab key
            ActiveCell.Offset(0, 1).Activate
        Case 13 'enter key
            ActiveCell.Offset(1, 0).Activate
        Case 37 'left
            ActiveCell.Offset(0, -1).Activate
        Case 39 'right
            ActiveCell.Offset(0, 1).Activate
        Case 46 ' delete key
            Me.ComboBox1.Value = ""
            Me.ComboBox1.DropDown

    Case 8 ' Backspace key
            Me.ComboBox1.Value = ""
            Me.ComboBox1.DropDown

    End Select

End Sub

PHP:
Private Sub ComboBox1_LostFocus()
    Range("F9").Comment.Visible = False
    ComboBox1.Visible = False
    MakeScrollableWithMouseWheel(ComboBox1) = False
End Sub

Không biết ý bạn thế nào nhỉ?
 
Upvote 0
Anh cho em hỏi, e đang dùng win 8 64bit, excel 2010, e down file scrollwheel2.xls về nhưng sai ko được. Báo lỗi: "Comile error: The code in this project must be updated for un on 64-bit systems. Please review and update declare statements and then mark them with the PtrSafe attribute". A có thể update file được ko? Cám ơn anh
Vì tôi không có máy 64bit nên không thể test được, bạn thử thay thế trong Module1 dòng API này:

Mã:
Private Declare Function FindWindow Lib "user32.dll" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Thành:

Mã:
#If VBA7 And Win64 Then 'Office 64-bit
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else ' Office 32-bit
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If

Thử xem nó có hoạt động không rồi tính tiếp ha.
 
Upvote 0
Chào anh, cũng không được luôn anh, em chụp hình phần báo lỗi để a coi nhe.
Pic 1: là lúc chưa sửa code. Khi em vừa mở file lên thì nó báo lỗi:
scrollwheel2_issue.jpg

Sau khi sửa code thì vẫn báo lỗi
scrollwheel2_issue_2.jpg
 
Upvote 0
Chào anh, cũng không được luôn anh, em chụp hình phần báo lỗi để a coi nhe.
Pic 1: là lúc chưa sửa code. Khi em vừa mở file lên thì nó báo lỗi:


Sau khi sửa code thì vẫn báo lỗi

Bây giờ bạn thử thay toàn bộ Module1 đó bằng tất cả thủ tục dưới đây xem:

Mã:
Option Explicit
' Developed D.T.NAM.
' CFT VINA COPPER CO.,

Private Type POINTAPI
  X As Long
  Y As Long
End Type

Private Type MSLLHOOKSTRUCT
    pt As POINTAPI
    mousedata As Long
    flags As Long
    time As Long
    dwExtraInfo As Long
End Type

#If VBA7 And Win64 Then 'Office 64-bit
    
    Private Declare PtrSafe Function FindWindow Lib "user32" _
        Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As LongPtr

    Private Declare PtrSafe Sub CopyMemory Lib "kernel32" _
        Alias "RtlMoveMemory" ( _
        ByVal Destination As LongPtr, _
        ByVal Source As LongPtr, _
        ByVal Length As LongPtr)
    
    Private Declare PtrSafe Function GetWindowLong Lib "user32" _
        Alias "GetWindowLongA" ( _
        ByVal hwnd As LongPtr, _
        ByVal nIndex As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" _
        Alias "SetWindowsHookExA"( _
        ByVal idHook As LongPtr, _
        ByVal lpfn As LongPtr, _
        ByVal hmod As LongPtr, _
        ByVal dwThreadId As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function CallNextHookEx Lib "user32" ( _
        ByVal hHook As LongPtr, _
        ByVal nCode As LongPtr, _
        ByVal wParam As LongPtr, _
        lParam As Any) As LongPtr
    
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" ( _
        ByVal hHook As LongPtr) As LongPtr

#Else ' Office 32-bit
    
    Private Declare Function FindWindow Lib "user32" _
        Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
    
    Private Declare Sub CopyMemory Lib "kernel32" _
        Alias "RtlMoveMemory" ( _
        ByVal Destination As Long, _
        ByVal Source As Long, _
        ByVal Length As Long)
    
    Private Declare Function GetWindowLong Lib "user32" _
        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
#End If

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

Private uParamStruct As MSLLHOOKSTRUCT
Private oObject As Object
Private lLowLevelMouse As Long
Private bHooked As Boolean

'====================='
'\\ Public Routines   '
'====================='

Public Property Let MakeScrollableWithMouseWheel _
(ByVal Obj As Object, ByVal vNewValue As Boolean)

    If vNewValue Then
        Hook_Mouse
    Else
        UnHook_Mouse
    End If
    
    Set oObject = Obj
    bHooked = vNewValue

End Property

Public Property Get MakeScrollableWithMouseWheel _
(ByVal Obj As Object) As Boolean

    MakeScrollableWithMouseWheel = bHooked

End Property

'====================='
'\\ Private Routines  '
'====================='

Function LowLevelMouseProc _
(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

    Static iTopIndex As Integer
    
    On Error Resume Next
    
    If (nCode = HC_ACTION) Then
        If wParam = WM_MOUSEWHEEL Then
            With oObject
                If GetHookStruct(lParam).mousedata > 0 Then
                    .TopIndex = iTopIndex - 1
                    iTopIndex = .TopIndex
                Else
                    .TopIndex = iTopIndex + 1
                    iTopIndex = .TopIndex
                End If
            End With
            LowLevelMouseProc = -1
            Exit Function
        End If
    End If

    LowLevelMouseProc = _
    CallNextHookEx(lLowLevelMouse, nCode, wParam, ByVal lParam)
    
End Function

Private Function GetHookStruct(ByVal lParam As Long) As MSLLHOOKSTRUCT

   CopyMemory VarPtr(uParamStruct), lParam, LenB(uParamStruct)
   GetHookStruct = uParamStruct
    
End Function

Private Function GetAppInstance() As Long
 
    GetAppInstance = GetWindowLong _
    (FindWindow("XLMAIN", Application.Caption), GWL_HINSTANCE)
 
End Function

Private Sub Hook_Mouse()

    If lLowLevelMouse = 0 Then
        lLowLevelMouse = SetWindowsHookEx _
        (WH_MOUSE_LL, AddressOf LowLevelMouseProc, GetAppInstance, 0)
    End If
    
End Sub

Private Sub UnHook_Mouse()
    
    If lLowLevelMouse <> 0 Then _
    UnhookWindowsHookEx lLowLevelMouse: lLowLevelMouse = 0
    
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thử lần cuối xem, toàn bộ dùng cho 64bit. Bạn test dùm xem. Thay thế code cũ bằng code này nhé:

Mã:
Option Explicit
' Developed D.T.NAM.
' CFT VINA COPPER CO.,


Private Type POINTAPI
  X As LongPtr
  Y As LongPtr
End Type


Private Type MSLLHOOKSTRUCT
    pt As POINTAPI
    mousedata As LongPtr
    flags As LongPtr
    time As LongPtr
    dwExtraInfo As LongPtr
End Type


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


Private Declare PtrSafe Sub CopyMemory Lib "kernel32" _
    Alias "RtlMoveMemory" ( _
    ByVal Destination As LongPtr, _
    ByVal Source As LongPtr, _
    ByVal Length As LongPtr)


Private Declare PtrSafe Function GetWindowLong Lib "user32" _
    Alias "GetWindowLongA" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIndex As LongPtr) As LongPtr


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


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


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


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


Private uParamStruct As MSLLHOOKSTRUCT
Private oObject As Object
Private lLowLevelMouse As Long
Private bHooked As Boolean


Public Property Let MakeScrollableWithMouseWheel _
(ByVal Obj As Object, ByVal vNewValue As Boolean)
    If vNewValue Then
        Hook_Mouse
    Else
        UnHook_Mouse
    End If
    Set oObject = Obj
    bHooked = vNewValue
End Property


Public Property Get MakeScrollableWithMouseWheel _
(ByVal Obj As Object) As Boolean
    MakeScrollableWithMouseWheel = bHooked
End Property


Function LowLevelMouseProc(ByVal nCode As LongPtr, _
                           ByVal wParam As LongPtr, _
                           ByVal lParam As LongPtr) As LongPtr
    Static iTopIndex As Integer
    On Error Resume Next
    If (nCode = HC_ACTION) Then
        If wParam = WM_MOUSEWHEEL Then
            With oObject
                If GetHookStruct(lParam).mousedata > 0 Then
                    .TopIndex = iTopIndex - 1
                    iTopIndex = .TopIndex
                Else
                    .TopIndex = iTopIndex + 1
                    iTopIndex = .TopIndex
                End If
            End With
            LowLevelMouseProc = -1
            Exit Function
        End If
    End If
    LowLevelMouseProc = _
    CallNextHookEx(lLowLevelMouse, nCode, wParam, ByVal lParam)
End Function


Private Function GetHookStruct(ByVal lParam As LongPtr) As MSLLHOOKSTRUCT
   CopyMemory VarPtr(uParamStruct), lParam, LenB(uParamStruct)
   GetHookStruct = uParamStruct
End Function


Private Function GetAppInstance() As LongPtr
    GetAppInstance = GetWindowLong _
    (FindWindow("XLMAIN", Application.Caption), GWL_HINSTANCE)
End Function


Private Sub Hook_Mouse()
    If lLowLevelMouse = 0 Then
        lLowLevelMouse = SetWindowsHookEx _
        (WH_MOUSE_LL, AddressOf LowLevelMouseProc, GetAppInstance, 0)
    End If
End Sub


Private Sub UnHook_Mouse()
    If lLowLevelMouse <> 0 Then _
    UnhookWindowsHookEx lLowLevelMouse: lLowLevelMouse = 0
End Sub
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom