Sửa lỗi không move or copy được sheet của Excel


Mặc định trên Excel có hỗ trợ tính năng bảo vệ cho bảng tính ( như Protect Sheet, Protect Workbook), nhưng các công cụ chưa thể đáp ứng được các nhu cầu cụ thể của người sử dụng, chẳng hạn cho phép lưu nhưng không cho phép thêm sheet mới, cho lưu nhưng không cho phép in,…Do vậy bài viết này xin chia sẻ thủ thuật ngăn chặn thêm sheet trong bảng tính excel, không cho in bảng tính, không cho save as bảng tính excel.

Bạn có thể quản lý việc tương tác với các bảng tính của bạn bằng cách giám sát và đáp ứng các sự kiện. Các sự kiện (event), là những hành động xảy ra khi bạn làm việc với các bảng tính hoặc các Sheet. Những sự kiện này thường bao gồm việc mở (open) một bảng tính, lưu (save) nó, và đóng (close) nó. Bạn có thể bảo Excel chạy những mã Visual Basic (macro) một cách tự động khi xảy ra bất kỳ một trong những sự kiện như thế.

Tuy nhiên, bạn nên biết rằng, người sử dụng có thể vượt qua tất cả những mã bảo vệ bởi Visual Basic bẳng cách vô hiệu hóa việc thực thi các macro: Nhấn nút Office ➝ Excel Opions ➝ Trust Center ➝ Trust Center Setting ➝ Macro Settings [E2003: Tools | Macro | Security]. Nếu đặt mức độ an toàn là Disable all macros with notification [E2003: mức Medium], mỗi khi mở một bảng tính có chứa macro, Excel sẽ xuất hiện một hộp thông báo và cho phép người sử dụng có cơ hội để tắt các macro. Nếu đặt mức độ an toàn là Disable all macros without notification [E2003: mức High], Excel sẽ ngăn không cho chạy tất cả các macro có trong bảng tính. Nói cách khác, khi cần phải dùng các macro có trong bảng tính, người sử dụng sẽ chọn một mức an toàn thích hợp để cho phép sử dụng các macro.

Ngăn chặn việc chèn thêm Sheet vào một bảng tính

Excel có chức năng Protect Workbook, không cho phép thay đổi cấu trúc của bảng tính như thêm, xóa, di chuyển, hay đổi tên các Sheet. Tuy nhiên, có thể bạn chỉ muốn ngăn chận việc thêm Sheet thôi, còn những việc khác thì vẫn cho phép. Đoạn code sau đây giúp bạn làm việc đó

Sub TOOLS_DELETENAMEDRANGE()
  Dim nm As name
  On Error Resume Next
  For Each nm In ActiveWorkbook.Names
    If (MsgBox("Delete name- " & nm.name, vbYesNo) = vbYes) Then
      nm.Delete
    End If
  Next
  On Error GoTo 0
End Sub
Bạn có thể tham khảo thêm code này nếu code trên không hiệu quả
Sub do_loop_names()
Dim vJunkName As Name
Debug.Print ThisWorkbook.Names.Count

For Each vJunkName In ThisWorkbook.Names
    vJunkName.Delete
Next vJunkName
End Sub

Ps: Đã test và thành công trên nhiều file

Không có nhận xét nào:

Đăng nhận xét