Nếu Roy giữ phím Shift khi mở sổ làm việc, Excel sẽ bỏ qua việc chạy bất kỳ macro “tự động” nào thường chạy, bao gồm cả sự kiện Workbook_Open. Anh ấy tự hỏi liệu có cách nào dễ dàng không kém, khi đóng một sổ làm việc, khiến Excel bỏ qua sự kiện Workbook_BeforeClose.

Không có một cách dễ dàng như nhau. Điều đó không có nghĩa là không thể thực hiện được, nhưng “dễ dàng như nhau” thường có nghĩa là “một cái gì đó được tích hợp sẵn; một số phím để nhấn hoặc cài đặt để thực hiện.” Các khóa và cài đặt như vậy để bỏ qua sự kiện BeforeClose không được tích hợp vào Excel.

Những gì bạn có thể làm là điều chỉnh cách bạn lập trình sự kiện BeforeClose để nếu một điều kiện cụ thể được đáp ứng, thì mã bên trong trình xử lý sự kiện sẽ bị bỏ qua. Một cách tiếp cận dễ dàng là chỉ cần bỏ qua mã nếu một ô trang tính cụ thể được chọn, theo cách này:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If ActiveCell.Address = "$Z$27" Then Exit Sub     '     ' Your normal code here...

' End Sub

Trong trường hợp này, nếu ô hiện hoạt — ô được chọn khi sự kiện BeforeClose được kích hoạt — xảy ra là ô Z27, thì mã thông thường của bạn trong trình xử lý sự kiện sẽ bị bỏ qua. Nếu bất kỳ ô nào khác được chọn, thì ô đó sẽ không bị bỏ qua. (Tôi cố tình chọn ô Z27 vì nó vừa bí truyền vừa khó hiểu. Tất nhiên, bạn có thể thay đổi mã để phản ánh bất kỳ ô nào khác mà bạn muốn.)

Nếu bạn không muốn kiểm tra xem phím Shift có bị giữ hay không, bạn có thể làm điều đó bằng cách sử dụng Windows API. Điều này liên quan đến việc thêm một số mã vào vùng khai báo của một mô-đun. Đây có thể là một mô-đun thông thường; nó không nhất thiết phải nằm trong cửa sổ mã ThisWorkbook. Bạn chỉ cần chắc chắn rằng nó nằm trong khu vực khai báo, trước khi bất kỳ thủ tục nào được khai báo.

#If VBA7 Then     Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #Else     Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #End If

Lưu ý rằng lệnh điều kiện #If VBA7 được sử dụng để nếu bạn đang sử dụng Excel 2010 trở lên, thì cú pháp chính xác của khai báo sẽ được sử dụng để không có lỗi trên phiên bản 32 bit hoặc 64 bit của chương trình.

Bây giờ, trong trình xử lý sự kiện BeforeClose của bạn, bạn có thể làm như sau:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Const VSHIFT = &H10     Const SHIFTED = &H80

If GetKeyState(VSHIFT) And SHIFTED Then Exit Sub     '     ' Your normal code here...

' End Sub

Nếu phím Shift được giữ khi sự kiện BeforeClose được kích hoạt, thì mã BeforeClose sẽ bị bỏ qua. Bạn nên lưu ý rằng có thể hơi khó khăn để tìm ra khi nào nên giữ phím Shift hoặc nếu bạn đã giữ nó đủ lâu. Vì lý do này, tôi có xu hướng thích cách tiếp cận “kiểm tra ActiveCell” hơn, vì bạn có thể chỉ cần chọn ô, đóng sổ làm việc và quên nó đi.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (2628) áp dụng cho Microsoft Excel 2007, 2010, 2013 và 2016.