Share macro VBA "Excel" dùng để khóa sheet và ẩn/hiện các dòng trống dữ liệu ở cột G đến P, bắt đầu từ dòng 5

 Các bước thực hiện thêm Macro mới

 

Bước 1 — Tạo PERSONAL.XLSB

Xem (View) → Macro → Ghi Macro (Record Macro).

Ở mục Lưu macro trong / Store macro in, chọn:

Personal Macro Workbook / Sổ làm việc Macro Cá nhân

Đặt tên bất kỳ, ví dụ TaoPersonal → OK → sau đó bấm Dừng ghi (Stop Recording).

Excel sẽ tự tạo file PERSONAL.XLSB.

 

Bước 2 — Mở VBA

Nhấn:

Alt + F11

Sau đó nhìn bên trái, bạn sẽ thấy:

VBAProject (PERSONAL.XLSB)

Ads Code

Chọn:

PERSONAL.XLSB → Insert → Module

 

Bước 3 — Dán macro này

 _________________________________________________


Option Explicit


Sub KhoaMoTatCaSheet()


    Dim wb As Workbook

    Dim ws As Worksheet

    Dim o As Range

    Dim rngFormula As Range


    Dim MatKhau As String

    Dim CheDoKhoa As Boolean


    Dim SoSheetXuLy As Long

    Dim SoSheetBoQua As Long

    Dim SoSheetLoi As Long

    Dim SoOCoLoi As Long


    Dim DSBoQua As String

    Dim DSSheetLoi As String

    Dim DSCongThucLoi As String


    Dim NoiDung As String

    Dim LoiBaoVe As String

    Dim LoiChiTiet As String

    Dim TenSheet As String


    Dim GiaTriAn As Variant

    Dim KiemTraThanhCong As Boolean

    Dim LoiDocThuocTinh As Long


    Dim ScreenCu As Boolean

    Dim EventsCu As Boolean


    '========================================

    ' 1. THIET LAP

    '========================================


    If ActiveWorkbook Is Nothing Then

        MsgBox "Khong co workbook dang mo.", _

               vbExclamation, "LOI"

        Exit Sub

    End If


    Set wb = ActiveWorkbook


    MatKhau = "0943836131"


    ScreenCu = Application.ScreenUpdating

    EventsCu = Application.EnableEvents


    On Error GoTo XuLyLoi


    Application.ScreenUpdating = False

    Application.EnableEvents = False


    '========================================

    ' 2. XAC DINH CHE DO KHOA / MO

    '

    ' Con sheet chua khoa -> KHOA

    ' Tat ca da khoa -> MO

    '========================================


    CheDoKhoa = False


    For Each ws In wb.Worksheets


        If Not ws.ProtectContents Then

            CheDoKhoa = True

            Exit For

        End If


    Next ws


    '========================================

    ' 3. DUYET TAT CA SHEET

    '========================================


    For Each ws In wb.Worksheets


        TenSheet = ws.Name


        '------------------------------------

        ' 3A. KIEM TRA TRANG THAI SHEET

        '------------------------------------


        If CheDoKhoa Then


            If ws.ProtectContents Then


                ' Sheet da khoa tu truoc

                SoSheetBoQua = SoSheetBoQua + 1


                DSBoQua = DSBoQua & vbCrLf & _

                          "- " & ws.Name & _

                          " (Da khoa san)"


                GoTo SheetTiepTheo


            End If


        Else


            '--------------------------------

            ' CHE DO MO KHOA

            '--------------------------------


            If ws.ProtectContents Then


                Err.Clear

                On Error Resume Next


                ws.Unprotect Password:=MatKhau


                LoiBaoVe = Err.Description


                Err.Clear

                On Error GoTo XuLyLoi


                If ws.ProtectContents Then


                    SoSheetLoi = SoSheetLoi + 1


                    If LoiBaoVe = "" Then

                        LoiBaoVe = _

                            "Khong xac dinh duoc loi"

                    End If


                    DSSheetLoi = DSSheetLoi & _

                        vbCrLf & "- " & ws.Name & _

                        " | " & LoiBaoVe


                    GoTo SheetTiepTheo


                End If


                SoSheetXuLy = SoSheetXuLy + 1


            End If


        End If


        '====================================

        ' 4. TIM CAC O CO CONG THUC

        '====================================


        Set rngFormula = Nothing


        Err.Clear

        On Error Resume Next


        Set rngFormula = _

            ws.UsedRange.SpecialCells( _

                xlCellTypeFormulas)


        Err.Clear

        On Error GoTo XuLyLoi


        '====================================

        ' 5. AN / HIEN CONG THUC

        '====================================


        If Not rngFormula Is Nothing Then


            ' Thu xu ly toan bo vung truoc

            Err.Clear

            On Error Resume Next


            rngFormula.FormulaHidden = CheDoKhoa


            Err.Clear

            On Error GoTo XuLyLoi


            ' Kiem tra lai tung o cong thuc

            For Each o In rngFormula.Cells


                GiaTriAn = Empty

                KiemTraThanhCong = False

                LoiChiTiet = ""


                ' Doc trang thai FormulaHidden

                Err.Clear

                On Error Resume Next


                GiaTriAn = o.FormulaHidden


                LoiDocThuocTinh = Err.Number

                LoiChiTiet = Err.Description


                Err.Clear

                On Error GoTo XuLyLoi


                If LoiDocThuocTinh = 0 Then


                    If VarType(GiaTriAn) = vbBoolean Then


                        If CBool(GiaTriAn) = CheDoKhoa Then

                            KiemTraThanhCong = True

                        End If


                    End If


                End If


                '--------------------------------

                ' Neu chua dung thi xu ly lai

                '--------------------------------


                If Not KiemTraThanhCong Then


                    Err.Clear

                    On Error Resume Next


                    o.FormulaHidden = CheDoKhoa


                    ' Neu o gop bi loi thi thu

                    ' xu ly ca vung MergeArea

                    If Err.Number <> 0 Then


                        If o.MergeCells Then


                            Err.Clear


                            o.MergeArea.FormulaHidden = _

                                CheDoKhoa


                        End If


                    End If


                    LoiChiTiet = Err.Description


                    ' Kiem tra lai ket qua

                    Err.Clear

                    GiaTriAn = Empty


                    GiaTriAn = o.FormulaHidden


                    LoiDocThuocTinh = Err.Number


                    If LoiDocThuocTinh <> 0 Then

                        LoiChiTiet = Err.Description

                    End If


                    Err.Clear

                    On Error GoTo XuLyLoi


                    KiemTraThanhCong = False


                    If LoiDocThuocTinh = 0 Then


                        If VarType(GiaTriAn) = _

                           vbBoolean Then


                            If CBool(GiaTriAn) = _

                               CheDoKhoa Then


                                KiemTraThanhCong = True


                            End If


                        End If


                    End If


                    '----------------------------

                    ' GHI LAI O CO LOI

                    '----------------------------


                    If Not KiemTraThanhCong Then


                        SoOCoLoi = SoOCoLoi + 1


                        If LoiChiTiet = "" Then


                            LoiChiTiet = _

                                "Khong doi duoc " & _

                                "trang thai FormulaHidden"


                        End If


                        If SoOCoLoi <= 30 Then


                            DSCongThucLoi = _

                                DSCongThucLoi & _

                                vbCrLf & "- Sheet: " & _

                                ws.Name & _

                                " | O: " & _

                                o.Address(False, False) & _

                                " | " & LoiChiTiet


                        End If


                    End If


                End If


            Next o


        End If


        '====================================

        ' 6. KHOA SHEET

        '====================================


        If CheDoKhoa Then


            Err.Clear

            On Error Resume Next


            ws.Protect _

                Password:=MatKhau, _

                DrawingObjects:=False, _

                Contents:=True, _

                Scenarios:=True, _

                AllowFiltering:=True, _

                AllowUsingPivotTables:=True


            LoiBaoVe = Err.Description


            Err.Clear

            On Error GoTo XuLyLoi


            ' Kiem tra sheet da khoa that chua

            If ws.ProtectContents Then


                SoSheetXuLy = _

                    SoSheetXuLy + 1


            Else


                SoSheetLoi = SoSheetLoi + 1


                If LoiBaoVe = "" Then


                    LoiBaoVe = _

                        "Sheet van chua duoc khoa"


                End If


                DSSheetLoi = DSSheetLoi & _

                    vbCrLf & "- " & ws.Name & _

                    " | " & LoiBaoVe


            End If


        End If


