Franklin có macro ẩn một số hàng trong trang tính và sau đó in trang tính. Để làm điều này, anh ta sử dụng trình xử lý sự kiện BeforePrint. Vấn đề là Franklin muốn tự động bỏ ẩn các hàng sau khi in xong. Anh ta không biết làm thế nào để làm điều này trong macro của mình.

Có một số cách bạn có thể tiếp cận điều này. Một là sử dụng trình xử lý sự kiện BeforePrint và sử dụng nó để ẩn các hàng bạn muốn và sau đó chỉ định macro để chạy qua phương thức OnTime. Đây là giao diện của trình xử lý sự kiện:

Private Sub Workbook_BeforePrint(Cancel As Boolean)

' Code here to hide rows desired

Application.OnTime Now, "AfterPrint"

End Sub

Bạn sẽ cần thêm vào trình xử lý sự kiện này mã để ẩn các hàng bạn muốn ẩn. (Franklin nói rằng anh ta có mã như vậy đang hoạt động; việc giải mã chúng sau khi in mà anh ta đang gặp sự cố.) Lưu ý rằng macro được gọi qua OnTime là một macro được gọi là AfterPrint. Macro này nên được đặt trong một mô-đun thông thường, không phải trong cùng một mô-đun như các trình xử lý sự kiện được đặt. Nó thậm chí có thể đơn giản hơn trình xử lý sự kiện:

Sub AfterPrint()

' Code here to unhide rows     Cells.Select     Selection.EntireRow.Hidden = False End Sub

Nếu muốn, bạn cũng có thể bỏ qua hoàn toàn nhu cầu về phương pháp OnTime (và macro AfterPrint). Điều này sẽ liên quan đến cách tiếp cận này:

Private Sub Workbook_BeforePrint(Cancel As Boolean)

Cancel = True     ' Code here to hide rows desired

Application.EnableEvents = False     ActiveSheet.PrintOut     Application.EnableEvents = True

' Code here to unhide rows End Sub

Macro hoạt động vì nó hủy bản in đã kích hoạt sự kiện BeforePrint, ẩn các hàng, in ra trang tính đang hoạt động và sau đó hiện các hàng.

Hạn chế đối với bất kỳ cách tiếp cận dựa trên trình xử lý sự kiện nào như vậy là nó giới hạn những gì người dùng có thể in. Nói cách khác, người dùng chỉ có thể in những gì bạn cho phép họ in chứ không phải những gì họ có thể thực sự muốn in. Để khắc phục hạn chế khá lớn này, bạn cần phải từ bỏ hoàn toàn cách tiếp cận BeforePrint. Thay vào đó, hãy tạo một macro thông thường để xử lý việc in:

Sub PrintWS()

' Code here to hide rows desired

Application.EnableEvents = False     ActiveSheet.PrintOut     Application.EnableEvents = True

' Code here to unhide rows End Sub

Bạn sẽ lưu ý rằng về cơ bản, đây là cơ sở của cách tiếp cận BeforePrint thứ hai — bạn ẩn các hàng, in trang tính và sau đó bỏ ẩn các hàng. Macro PrintWS này sau đó có thể được gắn với một phím tắt hoặc một cái gì đó trên Thanh công cụ Truy nhập Nhanh để nó có thể được gọi dễ dàng.

Nhân tiện, nếu bạn quyết định sử dụng một trong các cách tiếp cận BeforePrint, đã có báo cáo về việc nó không hoạt động bình thường trong tất cả các phiên bản Excel. (Điều này có vẻ rất khó để theo dõi.) Điều xảy ra là trong một số phiên bản, những gì Excel in ra được “đặt thành đá” trước khi trình xử lý sự kiện BeforePrint được gọi. Điều này có nghĩa là bất kỳ hàng nào bạn ẩn trong trình xử lý sự kiện sẽ bị bỏ qua khi trang tính thực sự được in, vì vậy, nó giống như thể bạn chưa bao giờ ẩn các hàng trong macro. Cách duy nhất để giải quyết vấn đề rất khó chịu này là trực tiếp xử lý việc in ấn thông qua ví dụ BeforePrint thứ hai ở trên hoặc cách tiếp cận macro PrintWS.

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

Mẹo này (13624) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365.