Phím Esc không dừng được Macro

giaiphapvba

Administrator
Thành viên BQT
Cho tới khi kết thúc được chương trình thì mất quá nhiều thời gian. Khi đó chúng ta muốn dừng chương trình, vậy là chúng ta sẽ ấn phím ESC trên bàn phím phải không nào? (^_^)
Bạn cần đăng nhập để thấy đính kèm

Phím ESC sẽ giúp bạn tạm thời đình chỉ macro hoạt động. Hộp thoại hiện ra, và bạn có thể lựa chọn kết thúc luôn chương trình, hoặc tiếp tục chương trình.
Hoặc là chọn Debug để đi tới câu lệnh đang được thực thi.

Khi chúng ta xây dựng một chương trình, thì tính năng này quả là tiện lợi. Chương trình chúng ta đang xây dựng có lẽ chưa tốt, chạy mất quá nhiều thời gian, và chúng ta sẽ ấn ESC thay vì phải ngồi chờ đợi. Tuy nhiên cũng có người có cách nghĩ rằng, cho dù ấn ESC thì cũng không muốn dừng macro các bạn ạ.
Trong khi macro đang thực thi, chúng ta có thể điều khiển sự kiện ấn ESC thông qua thuộc tính EnableCancelKey của đối tượng Application. Dưới đây là bảng hằng số mà tôi muốn giới thiệu cho các bạn.
Hằng sốThao tác
xlDisabledPhớt lờ ESC
xlInterruptDừng chương trình (default: Mặc định nếu không có chỉ định)
xlErrorHandlerLàm cho phát sinh lỗi
Trường hợp chúng ta giản lược, chẳng chỉ định gì, thì mặc định VBA sẽ lấy giá gị mặc định là xlInterrupt, tức là khi macro đang thực thi, ấn ESC thì sẽ dừng.
Nếu chúng ta chỉ định hằng số xlDisabled, thì dù có ấn ESC thì macro cũng sẽ thực thi, nó phớt lờ hoàn toàn sự kiện phím ESC được ấn.
Chi tiết hơn, chúng ta chỉ định xlErrorHandler thì sẽ làm phát sinh ra lỗi nếu ấn ESC. Mã lỗi là 18.
Bằng cách bẫy lỗi, chúng ta có thể đoán định được phím ESC đã được ấn hay chưa.

Chương trình ví dụ dưới đây, trong khi macro đang thực thi, nếu ấn ESC sẽ hiển thị thông báo. Chúng ta có thể lựa chọn cho macro kết thúc hay không. Ngoài ra, bằng số nguyên Integer (Giới hạn của integer là 32768), khi giá trị j vượt quá giới hạn giá trị cho phép của integer (ta cố tình cho nó chạy tới 33000), dù chẳng làm gì thì lỗi cũng sẽ phát sinh.
Mã:
Sub Sample()
    Dim i As Long, j As Integer
    Application.EnableCancelKey = xlErrorHandler
    On Error GoTo MyError
    For i = 1 To 33000
        Range("A1") = i
        j = i
    Next i
    Exit Sub
MyError:
    If Err.Number = 18 Then
        If MsgBox("Ban muon ket thuc Macro?", 292) = vbNo Then
            DoEvents
            Resume
        End If
    Else
        MsgBox "Da phat sinh loi nam ngoai du doan cua chuong trinh" & vbCrLf & _
            Err.Description, vbCritical
    End If
End Sub
Đang chạy chương trình, hãy ấn ESC sẽ hiện thông báo sau.
Bạn cần đăng nhập để thấy đính kèm


Nếu chúng ta ấn YES, thì macro sẽ kết thúc. Nếu ấn NO, chương trình sẽ tiếp tục và cuối cùng ra thông báo như sau:
Bạn cần đăng nhập để thấy đính kèm

Vì chúng ta chỉ định 「On Error GoTo MyError」, cho nên nếu có lỗi gì thì nó sẽ nhảy tới nhãn MyError và thực thi lệnh ở đó. Ở đây, chúng ta cho tiến hành phán đoán nội dung lỗi thông qua nội dung Err.Description .
Câu lệnh DoEvents trong code trên nó có nghĩa là viết lại màn hình (cập nhật lại trạng thái màn hình). Nếu không có nó, thì hộp thoại cảnh báo "Ban co muon ket thuc Macro?" có trường hợp cứ hiện ra như thế mà không tắt đi được.
Ở trong bài viết này, tôi cũng muốn các bạn chú ý một điều, là số dòng của một bảng tính Excel lên tới đơn vị là triệu. Vì vậy khi làm việc với dòng trong Excel, nên để kiểu biến là Long sẽ đảm bảo hơn là khai báo Integer.
Bài viết được diễn đàn tuhocvba.net tham khảo và dịch từ:
 
Top