SheetTiepTheo:


    Next ws


    '========================================

    ' 7. THONG BAO CHE DO KHOA

    '========================================


    If CheDoKhoa Then


        NoiDung = _

            "DA HOAN THANH KHOA SHEET" & vbCrLf & _

            String(35, "-") & vbCrLf & _

            "Da khoa moi: " & SoSheetXuLy & _

            " sheet" & vbCrLf & _

            "Da khoa tu truoc: " & _

            SoSheetBoQua & " sheet" & vbCrLf & _

            "Khong khoa duoc: " & _

            SoSheetLoi & " sheet" & vbCrLf & _

            "O khong an duoc cong thuc: " & _

            SoOCoLoi


        ' Danh sach sheet KHONG khoa duoc

        NoiDung = NoiDung & vbCrLf & vbCrLf & _

            "SHEET KHONG KHOA DUOC:"


        If DSSheetLoi <> "" Then


            NoiDung = NoiDung & DSSheetLoi


        Else


            NoiDung = NoiDung & _

                vbCrLf & "- Khong co"


        End If


        ' Danh sach sheet da khoa tu truoc

        NoiDung = NoiDung & vbCrLf & vbCrLf & _

            "SHEET DA KHOA TU TRUOC:"


        If DSBoQua <> "" Then


            NoiDung = NoiDung & DSBoQua


        Else


            NoiDung = NoiDung & _

                vbCrLf & "- Khong co"


        End If


        NoiDung = NoiDung & vbCrLf & vbCrLf & _

            "Van cho phep Filter va PivotTable."


    '========================================

    ' 8. THONG BAO CHE DO MO KHOA

    '========================================


    Else


        NoiDung = _

            "DA HOAN THANH MO KHOA" & vbCrLf & _

            String(35, "-") & vbCrLf & _

            "Da mo: " & SoSheetXuLy & _

            " sheet" & vbCrLf & _

            "Khong mo duoc: " & _

            SoSheetLoi & " sheet" & vbCrLf & _

            "O khong hien lai duoc cong thuc: " & _

            SoOCoLoi


        NoiDung = NoiDung & vbCrLf & vbCrLf & _

            "SHEET KHONG MO DUOC:"


        If DSSheetLoi <> "" Then


            NoiDung = NoiDung & DSSheetLoi


        Else


            NoiDung = NoiDung & _

                vbCrLf & "- Khong co"


        End If


    End If


    '========================================

    ' 9. THONG BAO LOI CONG THUC

    '========================================


    NoiDung = NoiDung & vbCrLf & vbCrLf & _

        "CHI TIET XU LY CONG THUC:"


    If DSCongThucLoi <> "" Then


        NoiDung = NoiDung & DSCongThucLoi


        If SoOCoLoi > 30 Then


            NoiDung = NoiDung & vbCrLf & _

                "... Con " & (SoOCoLoi - 30) & _

                " o loi chua hien thi."


        End If


    Else


        NoiDung = NoiDung & vbCrLf & _

            "- Khong phat hien loi."


    End If


    '========================================

    ' 10. KET THUC

    '========================================


    Application.EnableEvents = EventsCu

    Application.ScreenUpdating = ScreenCu


    MsgBox NoiDung, vbInformation, _

           "KHOA / MO SHEET"


    Exit Sub


    '========================================

    ' 11. XU LY LOI CHUNG

    '========================================


