VBA Excel (Bài 51): Chặn người dùng in dữ liệu trong Excel với VBA

Đôi khi trong file Excel của bạn có chứa những thông tin nhạy cảm và bạn muốn ngăn chặn việc các dữ liệu này bị truyền ra ngoài. Trong bài viết này, bạn sẽ được học các cách để ngăn cản bất cứ ai thực hiện chức năng in từ tabs Excel của bạn.

Một Vài Lưu Ý Khi Vô Hiệu Hóa Chức Năng Print

Đầu tiên, cần phải làm rõ rằng: cách làm này có thể chặn người khác in worksheet của bạn nhưng hoàn toàn không thể ngăn cản việc người đó chụp màn hình và in chúng ra. Điều này chỉ để làm khó cho việc in dữ liệu ra và hy vọng nó như là một lời nhắc nhở với người xem rằng không nên in nội dung được lưu trữ trong workbook này.

Thứ hai, mã VBA bạn sử dụng sẽ bị kích hoạt bởi hành động “Printing” và vì vậy nó sẽ chỉ hoạt động nếu VBA Events được cho phép trong Excel. VBA Events được mặc định và chỉ có thể tắt nó đi khi macros bị vô hiệu hóa hoặc khi bạn dùng mã VBA để tắt VBA Events.

Hầu hết người dùng Excel không đủ trình độ để tắt tính năng VBA Events, nhưng có thể tạo nút trong workbook của bạn để người dùng phải click vào để sử dụng. Một thực tế phổ biến là có thể ẩn tất cả worksheet với tính năng xlVeryHidden và để lại một worksheet với nút được gán tới một macro. Khi click , nút này có thể thực hiện mã lệnh để bỏ ẩn tất cả các worksheets và đảm bảo rằng VBA Events đang hoạt động. Mã này có thể viết như sau:

Sub FileStartup()Dim sht As Worksheet

‘Optimize Code
Application.ScreenUpdating = True

‘Loop Through Each Worksheet And Unhide
For Each sht In ThisWorkbook.Worksheets
sht.Visible = xlVisible
Next sht

‘Ensure VBA Events Are Turned On
Application.EnableEvents = True

End Sub

Nơi Lưu Trữ Macros

Không giống như các hàm và macros VBA thông thường, những macros được dùng để kích hoạt event cần được lưu trữ trong Worksheet Object Module và trong bài viết này đó là Workbook Object Module. Để tạo module, bạn cần nhấn đúp chuột vào tên ThisWorkbook Object trong Microsoft Excel Objects folder trong Project Window của bạn( trong phạm vi Visual Basic Editor). Sau khi nhấn đúp chuột, bạn sẽ thấy một sheet trắng xuất hiện và bạn có thể tiếp tục quá trình lưu trữ những macros của mình.

Tạo Macros VBA Để Chặn Lệnh In

Chúng ta sẽ bắt đầu với một mã VBA có thể vô hiệu hóa lệnh in toàn bộ workbook. Nó sẽ được kích hoạt tại BeforePrint event… có nghĩa là mã này sẽ chạy trước khi bất cứ lệnh in nào diễn ra.

Mã này rất đơn giản bởi nó chỉ làm thay đổi biểu tượng nút Cancel (ie True) và thông báo tới người dùng là họ không thể thực hiện lệnh in với file Excel này.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
‘PURPOSE: Prevent user from printing this workbook
‘NOTES: This Code Must Reside in the ThisWorkbook Object
‘SOURCE: www.TheSpreadsheetGuru.com/the-code-vault’Cancel the Print Request
Cancel = True‘Notify User They Cannot Print this workbook
MsgBox “You do not have permission to print this file”, vbOKOnly, “Cannot Print”

End Su

Chặn Lệnh In Trong Một Worksheet Cụ Thể

Bây giờ giả định rằng bạn chỉ quan tâm tới việc in một worksheet nào đó. Bạn cần cung cấp tên worksheet bạn muốn vô hiệu hóa và mã sẽ chạy để kiểm tra xem liệu nó có phải worksheet đang được lựa chọn để in ra hay không?

Hoặc bạn có thể chỉ cần thay đổi tên của worksheet và bỏ qua chức năng này của macros. Tuy nhiên để tăng tính chắc chắn của macros hơn nữa, nên tham chiếu bằng tên mã thay vì tên bằng văn bản bởi hầu hết mọi người không biết cách thay đổi tên mã của một worksheet.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
‘PURPOSE: Prevent user from printing A Specific Worksheet
‘NOTES: This Code Must Reside in the ThisWorkbook Object
‘SOURCE: www.TheSpreadsheetGuru.com/the-code-vaultDim WorksheetName As String
Dim sht As WorksheetWorksheetName = “Sheet1”

For Each sht In ThisWorkbook.Windows(1).SelectedSheets

If sht.Name = WorksheetName Then
‘Cancel the Print Request
Cancel = True
Exit For
End If
Next sht

‘Notify User They Cannot Print this workbook
MsgBox “You do not have permission to print the [” _
& WorksheetName & “] worksheet”, vbOKOnly, “Cannot Print”

End Sub

Vô Hiệu Hóa Chức Năng In Với Nhiều Worksheet

Dưới đây là một dạng khác cho phép bạn chặn tính năng in cho nhiều worksheet cụ thể trong file Excel của mình. Lần nữa, bạn có thể tăng tính chắc chắn bằng cách sử dụng tên mã worksheet thay vì tên của nó.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
‘PURPOSE: Prevent user from printing Specific Worksheets
‘NOTES: This Code Must Reside in the ThisWorkbook Object
‘SOURCE: www.TheSpreadsheetGuru.com/the-code-vaultDim DoNotPrintList As String
Dim DisablePrint As Variant
Dim sht As Worksheet‘Store Names of worksheets that can’t be printed
DisablePrint = Array(“Sheet1”, “Sheet3”, “Sheet5”)

‘Create a list of all the sheets not allowed to be printed
For x = LBound(DisablePrint) To UBound(DisablePrint)
DoNotPrintList = DoNotPrintList & DisablePrint(x) & “;”
Next x

‘Loop through each worksheet that is currently selected
For Each sht In ThisWorkbook.Windows(1).SelectedSheets
‘Cancel the Print Request if Sheet Name Should not be printed
If DoNotPrintList Like “*” & sht.Name & “;*” Then
Cancel = True
Exit For
End If
Next sht

‘Notify User They Cannot Print this worksheet
MsgBox “You do not have permission to print the [” _
& sht.Name & “] worksheet”, vbOKOnly, “Cannot Print”

End Sub