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?
Đ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" .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?
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?
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?
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
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
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
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_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
Private Sub ComboBox1_LostFocus()
Range("F9").Comment.Visible = False
ComboBox1.Visible = False
MakeScrollableWithMouseWheel(ComboBox1) = False
End Sub
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 .
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
Private Sub ListBox1_Enter()
MakeScrollableWithMouseWheel(ListBox1) = True
End Sub
Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
MakeScrollableWithMouseWheel(ListBox1) = False
End Sub
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á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.
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á.
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.
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ỉ?
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: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
Private Declare Function FindWindow Lib "user32.dll" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
#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
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
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
Bạn chụp cái hình module đó lên lần nữa xem sao.Không được luôn anh![]()
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