XuLyLoi:


    LoiBaoVe = Err.Description


    Application.EnableEvents = EventsCu

    Application.ScreenUpdating = ScreenCu


    MsgBox _

        "Co loi khi xu ly." & vbCrLf & _

        "Sheet: " & TenSheet & vbCrLf & _

        "Loi: " & LoiBaoVe, _

        vbExclamation, "LOI VBA"


End Sub



 _________________________________________________________________

 

Macro trên sau khi khóa vẫn: 

Cụ thể:

  • Nếu còn ít nhất một sheet chưa khóa, macro sẽ chuyển sang chế độ khóa.
  • Nếu tất cả sheet đều đã khóa, macro sẽ chuyển sang chế độ mở khóa.

Khi khóa, macro sẽ:

  • tìm các ô có công thức trong từng sheet;
  • đặt thuộc tính ẩn công thức để người dùng không nhìn thấy công thức trên thanh Formula;
  • khóa sheet bằng mật khẩu 0943836131;
  • vẫn cho phép dùng Filter và PivotTable/PivotChart;
  • nếu sheet đã khóa từ trước, macro sẽ thử kiểm tra xem có dùng đúng mật khẩu 0943836131 hay không;
  • nếu dùng mật khẩu khác, macro ghi lại tên sheet đó để báo cuối cùng.

Khi mở khóa, macro sẽ:

  • thử mở từng sheet bằng mật khẩu 0943836131;
  • sheet mở được thì hiện lại công thức;
  • sheet không mở được thì giữ nguyên;
  • ghi lại tên cụ thể các sheet đang dùng mật khẩu khác.

Cuối mỗi lần chạy, macro sẽ báo:

  • số sheet đã khóa mới hoặc đã mở;
  • số sheet bị bỏ qua;
  • danh sách sheet dùng mật khẩu khác;
  • trạng thái Filter và PivotTable vẫn được giữ.

Nói ngắn gọn, đây là macro kiểu:

1 nút bấm để khóa/mở toàn bộ workbook + ẩn/hiện công thức + giữ Filter/Pivot + phát hiện sheet có mật khẩu khác.

Một lưu ý: để kiểm tra một sheet đã khóa từ trước có đúng mật khẩu 0943836131 hay không, macro phải thử mở khóa rồi khóa lại ngay. Excel không có lệnh đọc trực tiếp mật khẩu bảo vệ sheet.

 

