Mỗi bảng tính hay trang tính đều có một mô-đun chạy code tương ứng. Những mô-đun này thường đi kèm với các mã lệnh VBA dùng để khởi động các tác vụ trong bảng hay trong trang tính. Chẳng hạn ta có một mô-đun lệnh cho bảng tính (tên mặc định là ThisWorkbook) với hàm thủ tục con như sau:
Private Sub Workbook_Open()
‘ Code goes here
End Sub
Lệnh Workbook_Open sẽ tự động khởi chạy khi bạn mở bảng tính lên.
Tương tự như vậy, các mô-đun lệnh sẽ chứa những hàm thủ tục nhỏ hơn để thực hiện nhiều tác vụ khác như Khởi chạy, Ngắt hoạt động, Thay đổi, v.v.
Dưới đây là hai hàm VBA tùy chọn giúp bạn có thể xác định được liệu phần mô-đun lệnh của bảng tính hay trang tính nào đó có chứa mã lệnh thủ tục nào không.
Hàm WorkbookHasVBACode
Hàm dưới đây coi bảng tính là đối tượng cần đối chiếu duy nhất. Kết quả sẽ trả về là TRUE nếu như phần mô-đun lệnh của bảng tính đó có chứa mã lệnh VBA.
Private Function WorkbookHasVBACode(wb As Workbook)
ModuleLineCount = wb.VBProject.VBComponents(wb.CodeName). _
CodeModule.CountOfLines
If ModuleLineCount = 0 Then
WorkbookHasVBACode = False
Else
WorkbookHasVBACode = True
End If
End Function
Hàm SheetHasVBACode
Hàm dưới đây coi trang tính là đối tượng cần đối chiếu duy nhất. Kết quả sẽ trả về là TRUE nếu như phần mô-đun lệnh của trang tính đó có chứa mã lệnh VBA.
Private Function SheetHasVBACode(wks As Worksheet)
ModuleLineCount = wks.Parent.VBProject. _
VBComponents(wks.CodeName).CodeModule.CountOfLines
If ModuleLineCount = 0 Then
SheetHasVBACode = False
Else
SheetHasVBACode = True
End If
End Function
Ví dụ minh họa
Ví dụ dưới đây minh họa cho cách sử dụng hàm SheetHasVBACode trong thực tế. Hàm thủ tục DeleteBlankSheets có tác dụng xóa bỏ tất cả các trang không có nội dung trong bảng tính – lệnh này chỉ được thực thi nếu như trang tính đó không chứa mã lệnh VBA.
Sub DeleteBlankSheets()
Dim sht As Worksheet
On Error GoTo ErrHandler
‘ Avoid Excel’s confirmation prompt
Application.DisplayAlerts = False
‘ Loop through each sheet
For Each sht In ActiveWorkbook.Worksheets
‘ Is non-blank cell count zero?
If Application.CountA(sht.Cells) = 0 Then
‘ Don’t try to delete the last sheet
If ActiveWorkbook.Sheets.Count <> 1 Then
‘ Don’t delete sheet if it has VBA code
If Not SheetHasVBACode(sht) Then
sht.Delete
End If
End If
End If
Next sht
Exit Sub
ErrHandler:
MsgBox sht.Name & Chr(13) & Chr(13) & Error(Err)
End Sub