Phân quyền, tạo form đăng nhập từ cơ bản đến nâng cao

  • Thread starter Deleted member 1392
  • Ngày gửi
D

Deleted member 1392

Guest
Giới thiệu
Chào các bạn, phân quyền là đăng nhập là một chủ đề vừa mới vừa cũ. Cũ là hầu như ai cũng biết VBA có thể làm được màn hình đăng nhập, mới là chưa có một hệ thống tài liệu nào giúp chúng ta có thể làm được một form đăng nhập hoàn chỉnh từ cơ bản đến nâng cao.

Nâng cao ở đây có thể hiểu là:
- Phân quyền từng User cho từng Sheet, từng cột cụ thể.
- Chỉ tài khoản Admin mới có thể phân quyền, chỉnh sửa thông tin đăng nhập cho các User.
- Tạo thời gian sử dụng cho file, khi hết hạn thì chỉ có đăng nhập tài khoản Admin mới gia hạn được.
- Tài khoản Admin có thể tạo mới, chỉnh sửa thông tin đăng nhập cho các User bằng hình thức Online, không cần mở file.
- Bảo mật hơn với các công cụ ẩn Module, khoá UnView.
- Khắc phục các lỗi khi đang mở nhiều file, tắt mở làm ảnh hưởng các file không liên quan.
...

Phân quyền có thể được dùng cho nhiều trường hợp, đặc biệt là trong trường hợp nhiều người cùng sử dụng 1 file Excel, hạn chế phân mảng dữ liệu 1 người 1 file, việc phân quyền là cần thiết.

Tuy nhiên, nếu xét về phương diện bảo mật thì mình cũng khẳng định là không đảm bảo. Chúng ta dùng phương thức phân quyền đăng nhập để công việc của chúng ta được thuận tiện, giảm phân mảnh dữ liệu và thuận tiện xử lý khi tổng hợp.

Mình sẽ hướng dẫn các bạn một cách dễ hiểu nhất có thể, để làm sao ai trong số chúng ta đều có thể làm theo được. Nào, giờ ta cùng vào phần nội dung.

Cách tạo một màn hình đăng nhập cơ bản
Bước 1:
Tạo một Userform mới và thiết kế một màn hình đăng nhập, bước này nếu các bạn không rõ có thể xem lại loạt bài hướng dẫn tạo Userform
Bạn cần đăng nhập để thấy hình ảnh


Ở đây, mình sẽ đặt tên các Controls như sau:
Label
- ĐĂNG NHẬP: lbLogin
- Tài Khoản: lbID
- Password: lbPW
Textbox
- Tài khoản: tbID
- Password: tbPW
Button
- Đăng nhập: btLogin
- Huỷ bỏ: btClose

Các bạn cũng nên tập thói quen đặt tên các Control khi thêm vào Userform, việc này sẽ giúp các bạn dễ định dang khi viết code đồng thời cũng dễ quản lý. Chứ viết code mà Textbox1, Textbox2... Mới thì hiểu, đợi khi 3 tháng sau quay lại nhìn code thì chỉ có "ngáo" thôi :)

Bước 2: Nhập mật khẩu thì phải hiện chữ * chứ nhỉ
Chọn Textbox Pasword > PasswordChar > *
Bạn cần đăng nhập để thấy hình ảnh


Bước 3: Giờ ta code thôi
Code khi mở form
Mã:
Private Sub UserForm_Initialize()
'//AN FILE EXCEL
Windows(ThisWorkbook.Name).Visible = False
End Sub
Code nút Đăng nhập
ID:
admin - Password: admin
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean

'//CHECK THONG TIN ID VA PASSWORD
If tbID.Value = "admin" And tbPW.Value = "admin" Then
    ckID = True
Else
    MsgBox "Ban da nhap sai tai khoan hoac Password"
    Exit Sub
End If

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
End If

End Sub
Code nút Huỷ bỏ
Mã:
Private Sub btClose_Click()
'//DONG FOMR
Unload Me

'//DONG FILE
ThisWorkbook.Close False
End Sub
Bước 4: Tự mở form khi mở file
Cho đoạn code sau vào Thisworkbook là xong :)
Mã:
Public Sub Auto_Open()
UfLogin.Show
End Sub
Và đây là kết quả, quá đơn giản đúng không nào.
Bạn cần đăng nhập để thấy hình ảnh


Trên đây là cách chúng ta có thể tạo 1 form đăng nhập cơ bản. Trong các bài tiếp theo, chúng ta sẽ tìm hiểu cách tinh chỉnh nhiều tính năng hơn cho form đăng nhập này.
 
Sửa lần cuối bởi điều hành viên:
D

Deleted member 1392

Guest
Tinh chỉnh thêm tính năng cho form đăng nhập
1. Đăng nhập sai Password 3 lần thì tự đóng form

Để làm được việc này ta cần đếm số lần đăng nhập sai, ta khai báo 1 biến toàn cục ở đầu Module tên intCountLogin
Mã:
Public intCountLogin As Integer
Sau đó ta cho cộng dồn biến này mỗi lần đăng nhập sai ở sự kiện nút Đăng nhập, Dòng code số 9,10,11
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean

'//CHECK THONG TIN ID VA PASSWORD
If tbID.Value = "admin" And tbPW.Value = "admin" Then
    ckID = True
Else

    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False

    MsgBox "Ban da nhap sai tai khoan hoac Password"
    Exit Sub
End If

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
End If

End Sub
2. Nhấn Enter để thực hiện nhanh nút Đăng nhập và nút Exit sẽ thoát form
Thay vì chọn Đăng nhập, theo thói quen người Enter sẽ thuận tiện hơn.
Chọn vào nút Đăng nhập > Default > True
Bạn cần đăng nhập để thấy hình ảnh


Tương tự đối với nút Exit
Chọn nút Huỷ bỏ > Cancel > True
Bạn cần đăng nhập để thấy hình ảnh


3. Cảnh báo người dùng khi nhập thiếu thông tin đăng nhập
Ta sẽ thêm 1 điều kiện If thông tin đăng nhập trước khi kiểm tra thông tin, ta sẽ thêm đoạn code dòng 4-8
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean

'//BAY LOI NHAP THIEU THONG TIN
If tbID.Value = "" Or tbPW.Value = "" Then
    MsgBox "Ban chua nhap du thong tin dang nhap", vbInformation
    Exit Sub
Else

'//CHECK THONG TIN ID VA PASSWORD
If tbID.Value = "admin" And tbPW.Value = "admin" Then
    ckID = True
End if

    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False

    MsgBox "Ban da nhap sai tai khoan hoac Password", vbInformation
    Exit Sub
End If

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
End If

End Sub
VÀ ĐÂY LÀ KẾT QUẢ
Bạn cần đăng nhập để thấy hình ảnh
 
Sửa lần cuối bởi điều hành viên:
D

Deleted member 1392

Guest
Đưa thông tin đăng nhập lên Sheet và phân quyền Admin

Đưa thông tin lên sheet sẽ giúp có Admin có thể dễ dàng quản lý các tài khoản User hơn.

Bước 1: Tạo 1 sheet mới, đặt tên ví dụ như Setting, Tạo một bảng để lưu trữ thông tin đăng nhập, bảng này chỉ bao gồm các tài khoản User, tài khoản Admin sẽ được đặt trong code
Bạn cần đăng nhập để thấy hình ảnh


Bước 2: Ta sẽ khai báo 2 từ gợi nhớ ở đầu Module giúp để dễ dàng gọi đến khi cần
Mã:
Public Const strPW As String = "1" '//PASSWORD ADMIN
Public Const SHEET_SETTING As String = "Setting" '//TEN SHEET SETTING
Bước 3: 2 Sub hiện toàn bộ Sheet và siêu ẩn toàn bộ Sheet chỉ chừa lại sheet Home:
Mã:
Public Sub ShowAllWS()
    Dim WS As Worksheet

    For Each WS In ThisWorkbook.Worksheets
        'HIEN TOAN BO SHEET
        WS.Visible = xlSheetVisible
    Next WS
End Sub
Mã:
Public Sub HideAllWS()
    Dim WS As Worksheet
  
    '//BẪY LỖI - BUỘC HIỆN SHEET HOME
    On Error Resume Next
    ThisWorkbook.Sheets("Home").Visible = xlSheetVisible
    On Error GoTo 0
  
    For Each WS In ThisWorkbook.Worksheets
        If WS.Name <> "Home" Then
            If WS.Visible = xlSheetVisible Then
                WS.Visible = xlSheetVeryHidden
            End If
        End If
    Next WS
End Sub
Bước 4: Vì Sheet Setting chứa thông tin đăng nhập. Nên khi đăng nhập bằng tài khoản User, Sheet Setting sẽ không được hiện, chỉ hiện khi đăng nhập bằng tài khoản Admin.

Vì lý do đó, Ta cần ẩn Sheet Setting trước khi đóng file và chỉ hiện lại khi đăng nhập bằng tài khoản admin. Nghĩ đến đây, ta cần chắc chắn code chỉ được thực thi khi file được đóng thật sự. Đến đây, bạn cần đọc bài viết

Code sau đây sẽ được đặt trong Thisworkbook
Mã:
Private WorkbookClosing As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  WorkbookClosing = True
End Sub

Private Sub Workbook_Deactivate()
  On Error Resume Next
  If WorkbookClosing And ThisWorkbook.Name = ActiveWindow.Caption Then
    Workbook_Closing
  Else
    WorkbookClosing = False
  End If
End Sub

Private Sub Workbook_Closing()
  Call HideAllWS
End Sub
Nút Login sẽ được thêm sự kiện hiện Sheet khi đăng nhập, code đóng 19, 27 được thêm.
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean
Dim arrID As Variant
Dim i As Long

'//BAY LOI NHAP THIEU THONG TIN
If tbID.Value = "" Or tbPW.Value = "" Then
    MsgBox "Ban chua nhap du thong tin dang nhap", vbInformation
    Exit Sub
End If

'//CHECK THONG TIN ID VA PASSWORD
arrID = ThisWorkbook.Sheets("Setting").Range("A3:B30").Value
For i = LBound(arrID, 1) To UBound(arrID, 1)

    '//NEU DANG NHAP LA ADMIN
    If tbID.Value = "admin" And tbPW.Value = strPW Then
        ckID = True
        Call ShowAllWS
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = True
        Exit For
    End If
  
    '//NEU DANG NHAP BANG USER
    If tbID.Value = CStr(arrID(i, 1)) And tbPW.Value = CStr(arrID(i, 2)) Then
        ckID = True
        Call ShowAllWS
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = xlVeryHidden
        Exit For
    End If
Next i

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
Else
    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False
  
    MsgBox "Ban da nhap sai tai khoan hoac Password", vbInformation
    Exit Sub
End If

End Sub
Link tải file mẫu:
 
D

Deleted member 1392

Guest
Tạo hạn sử dụng cho tài khoản User
Để tạo được một hạn sử dụng cho User, tất nhiên ta cần tạo cho nó một bảng dữ liệu trước nhỉ.
Bạn cần đăng nhập để thấy hình ảnh


Sau đó, ta cần thực thi thêm code so sánh ngày từng user cho nút "Đăng nhập" trong Userform
Đoạn code 13: Ta thêm phân vùng cho mảng từ A3:B30 thành A3:C30
Đoạn code 28-33:
Ta xử lý thêm điều kiện ngày sử dụng cho từng User
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean
Dim arrID As Variant
Dim i As Long

'//BAY LOI NHAP THIEU THONG TIN
If tbID.Value = "" Or tbPW.Value = "" Then
    MsgBox "Ban chua nhap du thong tin dang nhap", vbInformation
    Exit Sub
End If

'//CHECK THONG TIN ID VA PASSWORD
arrID = ThisWorkbook.Sheets("Setting").Range("A3:C30").Value
For i = LBound(arrID, 1) To UBound(arrID, 1)

    '//NEU DANG NHAP LA ADMIN
    If tbID.Value = "admin" And tbPW.Value = strPW Then
        ckID = True
        Call ShowAllWS
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = True
        Exit For
    End If

    '//NEU DANG NHAP BANG USER

    If tbID.Value = CStr(arrID(i, 1)) And tbPW.Value = CStr(arrID(i, 2)) Then
    
        '//XU LY HAN DUNG USER'
        If CDate(Now) > arrID(i, 3) Then
            intCountLogin = intCountLogin + 1 '//DIEM SO LAN CLICK SAI
            MsgBox "User nay da het han dang nhap", vbCritical
            Exit Sub
        End If
    
        ckID = True
        Call ShowAllWS
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = xlVeryHidden
        Exit For
    
    End If
Next i

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
Else
    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False

    MsgBox "Ban da nhap sai tai khoan hoac Password", vbInformation
    Exit Sub
End If

End Sub
Link tải file mẫu:
Rất là đơn giản đúng không, ở bài sau ta sẽ được hướng dẫn cách phân quyền từng User cho từng Sheet cụ thể.
 
D

Deleted member 1392

Guest
Phân quyền Sheet cho mỗi User

Cũng như mọi lần, ta cần tạo một giao diện phân quyền tại sheet Setting
Tại đây, file mình có 3 sheet muốn phân quyền: Sheet1, Sheet2Sheet3.
Bạn cần đăng nhập để thấy hình ảnh

----------------------

Giờ ta cùng code nhé, đầu tiên ta cần tạo một biến đặt số cột đầu tiên chứa thông tin phân quyền sheet, như mình là cột D tất là cột số 4. Đồng thời, ta khai báo thêm 1 biến ws dạng Worksheet giúp ta thực hiện vòng lặp ở bước tiếp theo.
Bạn cần đăng nhập để thấy hình ảnh

----------------------

Đoạn hiện tất cả sheet ShowAllWS lúc đăng nhập bằng User, ta sửa thành ẩn tất cả các sheet HideAllWS. Sau đó, ta thực hiện 2 vòng lặp, 1 vòng lặp qua tất cả các Sheet và 1 vòng lặp qua vùng tên Sheet cần phân quyền. Khi tên Sheet trùng với tên Sheet phân quyền Sheet đó sẽ được hiện ra.
Bạn cần đăng nhập để thấy hình ảnh


Ở đây, các bạn hoàn toàn có thể đặt trực tiếp cho biến j chạy từ 4 tới 14 (Cột D đến cột N) nhưng việc này là không nên. Khi viết code, nếu có thể các bạn hãy cố gắng đặt vùng Input có chứa các biến ra 1 vùng riêng biệt, hạn chế việc đặt cố định biến số trong code xử lý. Khi vừa viết tất nhiên các bạn vẫn cho ra kết quả đúng, nhưng khi lâu dài có sửa đổi code thì các bạn sẽ hiểu đây là một cơn ác mộng.

Và cuối cùng ta có code tổng cho nút Đăng nhập như sau
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean
Dim arrID As Variant
Dim i, j, iCountSheet As Long
Dim ws As Worksheet

'//INPUT
iCountSheet = 4 '//SO COT BAT DAU CO CHUA SHEET PHAN QUYEN
arrID = ThisWorkbook.Sheets("Setting").Range("A3:N30").Value '//MANG CHUA THONG TIN DANG NHAP

'//BAY LOI NHAP THIEU THONG TIN
If tbID.Value = "" Or tbPW.Value = "" Then
    MsgBox "Ban chua nhap du thong tin dang nhap", vbInformation
    Exit Sub
End If

