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
 
Ở 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:
 

Tuấn Dũng

Yêu THVBA
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"
m làm theo nhưng chạy được vài lần thì bị lỗi. chạy vba thì unprotect được. nhưng copy password ra để mở khóa bằng thao tác chuột thì lại báo sai password. nên mình phải dùng các khác. vẫn khóa bình thường nhưng dùng lệnh "SheetXXX.protect Userinterfaceonly:=true". lệnh này ko cần unprotect và protect sheet. chạy rất nhẹ
 
D

Deleted member 1392

Guest
@Tuấn Dũng Pass bạn khóa như nào thì dùng pass đó mở bình thường, không thể có chuyện khóa pass A lại mở bằng pass B được. Userinterfaceonly:=true là một dạng khóa cho thực thi code nhưng không cho thao tác. Tuy hay nhưng nó có một hạn chế nhất định, đặc biệt là việc nó sẽ mất công dụng khi đóng mở Excel.
 

tuhocvba

Administrator
Thành viên BQT
Nếu các bạn muốn khóa một vùng cố định, còn những chỗ khác thì cho nhập liệu bình thường:
Bạn cần đăng nhập để thấy đính kèm

Step 1: Các bạn unlock toàn bộ các cells của sheet. (Bỏ tích chọn Lock cell)
Step 2: Select vùng cells cần lock, thiết định lock cell cho vùng đó.
Step 3: Khóa sheet giống như ảnh dưới.
Bạn cần đăng nhập để thấy hình ảnh
 
Top