Bob đang xử lý thông tin trong sổ làm việc bằng cách sử dụng macro. Anh ta muốn macro mở sổ làm việc thứ hai có macro Tự động đóng trong đó, nhưng anh ta không muốn nó chạy khi sổ làm việc thứ hai bị đóng.

Anh ta đang tìm cách mở sổ làm việc thứ hai, dưới sự kiểm soát của macro trong sổ làm việc đầu tiên, mà không bật macro trong sổ làm việc thứ hai.

Không có cách nào để tắt macro trong sổ làm việc thứ hai khi mở nó dưới điều khiển macro. (Nếu bạn đang mở nó theo cách thủ công, rõ ràng bạn có thể giữ phím Shift khi sổ làm việc mở ra, nhưng điều đó không giúp ích gì cho macro của bạn — nó không có ngón tay nào để giữ phím đó!)

Tuy nhiên, có một số cách giải quyết. Đầu tiên liên quan đến việc sửa đổi mã của bạn để đóng sổ làm việc thứ hai, theo cách này:

Application.EnableEvents = False Workbooks("SecondBook.xls").Close Application.EnableEvents = True

Bằng cách đặt thuộc tính EnableEvents thành False, sự kiện sắp xảy ra (đóng sổ làm việc) sẽ không kích hoạt macro Tự động đóng.

Sau đó, bạn có thể (và nên) đặt thuộc tính EnableEvents thành True để các sự kiện sau này có thể tiếp tục.

Một cách giải quyết khác là đặt một số loại “cờ” trong macro Tự động đóng của sổ làm việc thứ hai. Cờ này có thể kiểm tra xem sổ làm việc đầu tiên có đang mở hay không và nếu có, không chạy mã chính trong macro Tự động đóng.

Để thực hiện việc này, trong sổ làm việc thứ hai ở đầu các trang mô-đun, hãy thêm đoạn mã sau:

Dim AutoCloseDisabled as Boolean Sub DisableAutoClose()

AutoCloseDisabled=True End Sub

Lưu ý rằng câu lệnh khai báo cho biến AutoCloseDisabled nằm ngoài bất kỳ thủ tục nào, có nghĩa là nó sẽ có phạm vi toàn cục và có thể truy cập được trong tất cả các thủ tục.

Tiếp theo, sửa đổi macro AutoClose để phần thân của nó được bao bọc trong câu lệnh If, như được hiển thị ở đây:

Sub AutoClose()

'variable declarations here

If Not AutoCloseDisabled then

'body of AutoClose here

End if End Sub

Ý tưởng là khi sổ làm việc thứ hai được mở bình thường, biến AutoCloseDisabled sẽ tự động được đặt thành False. (Các biến Boolean mặc định là False khi chúng được khai báo.) Vì thủ tục DisableAutoClose không bao giờ được chạy trong sổ làm việc, câu lệnh If trong macro AutoClose cho phép thực thi phần thân thực của macro.

Nếu bạn mở sổ làm việc thứ hai từ sổ làm việc đầu tiên, thì mã trong sổ làm việc đầu tiên của bạn có thể gọi macro DisableAutoClose trong sổ làm việc thứ hai, do đó đặt cờ AutoCloseDisabled thành True. Điều này có nghĩa là khi sổ làm việc thứ hai bị đóng, câu lệnh If sẽ bỏ qua phần nội dung của macro Tự động đóng.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

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

Mẹo này (3158) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: