Lock sheet: vba protect sheet with password

vbano1

SMod
Thành viên BQT
Mình thấy nhiều bạn ghi dữ liệu vào sheet thông qua Userform. Tất nhiên cũng có trăm ngàn lý do, chẳng hạn như không muốn người dùng sờ mó vào vùng dữ liệu, nhập tùm lum không theo định dạng mong muốn.
Vì vậy, thông qua UserForm, các bạn sẽ cho macro kiểm tra định dạng dữ liệu có đúng như mình mong muốn không, rồi dữ liệu từ UserForm cập nhật vào sheet trên excel.
Bạn cần đăng nhập để thấy đính kèm

Như vậy: Vấn đề đặt ra là khóa sheet như thế nào để không cho người dùng can thiệp bằng tay, tự ý sửa chữa trực tiếp trên sheet.
Cách làm:
Trước hết tôi giới thiệu thao tác bằng tay để các bạn nhớ lại nhé.
Tại sheet các bạn muốn khóa, các bạn click chuột phải chọn Protect:
Bạn cần đăng nhập để thấy đính kèm


Tại đây các bạn nhập mật khẩu, chẳng hạn là "123456"
Bạn cần đăng nhập để thấy đính kèm


Cửa sổ xác nhận mật khẩu hiện ra, bạn nhập một lần nữa "123456".
Bạn cần đăng nhập để thấy đính kèm


Ấn OK là xong. Như vậy người dùng không thể tùy tiện nhập dữ liệu trên sheet này được nữa.
Cố tình nhập sẽ như thế này:
Bạn cần đăng nhập để thấy đính kèm


Muốn trở lại trạng thái ban đầu, bạn click chuột phải vào sheet đang bị khóa, chọn Unprotect:
Bạn cần đăng nhập để thấy đính kèm


Cửa sổ hiện ra, bạn gõ mật khẩu "123456" và ấn OK, sheet đã trở lại bình thường.
Bạn cần đăng nhập để thấy đính kèm


Như vậy tôi đã giới thiệu xong thao tác bằng tay.
Bây giờ chúng ta quay trở về câu chuyện ban đầu với Userform.
Bạn cần đăng nhập để thấy đính kèm


Chúng ta cần mở khóa sheet trước khi tiến hành cập nhật dữ liệu:
Mã:
ThisWorkbook.Sheets("tuhocvba").Unprotect Password:="YourPassword"
Sau khi cập nhật dữ liệu, bạn tiến hành khóa sheet:
Mã:
ThisWorkbook.Sheets("tuhocvba").Protect Password:="YourPassword"
 

tuhocvba

Administrator
Thành viên BQT
Phát triển chủ đề thêm một chút nữa: Khóa cells.
Trong chủ đề này, tôi sẽ trình bày cách chỉ định cho người dùng nhập liệu vào một vùng Range. Ngoài khu vực đó ra, tôi sẽ khóa toàn bộ, không cho người dùng can thiệp sửa dữ liệu.
1-Bạn chọn vào vùng Range cho phép người dùng nhập liệu.
2-Click thẻ Home
3-Click chọn Format
4-Click chọn Lock cell.
Bạn cần đăng nhập để thấy đính kèm


Tiếp theo bạn click chuột phải vào sheet hiện hành: Chọn Protect Sheet.
Bạn cần đăng nhập để thấy đính kèm


Bạn cần đăng nhập để thấy đính kèm


Chú ý KHÔNG chọn vào "Select locked cells".
Sau đó nhập password hai lần.
Kết quả: Vùng Range màu vàng sẽ được nhập liệu bình thường, còn toàn bộ khu vực khác trên sheet sẽ bị khóa.
 

vbano1

SMod
Thành viên BQT
Áp dụng thực tế:
Đoạn code sau dùng để khóa sheet:
Mã:
Sub khoafile()
    ThisWorkbook.Sheets(1).Activate
    With ThisWorkbook.Sheets(1)
    'Đây là vùng không bị khóa, cho phép nhập'
        Union(.Range(Cells(4, 11), Cells(5, 11)), .Cells(2, 6), .Cells(6, 6), .Cells(12, 6)).Locked = False
    End With
    
    ThisWorkbook.Sheets(1).Protect Password:="tuhocvba.net"
    ThisWorkbook.Sheets(1).EnableSelection = xlUnlockedCells
End Sub
Đoạn code sau dùng để mở sheet:
Mã:
Sub mofile()
    ThisWorkbook.Sheets(1).Activate
    ThisWorkbook.Sheets(1).Unprotect Password:="tuhocvba.net"
End Sub
 

Yukino Ichikawa

Thành viên
Ở bài , còn một hướng nữa chưa được khai thác. Hướng này thì thực tế ít thấy dùng, nhưng cũng xin phép đươc nêu ra để mọi người tham khảo.
Đó là khóa thao tác bằng tay nhưng vẫn cho macro hoạt động ghi dữ liệu lên sheet.
Tức là lúc này người dùng không thể dùng các thao tác bằng tay để chỉnh sửa dữ liệu, nhưng nếu thực thi bằng macro thì vẫn được.
Mã:
Sub Sample07_5()
    ActiveSheet.Protect UserInterfaceOnly:=True
End Sub
Anh chị chạy code trên sẽ thấy là bây giờ anh chị không thể thao tác bằng tay trên activesheet được nữa.
Bây giờ anh chị chạy thủ tục sau:
Mã:
Sub test2()
    ActiveSheet.Cells(1, 1) = 2
End Sub
Anh chị sẽ thấy là giá trị 2 được viết vào ô A1.

Có một lưu ý, nếu anh chị đóng file này lại. Sau đó anh chỉ mở lại file này. Lúc này thì cả macro và thao tác bằng tay đều không thể ghi được dữ liệu lên sheet.
Anh chỉ một lần nữa hãy chạy thủ tục Sample07_5, bây giờ thì nó chỉ khóa thao tác bằng tay, còn macro thì vẫn thực thi ghi giá trị được.
Nguồn tham khảo và dịch:
 
Top