Phím tắt để gọi macro

vbano1

SMod
Thành viên BQT
How to hotkey (Ctrl+C+C) for VBA macro
Vấn đề phím tắt để gọi macro có lẽ không mới nếu như cấu trúc của nó là Ctr+shift+ A.
Tuy nhiên, nếu như bây giờ chúng ta muốn hotkey là Ctr+C+C . Tại sao lại như vậy?
Nếu là Ctr+Shift+A thì tay chúng ta phải chạm vào ba phím trên máy tính.
Nếu hotkey là hai phím, ví dụ Ctr+A thì va chạm với phím tắt chức năng. Chúng ta để ý rằng Ctr + phím bất kỳ, đều có thể là phím chức năng.
Ví dụ: Ctr+O, Ctr+C,...
Vì vậy suy nghĩ là, làm thế nào chỉ sử dụng hai phím nhưng không xung đột với các phím chức năng, ngoài ra tay phải dễ dàng thao tác với hai phím này. Và chúng ta nghĩ ngay tới lựa chọn đó là Ctr+C+C, tức là tay chúng ta giữa phím ctr và ấn C hai lần.
Mã:
Option Explicit

Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

Const VK_C As Long = &H43 'Phim C tren ban phim

Public Sub CtrlCMacro()
    Dim keyCReleased As Boolean, timeLimit As Single
    keyCReleased = False

    timeLimit = Timer + 1 'This gives you 1 second to release-and-press C
    'On Windows, this is correct to Fractions of a Second.
    'On Mac, it is whole seconds, so will not always behave properly, and can give you 0.1 seconds to act

    While timeLimit > Timer
        'This will check if you release and then re-press "C"
        'No se kiem tra thoi diem ban nha phim C ra va an lai mot lan nua
        If GetAsyncKeyState(VK_C) = 0 Then
            'You have to release the key before you can press it again!
            'Ban phai nha phim C ra truoc khi ban an phim C mot lan nua
            keyCReleased = True
        ElseIf keyCReleased Then
            'Application.OnTime ensures that THIS sub finishes before the next macro starts
            'Chi dinh thoi gian thuc thi macro
            Application.OnTime Now(), "MyOtherMacro"
            Exit Sub
        End If
    Wend

    'Default action for Ctrl+C should be Copy
    Selection.Copy
End Sub

Public Sub MyOtherMacro()
    MsgBox "The Macro Ran!"
End Sub

'Thiet lap phim tat Ctr+c
Private Sub SetCtrlC()
    'Bind
    Application.OnKey "^c", "CtrlCMacro"
End Sub

Private Sub ResetCtrlC()
    'Huy bo phim tat ctr+c
    Application.OnKey "^c"
End Sub
Để cho Ctr+C+C luôn có tác dụng, nên tạo addin excel, trong hàm workbook open nên cho call hàm SetCtrlC, như vậy phím tắt Ctr+C+C sẽ luôn có tác dụng mỗi khi thao tác trên excel.
Ứng dụng của code trên làm được rất nhiều việc nếu như kết hợp với các tính năng khác ta sẽ được một công cụ tra từ điển trực tiếp trên excel.
Topic liên quan:
 

tuhocvba

Administrator
Thành viên BQT
Phím tắt Ctr+c+c rất tiện cho các ứng dụng tra từ điển.
Nói qua về phím tắt ctr+c+c trong chương trình trên:
Bạn cần đăng nhập để thấy hình ảnh


Về nội dung code bên trên có thể tóm tắt như sau:
Bạn cần đăng nhập để thấy hình ảnh


Nhược điểm: Ngay cả khi tạo ra addin, mỗi lần tắt hết excel và mở lại excel phải chạy lại thủ tục SetCtrlC để thiết định phím tắt ctr+c thì hơi bất tiện. Vì vậy nên tạo hàm trong workbook open để call thủ tục SetCtrlC. Như vậy mỗi khi Excel được mở thì thủ tục SetCtrlC được chạy tự động, người dùng thoải mái dùng Ctr+c+c để gọi thủ tục MyOtherMacro.
 
Sửa lần cuối:

vbano1

SMod
Thành viên BQT
Giới thiệu về hàm Timer()
Hàm Timer() trả kết quả là số giây(đơn vị là giây) tính từ 0 giờ sáng cho tới thời điểm bạn gọi hàm này.
Sử dụng hàm này để đo tốc độ chương trình thì rất là tiện lợi.
Nhắc lại một số hàm thời gian để chúng ta ôn lại nhé.
• Để lấy ngày giờ hiện tại chúng ta có hàm Now()
• Để lấy ngày tháng hiện tại chúng ta có hàm Date()

Cấu trúc code:
Timer()
Chúng ta lấy số giây tại thời điểm hàm này được gọi lùi về lúc 0h sáng.
Giá trị trả về của hàm là số, kiểu: (Single)

Lời bàn:
Nó trả về số giây kể từ lúc 0:00:00 , giá trị trả về là kiểu single nhưng mà nếu ta cố tình gán giá trị trả về là double thì chúng ta có thể lấy được kết quả chính xác hơn.
Thông qua hàm này, chúng ta thực hiện phép trừ kết quả của hàm này sau khi xử lý trừ đi kết quả của hàm này trước khi xử lý, ta sẽ đo được tốc độ của chương trình.

Một vài ví dụ:
Mã:
Dim f As Single
f = Timer
Debug.Print (f) ' 46839.14

Dim d As Double
d = Timer
Debug.Print (d) ' 46839.140625
Phương pháp đo tốc độ xử lý:
Tốc độ nhiều khi quá nhanh mà chúng ta thậm chí còn không kịp đo hoặc đo cho kết quả không đáng tin cậy.
Vì thế, thay vì đo một lần xử lý, ta đo tốc độ lên 1000 lần xử lý.
Chẳng hạn như sau:
Mã:
Dim startTime As Double
Dim stopTime As Double
        
startTime = Timer

Dim i As Integer
For i = 1 To 1000    
    ' Đoạn code chúng ta muốn xem nó xử lý mất bao nhiêu thời gian
Next

stopTime = Timer
    
Debug.Print (stopTime - startTime) ' Đây là thời gian 1000 lần chạy code xử lý mà bạn muốn đo tốc độ
' Như vậy chỉ cần chia cho 1000 là ra tốc độ của đoạn code của bạn.
Tham khảo và dịch từ:
 
Top