Tại sao bạn không dùng luôn pass Open?
Cái này bảo mật tốt hơn nhiều so với mật khẩu trong UserForm ---> Mấy cái Pass UserForm này, chỉ cần 5s là bị vô hiệu hóa ngay ---> Với Pass Open thì... chưa chắc (nếu pass dài)
Còn như bạn vẫn muốn nghiên cứu thì... Search trên diển đàn ---> Có đầy! http://www.giaiphapexcel.com/forum/showthread.php?t=2493
Giả sử tôi mở file của bạn lên và bấm Disable macro... sau đó Alt + F11 và xóa luôn code của bạn thì sao? (đừng nói là đặt pass cho VBA nha... quá vô bổ)
Ẹc... Ẹc...
Giả sử tôi mở file của bạn lên và bấm Disable macro... sau đó Alt + F11 và xóa luôn code của bạn thì sao? (đừng nói là đặt pass cho VBA nha... quá vô bổ)
Ẹc... Ẹc...
Nếu mà bạn bảo thể thì còn nói làm gì nữa.Đã làm đăng nhập như thế thì trong chương trình đó fải sử dụng macro chứ. Nếu không có macro thì chương trình coi như không có tác dụng gì cả. Còn nếu nói đến bảo mật trong cell thì chắc bạn đã biết là không khó khăn gì để fá cả trừ khi bạn làm thành .dll rồi liên kết đến nó.
Nếu mà bạn bảo thể thì còn nói làm gì nữa.Đã làm đăng nhập như thế thì trong chương trình đó fải sử dụng macro chứ. Nếu không có macro thì chương trình coi như không có tác dụng gì cả. Còn nếu nói đến bảo mật trong cell thì chắc bạn đã biết là không khó khăn gì để fá cả trừ khi bạn làm thành .dll rồi liên kết đến nó.
Ý tôi muốn nói cái này đây:
- Đầu tiên người ta mở file và Disable macro của bạn!
- Bấm Alt + F11 vào xem code ---> xóa toàn bộ phần Form đăng nhập, chỉ chừa lại code chính
- Đóng và lưu file
Vậy là từ lần sau, bất kỳ ai cũng có thể sử dụng được mà chẳng cần phải đăng nhập
Vì vậy thà rằng cho chạy thoải mái, còn không thì đặt pass Open hay gì gì đó ---> Làm cái Form đăng nhập chỉ mang tính hòa nhoáng (cho người ta thấy mình... Pro) chứ chả được tích sự gì
Tôi không nói Form đăng nhập là không cần thiết (với 1 chương trình lớn người ta vẫn có Form đăng nhập)... Tuy nhiên với chúng ta, những người còn đang tập tành thì khi xây dựng chương trình nên cân nhắc... liệu làm Form thế có.. xứng không?
Chỉ nội 1 chuyện tác giả đi hỏi vấn đề này cũng đủ biết là.. đang học rồi ---> Tốt nhất nên quan tâm đến thuật toán của code, làm sao cho chương trình chạy thật đẹp và nhanh... đến khi trở thành ÔNG TƯỚNG rồi hãy quan tâm đến cái Form ấy vẫn chưa muộn
Tôi nói đúng chứ!
Ý tôi muốn nói cái này đây:
- Đầu tiên người ta mở file và Disable macro của bạn!
- Bấm Alt + F11 vào xem code ---> xóa toàn bộ phần Form đăng nhập, chỉ chừa lại code chính
- Đóng và lưu file
Vậy là từ lần sau, bất kỳ ai cũng có thể sử dụng được mà chẳng cần phải đăng nhập
Vì vậy thà rằng cho chạy thoải mái, còn không thì đặt pass Open hay gì gì đó ---> Làm cái Form đăng nhập chỉ mang tính hòa nhoáng (cho người ta thấy mình... Pro) chứ chả được tích sự gì
Tôi không nói Form đăng nhập là không cần thiết (với 1 chương trình lớn người ta vẫn có Form đăng nhập)... Tuy nhiên với chúng ta, những người còn đang tập tành thì khi xây dựng chương trình nên cân nhắc... liệu làm Form thế có.. xứng không?
Chỉ nội 1 chuyện tác giả đi hỏi vấn đề này cũng đủ biết là.. đang học rồi ---> Tốt nhất nên quan tâm đến thuật toán của code, làm sao cho chương trình chạy thật đẹp và nhanh... đến khi trở thành ÔNG TƯỚNG rồi hãy quan tâm đến cái Form ấy vẫn chưa muộn
Tôi nói đúng chứ!
bạn ơi, nếu đã đặt pass cho VBA thì làm sao vào mà xem code được để xóa đoạn đăng nhập chứ? Còn nếu đã nói đến phá thì có gì mà không phá được đâu. Bây giờ đến unviewable còn bị phá nữa là. Thế nên cũng chỉ là một phần thôi. Muốn không phá được trừ khi bạn làm bản dùng thử hạn chế chức năng sau đó người nào cần thì mới cấp bản đầy đủ chức năng thôi. Làm như thế thì kể cả hacker cũng bó tay chịu trói thôi.
Đúng đây là đề tài các bạn quan tâm tương đối nhiều.
Tôi xin giới thiệu một ví dụ để các bạn tham khảo. Dĩ nhiên ở đây tôi giả sử rằng:
Không nói đến chuyện bẻ khóa (các loại).
Có Password cho VBA.
Giả sử rằng chúng ta có các worksheet như hình sau:
Các bạn thấy ta các bảng dữ liệu ở worksheet Logins. Trên bảng này chúng ta lưu trữ :
MaNV: Mã nhân viên.
TenNV: Tên nhân viên.
MatKhau: Mật khẩu.
Worksheets: Các worksheet được quyền mở.
Tôi sẽ thiết kế một form nhập liệu như hình sau:
Form này đơn giản, chỉ có 2 Textbox giúp cho người dùng nhập vào tên và mật khẩu.
Để bắt buộc người dùng đăng nhập vào để sử dụng các bạn sẽ phải cho hiện form đăng nhập mỗi khi người dùng. Chú ý, phải bắt buộc người dùng Enable macro thì chúng ta mới cho sử dụng tập tin (tham khảo thêm tại đây)
Chúng ta sẽ thêm thủ tục Autpen vào code module của chúng ta:
Mã:
Sub Auto_Open()
On Error GoTo ErrorHandler
'To make sure only the worksheet WsIntro
'that the user can see
Call ViewWs(Array("WsIntro"))
frmLogins.Show
ErrorExit:
If lLogin = 0 Then
'Nham lam cho Excel tuong la da Save roi
'Nen khi dong se khong hoi nua
Application.Workbooks(gcsWbName).Saved = True
Application.Workbooks(gcsWbName).Close
End If
Exit Sub
ErrorHandler:
lLogin = 0
GoTo ErrorExit
End Sub
Chú ý: chúng ta có các hằng và biến cho chương trình như sau:
Mã:
Option Explicit
Public Const gcsAppName = "Logins" 'Tên ứng dụng
Public Const gcsWbName = "LoginsExcel.xls" 'Tên tập tin Êxcl
Public lLogin As Long 'Để kiểm tra việc login thành công hay không
Và bây giờ chúng ta hãy viết code cho form đăng nhập ở trên:
Mã:
Private Sub cmdExit_Click()
lLogin = 0
frmLogins.Hide
End Sub
Private Sub cmdLogin_Click()
Dim sUser As String, sPass As String
Dim sCheck As String, sPermitWs As String
On Error GoTo ErrorHandler
'Gia su rang khong login vao duoc
lLogin = 0
sUser = txtUser.Text
sPass = txtPass.Text
sCheck = GetInfo(sUser, "Logins", 2)
Select Case sCheck
Case "none"
'Trong truong hop nguoi dung khong ton tai
MsgBoxUni VNI("Khoâng toàn taïi ngöôøi duøng " & sUser & vbCrLf & _
"Xin kieåm tra laïi."), vbCritical + vbOKOnly, gcsAppName
Case "error"
'Trong truong hop co loi xay ra
MsgBoxUni VNI("Xin baïn kieåm tra laïi döõ lieäu nhaäp vaøo."), vbInformation + vbOKOnly, gcsAppName
Case Else
'Trong truong hop co ton tai nguoi dung nay
'Kiem tra pass
If sPass <> sCheck Then
MsgBoxUni VNI("Maät khaåu khoâng ñuùng. Xin kieåm laïi."), vbCritical + vbOKOnly, gcsAppName
Else
'Trong truong hop mat khau dung, lay ve gia tri worksheet duoc quyen
sPermitWs = GetInfo(sUser, "Logins", 3)
ViewWs (Array(sPermitWs))
lLogin = 1
Me.Hide
End If
End Select
ErrorExit:
Exit Sub
ErrorHandler:
lLogin = 0
GoTo ErrorExit
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Khong cho thoat bang cach nay
Cancel = True
End Sub
Option Explicit
Function GetInfo(sName, sWsName As String, Optional ColGetText As Integer = 2) As String
Dim rFound As Range
On Error GoTo ErrorHandler
Set rFound = Sheets(sWsName).Columns(1).Find(sName, lookat:=xlWhole)
If rFound Is Nothing Then
GetInfo = "none"
Else
GetInfo = rFound.Offset(, ColGetText).Value
End If
ErrorExit:
Exit Function
ErrorHandler:
GetInfo = "error"
GoTo ErrorExit
End Function
'---------------------------------------------------------------------------------------
' Procedure : ViewWs
' DateTime :
' Author :
' Purpose : To active the worksheets
' WsName is an array. For example: WsName=Array("Thong bao", "Bao cao")
'---------------------------------------------------------------------------------------
'
Sub ViewWs(ByVal WsName As Variant)
Dim ws As Worksheet
On Error Resume Next
Application.ScreenUpdating = False
'There is at least one worksheet visible first
'If not, the error will be shown and this Sub is not correct
For Each ws In ThisWorkbook.Worksheets
If IsItInArray(ws.Name, WsName, 0) Then
ws.Visible = xlSheetVisible
End If
Next
For Each ws In ThisWorkbook.Worksheets
If Not IsItInArray(ws.Name, WsName, 0) Then
ws.Visible = xlSheetHidden
End If
Next
'To avoid the Take Pane for viewing.
'This error, I have check in the internet but nobody know
With Application
.CommandBars("Task Pane").Visible = True
.CommandBars("Task Pane").Visible = False
.ScreenUpdating = True
End With
End Sub
'---------------------------------------------------------------------------------------
' Procedure : IsItInArray
' DateTime :
' Author : Le Van Duyet
' Purpose : To check an item is in an array or not
' Take note : FoundPos will begin from 0
'---------------------------------------------------------------------------------------
'
Function IsItInArray(sValueToFind As Variant, InputArray As Variant, FoundPos As Long) As Boolean
Dim vloop As Long
On Error GoTo ErrorHandler
For vloop = LBound(InputArray) To UBound(InputArray)
IsItInArray = IIf(StrComp(sValueToFind, InputArray(vloop), vbTextCompare) = 0, True, False)
If IsItInArray Then
FoundPos = vloop
GoTo ErrorExit
End If
Next vloop
ErrorExit:
Exit Function
ErrorHandler:
IsItInArray = False
GoTo ErrorExit
End Function
Các bạn chỉ cần chú ý đến hai hàm chính, đó là: ViewWs để cho hiện các worksheets. Ví dụ: ViewWs(array("Ws1", "Ws2")), thì sẽ chỉ cho hiện 2 worksheet này mà thôi. Còn các worksheets khác thì ẩn.
Hàm thứ hai là hàm tìm kiếm thông tin, GetInfo nhằm thiết lập người dùng, mật khẩu, lưu các worksheets được quyền nhập liệu hay thay đổi.
Mã:
Function GetInfo(sName, sWsName As String, Optional ColGetText As Integer = 2) As String
sName: chuổi cần tìm, ở đây là mã người dùng.
sWsName: tên worksheet chứa dữ liệu để tìm.
ColGetText: cột để lấy dữ liệu về nếu tìm thấy.
Đến đây, chúng ta hãy cùng nhau giải thích sơ lược các đoạn code trên xem sao.
Lê Văn Duyệt
(Xin xem tập tin đính kèm)
Các vấn đề sẽ nãy sinh:
Làm sao tôi có thể giới hạn số lần đăng nhập.
Làm sao tôi có thể di chuyển giữa các worksheets mà tôi được phép thao tác.
Làm sao tôi có thể thêm việc chỉ cho phép đọc một số worksheets.
Làm sao tôi bắt buộc người dùng phải Enable macro.
Ý tôi muốn nói cái này đây:
- Đầu tiên người ta mở file và Disable macro của bạn!
- Bấm Alt + F11 vào xem code ---> xóa toàn bộ phần Form đăng nhập, chỉ chừa lại code chính
- Đóng và lưu file
Vậy là từ lần sau, bất kỳ ai cũng có thể sử dụng được mà chẳng cần phải đăng nhập
Vì vậy thà rằng cho chạy thoải mái, còn không thì đặt pass Open hay gì gì đó ---> Làm cái Form đăng nhập chỉ mang tính hòa nhoáng (cho người ta thấy mình... Pro) chứ chả được tích sự gì
Tôi không nói Form đăng nhập là không cần thiết (với 1 chương trình lớn người ta vẫn có Form đăng nhập)... Tuy nhiên với chúng ta, những người còn đang tập tành thì khi xây dựng chương trình nên cân nhắc... liệu làm Form thế có.. xứng không?
Chỉ nội 1 chuyện tác giả đi hỏi vấn đề này cũng đủ biết là.. đang học rồi ---> Tốt nhất nên quan tâm đến thuật toán của code, làm sao cho chương trình chạy thật đẹp và nhanh... đến khi trở thành ÔNG TƯỚNG rồi hãy quan tâm đến cái Form ấy vẫn chưa muộn
Tôi nói đúng chứ!
Em thấy thầy hơi khó tính. Thực ra là thẳng tính thì đúng hơn.
Em cũng định tạo form đăng nhập và thoát khỏi file excel, đúng là để cho nó pro, tuy nhiên đúng là đang học thì nên học những cái cần trước.
Cảm ơn thầy đã thẳng thắn, ko em sẽ còn mất nhiều thời gian hơn nữa về vấn đề này.
Đúng đây là đề tài các bạn quan tâm tương đối nhiều.
Tôi xin giới thiệu một ví dụ để các bạn tham khảo. Dĩ nhiên ở đây tôi giả sử rằng:
Không nói đến chuyện bẻ khóa (các loại).
Có Password cho VBA.
Giả sử rằng chúng ta có các worksheet như hình sau:
Các bạn thấy ta các bảng dữ liệu ở worksheet Logins. Trên bảng này chúng ta lưu trữ :
MaNV: Mã nhân viên.
TenNV: Tên nhân viên.
MatKhau: Mật khẩu.
Worksheets: Các worksheet được quyền mở.
Tôi sẽ thiết kế một form nhập liệu như hình sau:
Form này đơn giản, chỉ có 2 Textbox giúp cho người dùng nhập vào tên và mật khẩu.
Để bắt buộc người dùng đăng nhập vào để sử dụng các bạn sẽ phải cho hiện form đăng nhập mỗi khi người dùng. Chú ý, phải bắt buộc người dùng Enable macro thì chúng ta mới cho sử dụng tập tin (tham khảo thêm tại đây)
Chúng ta sẽ thêm thủ tục Autpen vào code module của chúng ta:
Mã:
Sub Auto_Open()
On Error GoTo ErrorHandler
'To make sure only the worksheet WsIntro
'that the user can see
Call ViewWs(Array("WsIntro"))
frmLogins.Show
ErrorExit:
If lLogin = 0 Then
'Nham lam cho Excel tuong la da Save roi
'Nen khi dong se khong hoi nua
Application.Workbooks(gcsWbName).Saved = True
Application.Workbooks(gcsWbName).Close
End If
Exit Sub
ErrorHandler:
lLogin = 0
GoTo ErrorExit
End Sub
Chú ý: chúng ta có các hằng và biến cho chương trình như sau:
Mã:
Option Explicit
Public Const gcsAppName = "Logins" 'Tên ứng dụng
Public Const gcsWbName = "LoginsExcel.xls" 'Tên tập tin Êxcl
Public lLogin As Long 'Để kiểm tra việc login thành công hay không
Và bây giờ chúng ta hãy viết code cho form đăng nhập ở trên:
Mã:
Private Sub cmdExit_Click()
lLogin = 0
frmLogins.Hide
End Sub
Private Sub cmdLogin_Click()
Dim sUser As String, sPass As String
Dim sCheck As String, sPermitWs As String
On Error GoTo ErrorHandler
'Gia su rang khong login vao duoc
lLogin = 0
sUser = txtUser.Text
sPass = txtPass.Text
sCheck = GetInfo(sUser, "Logins", 2)
Select Case sCheck
Case "none"
'Trong truong hop nguoi dung khong ton tai
MsgBoxUni VNI("Khoâng toàn taïi ngöôøi duøng " & sUser & vbCrLf & _
"Xin kieåm tra laïi."), vbCritical + vbOKOnly, gcsAppName
Case "error"
'Trong truong hop co loi xay ra
MsgBoxUni VNI("Xin baïn kieåm tra laïi döõ lieäu nhaäp vaøo."), vbInformation + vbOKOnly, gcsAppName
Case Else
'Trong truong hop co ton tai nguoi dung nay
'Kiem tra pass
If sPass <> sCheck Then
MsgBoxUni VNI("Maät khaåu khoâng ñuùng. Xin kieåm laïi."), vbCritical + vbOKOnly, gcsAppName
Else
'Trong truong hop mat khau dung, lay ve gia tri worksheet duoc quyen
sPermitWs = GetInfo(sUser, "Logins", 3)
ViewWs (Array(sPermitWs))
lLogin = 1
Me.Hide
End If
End Select
ErrorExit:
Exit Sub
ErrorHandler:
lLogin = 0
GoTo ErrorExit
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Khong cho thoat bang cach nay
Cancel = True
End Sub
Mình muốn thay đổi tên người đăng nhập và thêm các Worksheets cho nhiều người dùng nữa thì làm thế nào bạn ơi, chỉ dùm mình với và mình muốn có acount admin xem được tất các Worksheets khác của các người dùng
Bài viết hay quá ạ. Thầy cho em hỏi 1 chút là nếu như tạo 1 tài khoản kiểu như Admin, khi đăng nhập nó sẽ show hết các sheets lên thì code như thế nào ạ. Em cảm ơn
Mình muốn thay đổi tên người đăng nhập và thêm các Worksheets cho nhiều người dùng nữa thì làm thế nào bạn ơi, chỉ dùm mình với và mình muốn có acount admin xem được tất các Worksheets khác của các người dùng
Option Explicit
Function GetInfo(sName, sWsName As String, Optional ColGetText As Integer = 2) As String
Dim rFound As Range
On Error GoTo ErrorHandler
Set rFound = Sheets(sWsName).Columns(1).Find(sName, lookat:=xlWhole)
If rFound Is Nothing Then
GetInfo = "none"
Else
GetInfo = rFound.Offset(, ColGetText).Value
End If
ErrorExit:
Exit Function
ErrorHandler:
GetInfo = "error"
GoTo ErrorExit
End Function
'---------------------------------------------------------------------------------------
' Procedure : ViewWs
' DateTime :
' Author :
' Purpose : To active the worksheets
' WsName is an array. For example: WsName=Array("Thong bao", "Bao cao")
'---------------------------------------------------------------------------------------
'
Sub ViewWs(ByVal WsName As Variant)
Dim ws As Worksheet
On Error Resume Next
Application.ScreenUpdating = False
'There is at least one worksheet visible first
'If not, the error will be shown and this Sub is not correct
For Each ws In ThisWorkbook.Worksheets
If IsItInArray(ws.Name, WsName, 0) Then
ws.Visible = xlSheetVisible
End If
Next
For Each ws In ThisWorkbook.Worksheets
If Not IsItInArray(ws.Name, WsName, 0) Then
ws.Visible = xlSheetHidden
End If
Next
'To avoid the Take Pane for viewing.
'This error, I have check in the internet but nobody know
With Application
.CommandBars("Task Pane").Visible = True
.CommandBars("Task Pane").Visible = False
.ScreenUpdating = True
End With
End Sub
'---------------------------------------------------------------------------------------
' Procedure : IsItInArray
' DateTime :
' Author : Le Van Duyet
' Purpose : To check an item is in an array or not
' Take note : FoundPos will begin from 0
'---------------------------------------------------------------------------------------
'
Function IsItInArray(sValueToFind As Variant, InputArray As Variant, FoundPos As Long) As Boolean
Dim vloop As Long
On Error GoTo ErrorHandler
For vloop = LBound(InputArray) To UBound(InputArray)
IsItInArray = IIf(StrComp(sValueToFind, InputArray(vloop), vbTextCompare) = 0, True, False)
If IsItInArray Then
FoundPos = vloop
GoTo ErrorExit
End If
Next vloop
ErrorExit:
Exit Function
ErrorHandler:
IsItInArray = False
GoTo ErrorExit
End Function
Các bạn chỉ cần chú ý đến hai hàm chính, đó là: ViewWs để cho hiện các worksheets. Ví dụ: ViewWs(array("Ws1", "Ws2")), thì sẽ chỉ cho hiện 2 worksheet này mà thôi. Còn các worksheets khác thì ẩn.
Hàm thứ hai là hàm tìm kiếm thông tin, GetInfo nhằm thiết lập người dùng, mật khẩu, lưu các worksheets được quyền nhập liệu hay thay đổi.
Mã:
Function GetInfo(sName, sWsName As String, Optional ColGetText As Integer = 2) As String
sName: chuổi cần tìm, ở đây là mã người dùng.
sWsName: tên worksheet chứa dữ liệu để tìm.
ColGetText: cột để lấy dữ liệu về nếu tìm thấy.
Đến đây, chúng ta hãy cùng nhau giải thích sơ lược các đoạn code trên xem sao.
Lê Văn Duyệt
(Xin xem tập tin đính kèm)
Các vấn đề sẽ nãy sinh:
Làm sao tôi có thể giới hạn số lần đăng nhập.
Làm sao tôi có thể di chuyển giữa các worksheets mà tôi được phép thao tác.
Làm sao tôi có thể thêm việc chỉ cho phép đọc một số worksheets.
Làm sao tôi bắt buộc người dùng phải Enable macro.
Thực sự em đã cố gắng tìm hiểu để đạt được vấn đề mong muốn là gán số lượng sheet cần mở lên 1 user ( 1 user có thể 1 hoặc 2 hoặc 3 sheets tùy vào mình muốn set), nhưng lực bất tòng tâm, mong thầy bớt chút thời gian hướng dẫn giúp ạ. Cảm ơn thầy
Option Explicit
Function GetInfo(sName, sWsName As String, Optional ColGetText As Integer = 2) As String
Dim rFound As Range
On Error GoTo ErrorHandler
Set rFound = Sheets(sWsName).Columns(1).Find(sName, lookat:=xlWhole)
If rFound Is Nothing Then
GetInfo = "none"
Else
GetInfo = rFound.Offset(, ColGetText).Value
End If
ErrorExit:
Exit Function
ErrorHandler:
GetInfo = "error"
GoTo ErrorExit
End Function
'---------------------------------------------------------------------------------------
' Procedure : ViewWs
' DateTime :
' Author :
' Purpose : To active the worksheets
' WsName is an array. For example: WsName=Array("Thong bao", "Bao cao")
'---------------------------------------------------------------------------------------
'
Sub ViewWs(ByVal WsName As Variant)
Dim ws As Worksheet
On Error Resume Next
Application.ScreenUpdating = False
'There is at least one worksheet visible first
'If not, the error will be shown and this Sub is not correct
For Each ws In ThisWorkbook.Worksheets
If IsItInArray(ws.Name, WsName, 0) Then
ws.Visible = xlSheetVisible
End If
Next
For Each ws In ThisWorkbook.Worksheets
If Not IsItInArray(ws.Name, WsName, 0) Then
ws.Visible = xlSheetHidden
End If
Next
'To avoid the Take Pane for viewing.
'This error, I have check in the internet but nobody know
With Application
.CommandBars("Task Pane").Visible = True
.CommandBars("Task Pane").Visible = False
.ScreenUpdating = True
End With
End Sub
'---------------------------------------------------------------------------------------
' Procedure : IsItInArray
' DateTime :
' Author : Le Van Duyet
' Purpose : To check an item is in an array or not
' Take note : FoundPos will begin from 0
'---------------------------------------------------------------------------------------
'
Function IsItInArray(sValueToFind As Variant, InputArray As Variant, FoundPos As Long) As Boolean
Dim vloop As Long
On Error GoTo ErrorHandler
For vloop = LBound(InputArray) To UBound(InputArray)
IsItInArray = IIf(StrComp(sValueToFind, InputArray(vloop), vbTextCompare) = 0, True, False)
If IsItInArray Then
FoundPos = vloop
GoTo ErrorExit
End If
Next vloop
ErrorExit:
Exit Function
ErrorHandler:
IsItInArray = False
GoTo ErrorExit
End Function
Các bạn chỉ cần chú ý đến hai hàm chính, đó là: ViewWs để cho hiện các worksheets. Ví dụ: ViewWs(array("Ws1", "Ws2")), thì sẽ chỉ cho hiện 2 worksheet này mà thôi. Còn các worksheets khác thì ẩn.
Hàm thứ hai là hàm tìm kiếm thông tin, GetInfo nhằm thiết lập người dùng, mật khẩu, lưu các worksheets được quyền nhập liệu hay thay đổi.
Mã:
Function GetInfo(sName, sWsName As String, Optional ColGetText As Integer = 2) As String
sName: chuổi cần tìm, ở đây là mã người dùng.
sWsName: tên worksheet chứa dữ liệu để tìm.
ColGetText: cột để lấy dữ liệu về nếu tìm thấy.
Đến đây, chúng ta hãy cùng nhau giải thích sơ lược các đoạn code trên xem sao.
Lê Văn Duyệt
(Xin xem tập tin đính kèm)
Các vấn đề sẽ nãy sinh:
Làm sao tôi có thể giới hạn số lần đăng nhập.
Làm sao tôi có thể di chuyển giữa các worksheets mà tôi được phép thao tác.
Làm sao tôi có thể thêm việc chỉ cho phép đọc một số worksheets.
Làm sao tôi bắt buộc người dùng phải Enable macro.
Quan trọng là các câu lệnh trong nút nhấn "Đăng nhập". Nếu sheet bị khoá, bị ẩn, không cho thao tác trên bảng tính thì phải nhấn nút "Đăng nhập" mới được gỡ khoá (nếu đúng mật khẩu). Nhấn dấu X thì không mở khoá.
Form đăng nhập trong bài đó đang làm đơn giản theo nội dung chủ đề của tác giả.