'//CHECK THONG TIN ID VA PASSWORD
For i = LBound(arrID, 1) To UBound(arrID, 1)

    '//NEU DANG NHAP LA ADMIN
    If tbID.Value = "admin" And tbPW.Value = strPW Then
        ckID = True
     
        '//HIEN TAT CA SHEET
        Call ShowAllWS
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = True
        Exit For
    End If
 
    '//NEU DANG NHAP BANG USER
 
    If tbID.Value = CStr(arrID(i, 1)) And tbPW.Value = CStr(arrID(i, 2)) Then
        If CDate(Now) > arrID(i, 3) Then
            intCountLogin = intCountLogin + 1 '//DIEM SO LAN CLICK SAI
            MsgBox "User nay da het han dang nhap", vbCritical
            Exit Sub
        End If
     
        '//An TAT CA SHEET
        Call HideAllWS
     
        '//HIEN SHEET PHAN QUYEN
        For Each ws In ThisWorkbook.Worksheets
            For j = iCountSheet To UBound(arrID, 2)
                If arrID(i, j) = vbEmpty Then Exit For
             
                If ws.Name = arrID(i, j) Then
                    ws.Visible = xlSheetVisible
                End If
             
            Next j
        Next ws
 
        ckID = True
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = xlVeryHidden
        Exit For
     
    End If
Next i

'//XU LY
If ckID = True Then
 
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
Else
    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False
 
    MsgBox "Ban da nhap sai tai khoan hoac Password", vbInformation
    Exit Sub
End If

End Sub
Và đây là kết quả của chúng ta
Bạn cần đăng nhập để thấy hình ảnh




Hãy thử làm theo mình, và cho mình biết bạn có làm được không?. Nếu có khó khăn gì thì cứ tạo topic mới tab links top này vào và đặt câu hỏi nhé. Mình sẽ giải đáp những gì mình biết.
 
D

Deleted member 1392

Guest
Tinh chỉnh giao diện đăng nhập
Bạn cần đăng nhập để thấy hình ảnh

Ta thiết kế giao diện lại như hình. Ở đây, ta thấy có hình con mắt có thể ẩn hiện Password, và một nút Lưu đăng nhập. Nút lưu này hoạt động lưu đăng nhập riêng lẻ trên từng máy tính. Vậy làm sao ta có thể làm được như vậy?. Mình sẽ hướng dẫn ngay đây.

-------------------------------------------------------------------------
Ẩn hiện mật khẩu
Thực tế, ẩn hiện này 2 Icon khác biệt, nhấn nút này nút kia ẩn và nhấn nút kia nút này ẩn.
Bạn cần đăng nhập để thấy hình ảnh

Các hình ảnh này được thêm bằng công cụ Image có sẵn trong Toolbox
Bạn cần đăng nhập để thấy hình ảnh

Các Icon này cũng dễ dàng tìm thấy trong công cụ Icon có sẵn của Excel, ta chỉ cần chèn thêm Icon từ công cụ Icon có sẵn của Excel rồi Save as nó ra ngoài với định dạng gif.
Bạn cần đăng nhập để thấy hình ảnh

Bạn cần đăng nhập để thấy hình ảnh

Ta sẽ đặt tên cho 2 nút này như sau, mình sẽ gọi dân giả là nút mở mắt là nhắm mắt nhé
- Mở mắt: imUnHide
- Nhắm mắt: imHide

Khi click vào nút Mở mắt, nút imUnhide sẽ ẩn đi, nút imHide sẽ hiện lên. Đồng thời, thuộc tính PasswordChar cuar Textbox Mật khẩu sẽ bị loại bỏ, và ngược lại đối với nút Nhắm mắt
Mã:
Private Sub imHide_Click()
imHide.VISIBLE = False
imUnHide.VISIBLE = True
tbPW.PasswordChar = "*"
End Sub

Private Sub imUnHide_Click()
imUnHide.VISIBLE = False
imHide.VISIBLE = True
tbPW.PasswordChar = ""
End Sub
Bên cạnh đó, khi mở form cả 2 icon Mở mắt và Nhắm mắt sẽ cùng hiện một lúc là không được, nên ta sẽ thiết lập mặc định khi mở là Icon Nhắm mắt sẽ ẩn đi. Sau đó kéo 2 Icon này về chung 1 vị trí là xong.
Bạn cần đăng nhập để thấy hình ảnh


Link download demo:
Bài sau ta sẽ học cách để làm code cho nút Lưu đăng nhập
 
D

Deleted member 1392

Guest
Lưu đăng nhập
Bạn cần đăng nhập để thấy hình ảnh

Việc lưu đăng nhập phải được đảm bảo lưu trên từng máy thay vì trên File, tránh việc người này mà lại dùng tài khoản người kia. Trong bài viết này ta sẽ giải quyết bài toán này, tưởng phước tạp nhưng hóa ra rất đơn giản đấy.
--------------------------------------------------------------------------------

Nguyên lý check kiểm tra của tính năng Lưu đăng nhập như sau:
Bạn cần đăng nhập để thấy đính kèm

Khi nhấn nút đăng nhập mà có check Lưu đăng nhập, ta sẽ lưu 1 tiệp .txt có chứa thông tin tài khoản vừa dc nhập theo cấu trúc như bên dưới tại thư mục Temp của máy tính. Nếu không chọn Lưu đăng nhập, ta sẽ xóa file .txt đi.
ID|Password

