Khi bạn đang phát triển một trang tính sẽ được người khác sử dụng, bạn có thể muốn đảm bảo rằng họ điền vào các ô nhất định trước khi họ được phép đóng sổ làm việc. Không có hàm tích hợp sẵn trong Excel để thực hiện việc này, nhưng bạn có thể tạo một macro sẽ thực hiện kiểm tra cần thiết và ngăn người dùng tiếp tục. Đây có thể là một macro khá đơn giản, gắn liền với sự kiện BeforeClose.

Sự kiện BeforeClose được kích hoạt bất cứ khi nào sổ làm việc được đóng bằng bất kỳ cách nào. Bí quyết là cài đặt thuộc tính Hủy trong trình xử lý sự kiện. Đặt Cancel thành True sẽ dừng việc đóng sổ làm việc và không thay đổi kết quả là sổ làm việc sẽ đóng bình thường.

Ví dụ: macro sau đây kiểm tra xem ô A1 có bất kỳ thứ gì trong đó không; nếu có, thì sổ làm việc sẽ bị đóng. Nếu không, thì người dùng được thông báo rằng thiếu thứ gì đó và việc đóng sẽ bị hủy.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If Cells(1, 1).Value = "" Then         MsgBox "Please fill cell A1"

Cancel = True     End If End Sub

Các macro phức tạp hơn có thể được tạo, nếu muốn. Ví dụ: bạn có thể có một số ô khác nhau cần được kiểm tra. Phiên bản sau kiểm tra một dải ô có tên là “Bắt buộc” để xem liệu mỗi ô trong dải ô có chứa thứ gì không. Nếu bất kỳ ô nào trống, thì không thể lưu hoặc đóng sổ làm việc. (Macro này không chỉ được kích hoạt trong sự kiện BeforeClose mà còn trong sự kiện BeforeSave.)

Hai trình xử lý sự kiện này nên được đặt trong bảng mã cho sổ làm việc:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Cancel = ForceDataEntry()

End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _   Cancel As Boolean)

Cancel = ForceDataEntry()

End Sub

Lưu ý rằng trình xử lý sự kiện gọi hàm ForceDataEntry. Hàm này nên được đặt trong một mô-đun macro thông thường:

Function ForceDataEntry() As Boolean     Dim rng As Range     Dim c As Variant     Dim rngCount As Integer     Dim CellCount As Integer

Set rng = Range("Mandatory")

rngCount = rng.Count

CellCount = 0     For Each c In rng         If Len(c) > 0 Then             CellCount = CellCount + 1         End If     Next c     ForceDataEntry = False     If CellCount <> rngCount Then ForceDataEntry = True End Function

Bạn cần lưu ý rằng bất kỳ triển khai nào yêu cầu macro (như cách này) đều gặp phải một vấn đề tiềm ẩn — người dùng có thể quyết định không bật macro khi sổ làm việc được tải. Nếu họ chạy sổ làm việc với macro bị vô hiệu hóa, thì họ vẫn có thể lưu sổ làm việc mà không có tất cả các ô bắt buộc chứa giá trị.

_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 (9574) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện menu cũ hơn của Excel tại đây: