Cách xác định xem một trang tính hay bảng tính nào đó có chứa mã lệnh hay không

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


Tác giả: dtnguyen (Nguyễn Đức Thanh)

@ Học Excel Online | DTNguyen.business
· · ·

Khóa học mới xuất bản