Khi mở file, ta sẽ check sự tồn tại file txt trong thư mực Temp. Nếu có, ta sẽ lấy dữ liệu trong file và tách ID, Password nhập vào Form.

Bạn cần đăng nhập để thấy hình ảnh

Để tạo được các file txt thì ta cần dương nhiên phải dùng FSO rồi. Dành cho bạn nào chưa biết FSO là gì thì có thể tham khảo thêm .

Bạn cần đăng nhập để thấy hình ảnh

Khi mở file, ta cần code đọc và xử lý file txt

Vậy tổng kết lại ta sẽ có code như sau
Code cho nút Đăng nhập
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean
Dim arrID As Variant
Dim i, j, iCountSheet As Long
Dim ws As Worksheet
Dim FSO, oFile As Object
Dim vPathID As String

Set FSO = CreateObject("Scripting.FileSystemObject")

'//CHECK LUU THONG TIN DANG NHAP
vPathID = Environ("Temp") & "\ID_Login.txt"

If ckLuuDangNhap.Value = True Then
    '//NEU LUU DANG NHAP
    Set oFile = FSO.CreateTextFile(vPathID)
    oFile.Write tbID.Value & "|" & tbPW.Value
    oFile.Close
Else
    '//NEU KHONG LUU DANG NHAP
    If FSO.FileExists(vPathID) Then FSO.GetFile(vPathID).Delete
End If

'//INPUT
iCountSheet = 4 '//SO COT BAT DAU CO CHUA SHEET PHAN QUYEN
arrID = ThisWorkbook.Sheets("Setting").Range("A3:N30").Value '//MANG CHUA THONG TIN DANG NHAP

'//BAY LOI NHAP THIEU THONG TIN
If tbID.Value = "" Or tbPW.Value = "" Then
    MsgBox "Ban chua nhap du thong tin dang nhap", vbInformation
    Exit Sub
End If

'//CHECK THONG TIN ID VA PASSWORD
For i = LBound(arrID, 1) To UBound(arrID, 1)

    '//NEU DANG NHAP LA ADMIN
    If tbID.Value = "admin" And tbPW.Value = strPW Then
        ckID = True
      
        '//HIEN TAT CA SHEET
        Call ShowAllWS
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = True
        Exit For
    End If
  
    '//NEU DANG NHAP BANG USER
  
    If tbID.Value = CStr(arrID(i, 1)) And tbPW.Value = CStr(arrID(i, 2)) Then
        If CDate(Now) > arrID(i, 3) Then
            intCountLogin = intCountLogin + 1 '//DIEM SO LAN CLICK SAI
            MsgBox "User nay da het han dang nhap", vbCritical
            Exit Sub
        End If
      
        '//An TAT CA SHEET
        Call HideAllWS
      
        '//HIEN SHEET PHAN QUYEN
        For Each ws In ThisWorkbook.Worksheets
            For j = iCountSheet To UBound(arrID, 2)
                If arrID(i, j) = vbEmpty Then Exit For
              
                If ws.Name = arrID(i, j) Then
                    ws.Visible = xlSheetVisible
                End If
              
            Next j
        Next ws
  
        ckID = True
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = xlVeryHidden
        Exit For
      
    End If
Next i

'//XU LY
If ckID = True Then
  
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
Else
    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False
  
    MsgBox "Ban da nhap sai tai khoan hoac Password", vbInformation
    Exit Sub
End If

Set FSO = Nothing
Set oFile = Nothing

End Sub
Code cho sự kiện mở form
Mã:
Private Sub UserForm_Initialize()
Dim FSO, oFile As Object
Dim vPathID As String
Dim myFile As String, sText As String

Set FSO = CreateObject("Scripting.FileSystemObject")

'//CHECK LUU THONG TIN DANG NHAP
vPathID = Environ("Temp") & "\ID_Login.txt"

'//NEU CO LUU DANG NHAP
If FSO.FileExists(vPathID) Then
    '//MO VA DOC FILE TXT
    Open vPathID For Input As #1
    Line Input #1, sText
    Close #1
    tbID.Value = Left(sText, InStr(1, sText, "|") - 1)
    tbPW.Value = Mid(sText, InStr(1, sText, "|") + 1, Len(sText))
  
    '//DAT TRUE CHECKBOX LUU DANG NHAP
    ckLuuDangNhap.Value = True
End If

'//AN FILE EXCEL
Windows(ThisWorkbook.Name).Visible = False
imHide.Visible = False

End Sub
Link file demo:
Qua bài viết mình tin rằng các bạn có thể hiểu hơn về việc dùng tính năng lưu đăng nhập cho Form đăng nhập. Trong bài viết tiếp theo, ta sẽ tìm hiểu cách một tài khoản Admin có thể chỉnh sửa thông tin đăng nhập các User bằng Online mà không cần mở file. Nghe khá là hấp dẫn nhỉ, bài tới ta sẽ biết cách làm ngay thôi.
 
D

Deleted member 1392

Guest
Tạo thông tin đăng nhập Online
Bạn cần đăng nhập để thấy hình ảnh

