Lập UserForm đăng nhập khi vào Excel

Liên hệ QC

NguyenNgocSon

KEEP WALKING
Tham gia
4/4/08
Bài viết
280
Được thích
832
Nghề nghiệp
Ths. Cầu hầm
Xin mọi người chỉ giúp cách tạo user form tạo mật khẩu đăng nhập khi vào một file excel
Xin cám ơn sự giúp đỡ !!!
Thân !!!
 
Xin mọi người chỉ giúp cách tạo user form tạo mật khẩu đăng nhập khi vào một file excel
Xin cám ơn sự giúp đỡ !!!
Thân !!!
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
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem file đính kèm nha. Pass: 123456. Bạn nhớ phải đặt pass của VBA nữa nha.
 

File đính kèm

  • Book1.rar
    7.6 KB · Đọc: 1,375
Upvote 0
Bạn xem file đính kèm nha. Pass: 123456. Bạn nhớ phải đặt pass của VBA nữa nha.
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...
 
Upvote 0
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ó.
 
Upvote 0
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ứ!
 
Upvote 0
Ý 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.
 
Upvote 0
Thử tạo form đăng nhập

Đú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:
FDN1.png


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:

FDN2.png


Form này đơn giản, chỉ có 2 Textbox giúp cho người dùng nhập vào tênmậ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 Auto_Open 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

LVD
 
Lần chỉnh sửa cuối:
Upvote 0
Chúng ta có các hàm hổ trợ sau:

Mã:
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.
  • ...
 

File đính kèm

  • LoginsExcel.zip
    36.9 KB · Đọc: 1,036
Lần chỉnh sửa cuối:
Upvote 0
Ý 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.
 
Upvote 0
Đú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:
FDN1.png


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:

FDN2.png


Form này đơn giản, chỉ có 2 Textbox giúp cho người dùng nhập vào tênmậ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 Auto_Open 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

LVD

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
 
Lần chỉnh sửa cuối:
Upvote 0
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
 
Lần chỉnh sửa cuối:
Upvote 0
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
Thầy hướng dẫn
Chúng ta có các hàm hổ trợ sau:

Mã:
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
 
Lần chỉnh sửa cuối:
Upvote 0
Chúng ta có các hàm hổ trợ sau:

Mã:
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.
  • ...



Bạn cho mình xin user với password không
Mình thử dùng các user trong sheet đều không được
 
Upvote 0
Người dùng bấm vào dấu X là xong
View attachment 245817
Có form cũng như không
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ả.
 
Upvote 0
Web KT
Back
Top Bottom