Bắt sự kiện KeyPressed trên Cell

Liên hệ QC

rollover79

Thành viên tiêu biểu
Tham gia
10/9/08
Bài viết
764
Được thích
1,310
Tôi xin gửi mọi người cùng tham khảo 1 phương pháp để bắt sự kiện KeyPressed trên 1 cell ngay cả khi đang edit, để từ đó có thể xử lý trực tiếp từng ký tự được nhập vào.
Trong file ví dụ tôi xử lý sự kiện cho ô A1(Xác định trong Worksheet_SelectionChange của Sheet1), và chỉ cho phép nhập các ký tự là số(từ 0 đến 9, sự kiện được xử lý tại hàm Cell_OnKeyDown của module)
 

File đính kèm

  • KeyPressedEventOnCell.rar
    11.2 KB · Đọc: 487
Bạn sửa khai báo hàm "SetWindowsHookEx" trong nhánh #VBA7 như dưới đây xem ok không?
Public Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias
"SetWindowsHookExA" (ByVal idHook As LongLong, ByVal lpFn As LongPtr,
ByVal hmod As LongPtr, ByVal dwThreadId As LongLong) As LongLong
Vẫn không được bạn Nguyễn Duy Tuân ơi
Vấn đề này đã lâu nhưng thấy chưa có câu trả lời, nên xin góp ý:
Một số phương thức ở 32bit không thể dùng ở 64bit, dù cho sử dụng tính tương thích ngược. Nên Microsoft mới thêm các phương thức mới để hỗ trợ tương thích với 64bit.
Ở đây, Application.Hinstance sẽ phải sửa thành Application.HinstancePtr
PHP:
Sub ActiveEvent(rng As Range)
  Unhook_KeyBoard
  #If VBA7 And Win64 Then
    Dim LngHinstance As LongPtr
    LngHinstance = Application.HinstancePtr
  #Else
    Dim LngHinstance As Long
    LngHinstance = Application.Hinstance
  #End If
  hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf Cell_OnKeyDown, LngHinstance, 0)
  SaveHookIDToReg hhkLowLevelKybd
End Sub
 
Upvote 0
Bắt event này giờ đã cũ, bạn co thể nghiên cứu bắt dược ký tự unicode và xóa từ trong cells do
 
Upvote 0
Bắt event này giờ đã cũ, bạn co thể nghiên cứu bắt dược ký tự unicode và xóa từ trong cells do
Bạn nói vậy chắc cách mới đó là mã nguồn đóng, nên cần phải nghiên cứu.
Tôi không rõ bạn nói bắt ký tự Unicode, nghe có vẻ lạ. Chắc là bạn nói các ký tự có dấu.
Tôi chỉ hiểu Unicode là một bảng mã ký tự được tiêu chuẩn hóa.
 
Upvote 0
Bạn nói vậy chắc cách mới đó là mã nguồn đóng, nên cần phải nghiên cứu.
Tôi không rõ bạn nói bắt ký tự Unicode, nghe có vẻ lạ. Chắc là bạn nói các ký tự có dấu.
Tôi chỉ hiểu Unicode là một bảng mã ký tự được tiêu chuẩn hóa.

Tóm lại ý mình nói là : mình đánh vào chữ
Tớ là thủy
Và xóa chữ "là" thì nó bắt dược chữ "Tớ thủy".
Bạn làm dược hướng dẫn mình với nhé.
Thank you
 
Upvote 0
Vấn đề này đã lâu nhưng thấy chưa có câu trả lời, nên xin góp ý:
Một số phương thức ở 32bit không thể dùng ở 64bit, dù cho sử dụng tính tương thích ngược. Nên Microsoft mới thêm các phương thức mới để hỗ trợ tương thích với 64bit.
Ở đây, Application.Hinstance sẽ phải sửa thành Application.HinstancePtr
PHP:
Sub ActiveEvent(rng As Range)
  Unhook_KeyBoard
  #If VBA7 And Win64 Then
    Dim LngHinstance As LongPtr
    LngHinstance = Application.HinstancePtr
  #Else
    Dim LngHinstance As Long
    LngHinstance = Application.Hinstance
  #End If
  hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf Cell_OnKeyDown, LngHinstance, 0)
  SaveHookIDToReg hhkLowLevelKybd
End Sub
Mình thử trong office 64 bit giờ không còn được nữa.
Trong bản windows 64bit ở máy khác kèm office 2016 cũng không được.
Nhờ mọi người giúp mình phần này với.
Ý tưởng là: khi gõ 1 cell chỉ định, nếu có ấn phím gì ngoài 0 1 2 3 4 5 6 7 8 9 Enter, Lên, Xuống, Trái, Phản, Backspace, Delete, Esc , Tab thì cell đều không nhận
 
Upvote 0
Web KT

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

Back
Top Bottom