Chúng ta có thể thay đổi thông tin User, mật khẩu, phân quyền mà không cần trực tiếp mở file. Vậy cách làm như thế nào, chúng ta sẽ vào bài hướng dẫn ngay bây giờ.
-------------------------------------------------------------------------------------------------------------------

Nguyên lý hoạt động
Chúng ta sẽ liên kết bảng Setting với dữ liệu trên Google Sheet. Mỗi khi mở file, dữ liệu từ Google Sheet sẽ được kéo, từ đó làm thông tin đăng nhập cho file.

Việc đầu tiên, các bạn cần tạo 1 file Google Sheet với cấu trúc tương tự như cấu trúc bảng ở Sheet Setting.
Bạn cần đăng nhập để thấy đính kèm


Ta Copy dường link dẫn của file ở trên và thêm dòng
Mã:
/export?format=csv
Cụ thể, đối với file của mình thì link sẽ là
Bạn cần đăng nhập để thấy đính kèm

Mã:
https://docs.google.com/spreadsheets/d/1-Bl5xz2E-evpgCNoLyphlDZRrQ7234ru3KLwrJBHdho/export?format=csv
Đường dẫn này sẽ tải file này về dưới định dạng file CSV. Copy đường link này lại.

Vào Data > Form Web > Paste link vào > OK > OK
Bạn cần đăng nhập để thấy đính kèm


Lúc này, Excel sẽ tạo ra 1 Sheet mới tên export_format=csv. Copy toàn bộ vùng dữ liệu của Sheet đó Paste vào bảng chứa thông tin đăng nhập ở Sheet Setting.
Bạn cần đăng nhập để thấy đính kèm


Chọn một ô thuộc vùng chứa dữ liệu bảng > Query > Properties > Enable background refresh ☑ Refresh data when opening the file
Bạn cần đăng nhập để thấy đính kèm


Ta vào Module, sửa code chỗ mở file tại sự kiện Auto _ Open. Thêm nạp Google Sheet trước mở form đăng nhập
Mã:
Public Sub Auto_Open()
Dim oledb As OLEDBConnection
Set oledb = ThisWorkbook.Connections("Query - export?format=csv").OLEDBConnection
On Error Resume Next
oledb.Refresh
On Error Goto 0
UfLogin.Show
End Sub
Link download demo:

Một vài lưu ý:
1. Đây là cách truyền dữ liệu 1 chiều. Có nghĩ là, khi áp dụng cách này thì ta chỉ có thể chỉnh sửa thông tin đăng nhập Online trên Google Sheet, không thể chỉnh sửa trực tiếp trong file được nữa. Mọi người nên cân nhắc sử dụng cho những trường hợp thích hợp.
2. Cách này buộc máy tính sử dụng phải kết nối Internet, nếu không sẽ vẫn sử dụng thông tin đăng nhập cũ.

---------------------------------------------------------------------------

Trên đây là những hướng dẫn của mình về cách sử dụng Google Sheet làm thông tin đăng nhập Online cho file Excel. Các bạn có biết cách nào hay hơn không thì cho mình biết nhé.
 

Tố Quynh

Yêu THVBA
Hi bạn,
Trong file Login 6 và 7 mình thấy có form "Thay đổi mật khẩu" nhưng không thấy hướng dẫn cách viết.
Bạn hỗ trợ thêm được không ạ?
Cảm ơn bạn :)
 

tuhocvba

Administrator
Thành viên BQT
Hi bạn,
Trong file Login 6 và 7 mình thấy có form "Thay đổi mật khẩu" nhưng không thấy hướng dẫn cách viết.
Bạn hỗ trợ thêm được không ạ?
Cảm ơn bạn :)
Thông tin ủng hộ diễn đàn:
Tài khoản Ngân hàng thương mại cổ phần Ngoại thương Việt Nam Vietcombank, số tài khoản: 0011003264055
Chi nhánh Quận Hoàn Kiếm, Hà Nội.
Chủ tài khoản: Phạm Minh Hoàng.
 

Euler

Administrator
Thành viên BQT
Topic này những người mới học VBA thì cảm thấy háo hức. Nhưng khi tạo form đăng nhập thì một vấn đề phát sinh là bản thân file Excel này mức độ bảo mật tới đâu, vì nếu không bảo mật được, người ta phá ra coi code thì mọi cái ở trên là vô tác dụng.
 
Giới thiệu
Chào các bạn, phân quyền là đăng nhập là một chủ đề vừa mới vừa cũ. Cũ là hầu như ai cũng biết VBA có thể làm được màn hình đăng nhập, mới là chưa có một hệ thống tài liệu nào giúp chúng ta có thể làm được một form đăng nhập hoàn chỉnh từ cơ bản đến nâng cao.

Nâng cao ở đây có thể hiểu là:
- Phân quyền từng User cho từng Sheet, từng cột cụ thể.
- Chỉ tài khoản Admin mới có thể phân quyền, chỉnh sửa thông tin đăng nhập cho các User.
- Tạo thời gian sử dụng cho file, khi hết hạn thì chỉ có đăng nhập tài khoản Admin mới gia hạn được.
- Tài khoản Admin có thể tạo mới, chỉnh sửa thông tin đăng nhập cho các User bằng hình thức Online, không cần mở file.
- Bảo mật hơn với các công cụ ẩn Module, khoá UnView.
- Khắc phục các lỗi khi đang mở nhiều file, tắt mở làm ảnh hưởng các file không liên quan.
...