Bạn đổi: MatKhau = "0943836131"  thành Mật khẩu Bạn muốn

 

Bước 4 — Lưu PERSONAL.XLSB

Nhấn Ctrl + S.

Sau đó đóng Excel. Nếu Excel hỏi có muốn lưu thay đổi đối với Personal Macro Workbook thì chọn Save/Lưu.

 

Bước 5 — Đưa 2 nút lên thanh công cụ

Mở lại Excel.

Vào:

Tệp → Tùy chọn → Thanh công cụ Truy nhập Nhanh

Ở Chọn lệnh từ, chọn:

Macro

Bạn sẽ thấy:

PERSONAL.XLSB!KhoaTatCaSheet

PERSONAL.XLSB!MoKhoaTatCaSheet

Thêm cả hai sang bên phải.

Bạn có thể chọn Sửa đổi/Modify để đổi biểu tượng cho dễ nhận biết.

Sau này thao tác chỉ còn:

Mở file Excel → bấm nút Khóa → xong.

Khi cần sửa dữ liệu:

Bấm nút Mở khóa → xong.

Muốn sửa Macro cũ bấm Alt + F11   , sửa xong nhớ bấm Ctrl + S

Sau đó có thể nhấn Alt + F11 để quay lại Excel. tắt Excel và Save

Cách gán phím tắt

Trong Excel:

1. Nhấn Alt + F8 để mở danh sách Macro.

2. Chọn macro:

PERSONAL.XLSB!KhoaTatCaSheet

3. Bấm Options... / Tùy chọn...



Macro VBA trong Excel dùng để ẩn/hiện các dòng dựa trên dữ liệu ở cột G đến P, bắt đầu từ dòng 5

 

Sub AnBoAnDongTrong_G_P()


    Dim ws As Worksheet

    Dim lastRow As Long

    Dim r As Long

    Dim c As Range

    Dim CoDuLieu As Boolean

    Dim CoDongDangAn As Boolean

    Dim DangKhoa As Boolean

    Dim MatKhau As String


    MatKhau = "0943836131"


    Set ws = ActiveSheet


    If ws.Cells.Find("*", SearchOrder:=xlByRows, _

        SearchDirection:=xlPrevious) Is Nothing Then Exit Sub


    lastRow = ws.Cells.Find("*", SearchOrder:=xlByRows, _

                           SearchDirection:=xlPrevious).Row


    Application.ScreenUpdating = False

    Application.EnableEvents = False


    On Error GoTo XuLyLoi


    'Ghi nho trang thai khoa ban dau

    DangKhoa = ws.ProtectContents


    'Neu dang khoa thi mo tam

    If DangKhoa Then

        ws.Unprotect Password:=MatKhau

    End If


    'Kiem tra xem co dong nao dang bi an hay khong

    For r = 5 To lastRow

        If ws.Rows(r).Hidden = True Then

            CoDongDangAn = True

            Exit For

        End If

    Next r


    If CoDongDangAn Then


        'Bo an tat ca cac dong

        ws.Rows("5:" & lastRow).Hidden = False


    Else


        'An dong neu tat ca cac o G:P deu trong

        For r = 5 To lastRow


            CoDuLieu = False


            For Each c In ws.Range("G" & r & ":P" & r)


                'Cong thuc tra ve "" cung duoc coi la trong

                If Len(Trim(CStr(c.Value))) > 0 Then

                    CoDuLieu = True

                    Exit For

                End If


            Next c


            If CoDuLieu = False Then

                ws.Rows(r).Hidden = True

            End If


        Next r


    End If


    'Neu ban dau dang khoa thi khoa lai

    If DangKhoa Then

        ws.Protect _

            Password:=MatKhau, _

            DrawingObjects:=False, _

            Contents:=True, _

            Scenarios:=True, _

            AllowFiltering:=True, _

            AllowUsingPivotTables:=True

    End If


    Application.EnableEvents = True

    Application.ScreenUpdating = True


    Exit Sub



XuLyLoi:


    'Neu co loi ma sheet da bi mo khoa thi co gang khoa lai

    On Error Resume Next


    If DangKhoa And ws.ProtectContents = False Then

        ws.Protect _

            Password:=MatKhau, _

            DrawingObjects:=False, _

            Contents:=True, _

            Scenarios:=True, _

            AllowFiltering:=True, _

            AllowUsingPivotTables:=True

    End If


    Application.EnableEvents = True

    Application.ScreenUpdating = True


    MsgBox _

        "Co loi khi an/bo an dong." & vbCrLf & _

        "Sheet: " & ws.Name & vbCrLf & _

        "Loi: " & Err.Description, _

        vbExclamation, "LOI"


End Sub

 

 


 

 

 

 

Related posts:

Đăng nhận xét

Mới hơn Cũ hơn

Discuss

×Close