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

 _________________________________________________

Sub KhoaMoTatCaSheet()


    Dim ws As Worksheet

    Dim MatKhau As String

    Dim CoSheetChuaKhoa As Boolean

    Dim SoSheetXuLy As Long

    Dim SoSheetBoQua As Long

    Dim rngFormula As Range


    Dim DanhSachMatKhauKhac As String


    MatKhau = "0943836131"


    Application.ScreenUpdating = False

    Application.EnableEvents = False


    On Error GoTo XuLyLoi



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

    ' 1. KIEM TRA TOAN BO WORKBOOK

    ' Con it nhat 1 sheet chua khoa -> KHOA

    ' Tat ca sheet da khoa -> MO

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


    CoSheetChuaKhoa = False


    For Each ws In ActiveWorkbook.Worksheets


        If ws.ProtectContents = False Then

            CoSheetChuaKhoa = True

            Exit For

        End If


    Next ws



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

    ' 2. CHE DO KHOA

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


    If CoSheetChuaKhoa = True Then


        For Each ws In ActiveWorkbook.Worksheets


            'Chi xu ly sheet chua khoa

            If ws.ProtectContents = False Then


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

                ' Chi an cac o thuc su co cong thuc

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


                Set rngFormula = Nothing


                On Error Resume Next

                Set rngFormula = ws.UsedRange.SpecialCells(xlCellTypeFormulas)

                On Error GoTo XuLyLoi


                If Not rngFormula Is Nothing Then

                    rngFormula.FormulaHidden = True

                End If



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

                ' Khoa sheet

                ' Van cho phep Filter + PivotTable

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


                ws.Protect _

                    Password:=MatKhau, _

                    DrawingObjects:=False, _

                    Contents:=True, _

                    Scenarios:=True, _

                    AllowFiltering:=True, _

                    AllowUsingPivotTables:=True


                SoSheetXuLy = SoSheetXuLy + 1


            Else


                'Sheet da khoa tu truoc -> thu kiem tra

                'co phai dung mat khau nay hay khong


                Err.Clear

                On Error Resume Next


                ws.Unprotect Password:=MatKhau


                If Err.Number = 0 And ws.ProtectContents = False Then


                    'Dung mat khau -> khoa lai ngay

                    ws.Protect _

                        Password:=MatKhau, _

                        DrawingObjects:=False, _

                        Contents:=True, _

                        Scenarios:=True, _

                        AllowFiltering:=True, _

                        AllowUsingPivotTables:=True


                    SoSheetBoQua = SoSheetBoQua + 1


                Else


                    'Mat khau khac

                    DanhSachMatKhauKhac = _

                        DanhSachMatKhauKhac & vbCrLf & "- " & ws.Name


                    SoSheetBoQua = SoSheetBoQua + 1


                End If


                Err.Clear

                On Error GoTo XuLyLoi


            End If


        Next ws



        Application.EnableEvents = True

        Application.ScreenUpdating = True



        MsgBox _

            "DA KHOA VA AN CONG THUC" & vbCrLf & vbCrLf & _

            "Khoa moi: " & SoSheetXuLy & " sheet" & vbCrLf & _

            "Da khoa tu truoc, giu nguyen: " & SoSheetBoQua & " sheet" & vbCrLf & vbCrLf & _

            IIf(DanhSachMatKhauKhac <> "", _

                "Sheet dung mat khau khac:" & vbCrLf & _

                DanhSachMatKhauKhac & vbCrLf & vbCrLf, _

                "Khong co sheet nao dung mat khau khac." & vbCrLf & vbCrLf) & _

            "Van su dung duoc:" & vbCrLf & _

            "- Bo loc tu dong" & vbCrLf & _

            "- PivotTable / PivotChart", _

            vbInformation, "KHOA SHEET"



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

    ' 3. CHE DO MO

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


    Else


        For Each ws In ActiveWorkbook.Worksheets


            If ws.ProtectContents = True Then


                Err.Clear

                On Error Resume Next


                'Chi sheet dung mat khau moi mo duoc

                ws.Unprotect Password:=MatKhau


                If Err.Number = 0 And ws.ProtectContents = False Then


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

                    ' Hien lai cong thuc cua sheet vua mo

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


                    Set rngFormula = Nothing


                    Set rngFormula = _

                        ws.UsedRange.SpecialCells(xlCellTypeFormulas)


                    If Not rngFormula Is Nothing Then

                        rngFormula.FormulaHidden = False

                    End If


                    SoSheetXuLy = SoSheetXuLy + 1


                Else


                    'Mat khau khac -> giu nguyen

                    DanhSachMatKhauKhac = _

                        DanhSachMatKhauKhac & vbCrLf & "- " & ws.Name


                    SoSheetBoQua = SoSheetBoQua + 1


                End If


                Err.Clear

                On Error GoTo XuLyLoi


            End If


        Next ws



        Application.EnableEvents = True

        Application.ScreenUpdating = True



        MsgBox _

            "DA MO CAC SHEET DUNG MAT KHAU" & vbCrLf & vbCrLf & _

            "Da mo: " & SoSheetXuLy & " sheet" & vbCrLf & _

            "Mat khau khac, giu nguyen: " & SoSheetBoQua & " sheet" & vbCrLf & vbCrLf & _

            IIf(DanhSachMatKhauKhac <> "", _

                "Danh sach sheet mat khau khac:" & vbCrLf & _

                DanhSachMatKhauKhac, _

                "Khong co sheet nao dung mat khau khac."), _

            vbInformation, "MO KHOA SHEET"


    End If


    Exit Sub



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

' 4. XU LY LOI

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


XuLyLoi:


    Application.EnableEvents = True

    Application.ScreenUpdating = True


    MsgBox _

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

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

        "Loi: " & Err.Description, _

        vbExclamation, "LOI"


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