Phân quyền có thể được dùng cho nhiều trường hợp, đặc biệt là trong trường hợp nhiều người cùng sử dụng 1 file Excel, hạn chế phân mảng dữ liệu 1 người 1 file, việc phân quyền là cần thiết.

Tuy nhiên, nếu xét về phương diện bảo mật thì mình cũng khẳng định là không đảm bảo. Chúng ta dùng phương thức phân quyền đăng nhập để công việc của chúng ta được thuận tiện, giảm phân mảnh dữ liệu và thuận tiện xử lý khi tổng hợp.

Mình sẽ hướng dẫn các bạn một cách dễ hiểu nhất có thể, để làm sao ai trong số chúng ta đều có thể làm theo được. Nào, giờ ta cùng vào phần nội dung.

Cách tạo một màn hình đăng nhập cơ bản
Bước 1:
Tạo một Userform mới và thiết kế một màn hình đăng nhập, bước này nếu các bạn không rõ có thể xem lại loạt bài hướng dẫn tạo Userform
Bạn cần đăng nhập để thấy hình ảnh


Ở đây, mình sẽ đặt tên các Controls như sau:
Label
- ĐĂNG NHẬP: lbLogin
- Tài Khoản: lbID
- Password: lbPW
Textbox
- Tài khoản: tbID
- Password: tbPW
Button
- Đăng nhập: btLogin
- Huỷ bỏ: btClose

Các bạn cũng nên tập thói quen đặt tên các Control khi thêm vào Userform, việc này sẽ giúp các bạn dễ định dang khi viết code đồng thời cũng dễ quản lý. Chứ viết code mà Textbox1, Textbox2... Mới thì hiểu, đợi khi 3 tháng sau quay lại nhìn code thì chỉ có "ngáo" thôi :)

Bước 2: Nhập mật khẩu thì phải hiện chữ * chứ nhỉ
Chọn Textbox Pasword > PasswordChar > *
Bạn cần đăng nhập để thấy hình ảnh


Bước 3: Giờ ta code thôi
Code khi mở form
Mã:
Private Sub UserForm_Initialize()
'//AN FILE EXCEL
Windows(ThisWorkbook.Name).Visible = False
End Sub
Code nút Đăng nhập
ID:
admin - Password: admin
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean

'//CHECK THONG TIN ID VA PASSWORD
If tbID.Value = "admin" And tbPW.Value = "admin" Then
    ckID = True
Else
    MsgBox "Ban da nhap sai tai khoan hoac Password"
    Exit Sub
End If

'//XU LY
If ckID = True Then
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
End If

End Sub
Code nút Huỷ bỏ
Mã:
Private Sub btClose_Click()
'//DONG FOMR
Unload Me

'//DONG FILE
ThisWorkbook.Close False
End Sub
Bước 4: Tự mở form khi mở file
Cho đoạn code sau vào Thisworkbook là xong :)
Mã:
Public Sub Auto_Open()
UfLogin.Show
End Sub
Và đây là kết quả, quá đơn giản đúng không nào.
Bạn cần đăng nhập để thấy hình ảnh


