Trong bài viết này, chúng ta sẽ học cách đưa username và password của người dùng vào VBA macro mà không để lộ các thông tin nhạy cảm trong phạm vi VBA project hoặc trang tính Excel.
Ví dụ thực tế
Giả dụ rằng John muốn tạo một trang tính được tự động hóa để 2 người đồng nghiệp của anh ấy cũng có thể sử dụng để làm việc. Trang tính này sẽ được lưu trữ trong drive của công ty để bất kì ai cũng có thể truy cập khi cần.
Ý tưởng ban đầu của John là tập hợp username và password của anh ấy và các đồng nghiệp lại và mã hóa thông tin này vào trong macro. Do đó không ai trong số họ phải đăng nhập lại mỗi khi cần.
John sử dụng biến Aray để lưu trữ tất cả thông tin đăng nhập vào trong một danh sách tương ứng với số ID trong máy tính cá nhân của họ. Mã VBA sẽ trông như sau:
Sub DatabaseLogin() ‘PURPOSE: Log into Company’s Database via Excel VBADim ID_List As Variant Dim Username_List As Variant Dim Passoword_List As Variant Dim Username As String Dim Password As String Dim x As Integer’Team Members’ Credentials ID_List = Array(“x302918”, “x294832”, “x392490”) Username_List = Array(“JohnSmith”, “JasonBorne”, “FelixHarp”) Passoword_List = Array(“ILuvMommy5”, “HulkMan123”, “IneedSleep665”)’Test for Team Memember’s ID For x = LBound(ID_List) To UBound(ID_List) If Environ(“USERNAME”) = ID_List(x) Then Username = Username_List(x) Password = Username_List(x) Exit For End If Next x ‘Unidentified User, must manually login ‘Log Into Database End Sub |
Hy vọng rằng, bên cạnh sự bẽ mặt khi phải share những password bạn tạo khi còn là học sinh thì rõ ràng là cách làm này không được ưa chuộng.
Một cách tốt hơn để bảo mật thông tin đăng nhập với VBA
Có một cách hay hơn để giải quyết vấn đề này là mỗi người sẽ lưu trữ thông tin của mình trong máy tính của họ. Để làm điều này, họ có thể đơn giản tạo một text file trong NotePad ở định dạng CSV (comma separated). Trong file này, mỗi người sẽ gõ username và password của mình (được phân cách bởi dấu phẩy) như dưới đây:
Điều cần thiết là tất cả người dùng phải lưu file với cùng một tên và cùng một vị trí trong máy tính của chính họ. Trong ví dụ này, tên file sẽ là “Credentials.txt” và nó sẽ được lưu ở trên màn hình desktop.
VBA lấy các thông tin đăng nhập từ Text File
Mã này sẽ chỉ cho bạn cách làm thế nào để lấy thông tin từ một text file với việc định mã VBA. Bạn sẽ sử dụng quy trình này để lấy thông tin đăng nhập ra khỏi textfile mà bạn đã tạo ở phần trước. Dưới đây là một mã đầy đủ và chúng ta sẽ cùng xem xét từng phần của mã.
Sub DatabaseLogin() ‘PURPOSE: Log into Company’s Database via Excel VBA & Desktop Text FileDim Username As String Dim Password As String Dim TextFile As Integer Dim FilePath As String Dim Credentials As Variant’File Path of Text File On Error Resume Next FilePath = Environ(“USERPROFILE”) & “\Desktop\Credentials.txt” On Error GoTo 0’Determine Login creditials (manual or automatic from desktop file) If FilePath = “” Then Username = Application.InputBox(“Enter In Your Username”) Password = Application.InputBox(“Enter In Your Password”) Else ‘Open the text file ‘Store file content inside array variable and determine login info ‘Close Text File End If ‘Log Into Database End Sub |
Giải thích mã VBA
Việc mã VBA này làm đầu tiên là tìm kiếm một text file cụ thể trên desktop. Bạn có thể kéo đường dẫn drive mặc định bằng cách sử dụng hàm Environ. Ví dụ, Environ(“USERPROFILE”) tương đương với C:\Users\Chris. Sau đó bạn có thể thêm phần đường dẫn folder và file name còn lại vào công thức hàm Environ để tạo thành một đường dẫn hoàn chỉnh tới các máy tính đang chạy. Lỗi sẽ xuất hiện trong dòng mã này nếu người dùng không lưu file vào vị trí cụ thể mà bạn chỉ định ( trong trường hợp này họ sẽ phải tự đăng nhập).
‘File Path of Text File On Error Resume Next FilePath = Environ(“USERPROFILE”) & “\Desktop\Credentials.txt” On Error GoTo 0 |
Tếp theo là hàm IF để xác định xem liệu thông tin có được tìm thấy trong máy tính. Nếu bạn phải tự đăng nhập thì sẽ xuất hiện một hộp thoại hỏi người dùng username và password.
‘Determine Login creditials (manual or automatic from desktop file) If FilePath = “” Then Username = Application.InputBox(“Enter In Your Username”) Password = Application.InputBox(“Enter In Your Password”) Else ‘Credentials were able to be pulled from the text file End If |
Khi mã VBA tìm thấy text file trong vị trí được chỉ định, nó sẽ mở file lấy thông tin được lưu bên trong. Tiếp theo, hàm Split sẽ phân cách chúng bởi dấu phẩy và chúng sẽ được lưu vào một dãy biến bắt đầu từ vị trí số 0. Nó sẽ trông giống như sau:
Và đây là khi ý tưởng này được mã hóa trong VBA
‘Determine the next file number available for use by the Open function TextFile = FreeFile’Open the text file Open FilePath For Input As TextFile’Store file content inside array variable and determine login info Credentials = Split(Input(LOF(TextFile), TextFile), “,”) Username = Credentials(0) Password = Credentials(1)’Close Text File Close TextFile |
Để hoàn thành quy trình đăng nhập, bạn cần biết cách đăng nhập vào database của công ty qua VBA. Cái này thường nằm ở phần tài liệu API củả database . Dưới đây là một vài link ví dụ của các tài liệu kinh doanh phổ biến – chỉ bạn cách kết nối vào Excel với VBA.