Trên đây là cách chúng ta có thể tạo 1 form đăng nhập cơ bản. Trong các bài tiếp theo, chúng ta sẽ tìm hiểu cách tinh chỉnh nhiều tính năng hơn cho form đăng nhập này.
Anh chị giúp em phần PasswordChar với ạ.
Khi em chỉnh thành dấu * thì không nhập được dữ liệu vào textbox :( Chỉ nhập được bình thường khi em bỏ trống.
 

Tranhungtq

Yêu THVBA
Lưu đăng nhập
Bạn cần đăng nhập để thấy hình ảnh

Việc lưu đăng nhập phải được đảm bảo lưu trên từng máy thay vì trên File, tránh việc người này mà lại dùng tài khoản người kia. Trong bài viết này ta sẽ giải quyết bài toán này, tưởng phước tạp nhưng hóa ra rất đơn giản đấy.
--------------------------------------------------------------------------------

Nguyên lý check kiểm tra của tính năng Lưu đăng nhập như sau:
Bạn cần đăng nhập để thấy đính kèm

Khi nhấn nút đăng nhập mà có check Lưu đăng nhập, ta sẽ lưu 1 tiệp .txt có chứa thông tin tài khoản vừa dc nhập theo cấu trúc như bên dưới tại thư mục Temp của máy tính. Nếu không chọn Lưu đăng nhập, ta sẽ xóa file .txt đi.
ID|Password

Khi mở file, ta sẽ check sự tồn tại file txt trong thư mực Temp. Nếu có, ta sẽ lấy dữ liệu trong file và tách ID, Password nhập vào Form.

Bạn cần đăng nhập để thấy hình ảnh

Để tạo được các file txt thì ta cần dương nhiên phải dùng FSO rồi. Dành cho bạn nào chưa biết FSO là gì thì có thể tham khảo thêm .

Bạn cần đăng nhập để thấy hình ảnh

Khi mở file, ta cần code đọc và xử lý file txt

Vậy tổng kết lại ta sẽ có code như sau
Code cho nút Đăng nhập
Mã:
Private Sub btLogic_Click()
Dim ckID As Boolean
Dim arrID As Variant
Dim i, j, iCountSheet As Long
Dim ws As Worksheet
Dim FSO, oFile As Object
Dim vPathID As String

Set FSO = CreateObject("Scripting.FileSystemObject")

'//CHECK LUU THONG TIN DANG NHAP
vPathID = Environ("Temp") & "\ID_Login.txt"

If ckLuuDangNhap.Value = True Then
    '//NEU LUU DANG NHAP
    Set oFile = FSO.CreateTextFile(vPathID)
    oFile.Write tbID.Value & "|" & tbPW.Value
    oFile.Close
Else
    '//NEU KHONG LUU DANG NHAP
    If FSO.FileExists(vPathID) Then FSO.GetFile(vPathID).Delete
End If

'//INPUT
iCountSheet = 4 '//SO COT BAT DAU CO CHUA SHEET PHAN QUYEN
arrID = ThisWorkbook.Sheets("Setting").Range("A3:N30").Value '//MANG CHUA THONG TIN DANG NHAP

'//BAY LOI NHAP THIEU THONG TIN
If tbID.Value = "" Or tbPW.Value = "" Then
    MsgBox "Ban chua nhap du thong tin dang nhap", vbInformation
    Exit Sub
End If

'//CHECK THONG TIN ID VA PASSWORD
For i = LBound(arrID, 1) To UBound(arrID, 1)

    '//NEU DANG NHAP LA ADMIN
    If tbID.Value = "admin" And tbPW.Value = strPW Then
        ckID = True
     
        '//HIEN TAT CA SHEET
        Call ShowAllWS
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = True
        Exit For
    End If
 
    '//NEU DANG NHAP BANG USER
 
    If tbID.Value = CStr(arrID(i, 1)) And tbPW.Value = CStr(arrID(i, 2)) Then
        If CDate(Now) > arrID(i, 3) Then
            intCountLogin = intCountLogin + 1 '//DIEM SO LAN CLICK SAI
            MsgBox "User nay da het han dang nhap", vbCritical
            Exit Sub
        End If
     
        '//An TAT CA SHEET
        Call HideAllWS
     
        '//HIEN SHEET PHAN QUYEN
        For Each ws In ThisWorkbook.Worksheets
            For j = iCountSheet To UBound(arrID, 2)
                If arrID(i, j) = vbEmpty Then Exit For
             
                If ws.Name = arrID(i, j) Then
                    ws.Visible = xlSheetVisible
                End If
             
            Next j
        Next ws
 
        ckID = True
        ThisWorkbook.Sheets(SHEET_SETTING).Visible = xlVeryHidden
        Exit For
     
    End If
Next i

'//XU LY
If ckID = True Then
 
    '//AN MAN HINH DANG NHAP
    Me.Hide

    '//HIEN LAI FILE EXCEL
    Windows(ThisWorkbook.Name).Visible = True
Else
    '//DEM SO LAN DANG NHAP SAI
    intCountLogin = intCountLogin + 1
    If intCountLogin >= 3 Then ThisWorkbook.Close False
 
    MsgBox "Ban da nhap sai tai khoan hoac Password", vbInformation
    Exit Sub
End If

Set FSO = Nothing
Set oFile = Nothing

End Sub
Code cho sự kiện mở form
Mã:
Private Sub UserForm_Initialize()
Dim FSO, oFile As Object
Dim vPathID As String
Dim myFile As String, sText As String

Set FSO = CreateObject("Scripting.FileSystemObject")

'//CHECK LUU THONG TIN DANG NHAP
vPathID = Environ("Temp") & "\ID_Login.txt"

'//NEU CO LUU DANG NHAP
If FSO.FileExists(vPathID) Then
    '//MO VA DOC FILE TXT
    Open vPathID For Input As #1
    Line Input #1, sText
    Close #1
    tbID.Value = Left(sText, InStr(1, sText, "|") - 1)
    tbPW.Value = Mid(sText, InStr(1, sText, "|") + 1, Len(sText))
 
    '//DAT TRUE CHECKBOX LUU DANG NHAP
    ckLuuDangNhap.Value = True
End If

'//AN FILE EXCEL
Windows(ThisWorkbook.Name).Visible = False
imHide.Visible = False

End Sub
Link file demo:
Qua bài viết mình tin rằng các bạn có thể hiểu hơn về việc dùng tính năng lưu đăng nhập cho Form đăng nhập. Trong bài viết tiếp theo, ta sẽ tìm hiểu cách một tài khoản Admin có thể chỉnh sửa thông tin đăng nhập các User bằng Online mà không cần mở file. Nghe khá là hấp dẫn nhỉ, bài tới ta sẽ biết cách làm ngay thôi.
Tải file của bạn về rồi. Xong giờ mình muốn copy toàn bộ file bạn vào file của mình giờ làm thế nào bạn ơi. Chỉ mình với nhé. Cảm ơn nhiều
 

newbie396

Yêu THVBA
Minh làm cách hướng dẫn của bạn mà khi mở file không hiện ô đăng nhâp bạn ơi, khắc phục như thế nào vậy bạn
 
Top