VBA Excel,永久保存/更新文本框输入

时间:2019-12-06 08:03:58

标签: excel vba textbox

如何使用用户输入的文本框值保存或更新文本框?

例如,我有一个带有文本框的“密码”用户窗体。每个打开文件的用户都将在该文本框中输入自己的密码,然后保存文件并在任何给定时间重新打开。

请注意,该值应永久保存在该文件中(不仅基于会话),因此,即使完全关闭并重新打开该文件,用户密码也应存在于文本框中,直到再次更改。

将值传递给单元格不是一个好主意,因为它是密码,并且不可见。

到目前为止,我使用下面的代码都无济于事。

在UF代码中的“保存”按钮:

Private Sub CommandButton1_Click()
    SavePWStrings
    Me.Hide
End Sub

在标准模块中:

Public Sub SavePWStrings()
Dim pw As String
    pw = UserForm1.TextBox1.Value
    UserForm1.TextBox1 = pw
End Sub

目标是通过以下方式以编程方式更新TextBox的值。

谢谢

enter image description here

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的那样,这是实现您想要的目标的一种不寻常的方法。您可以在模块中存储用户名/密码。

模块设置

插入模块。我们称之为MyModule。将以下代码粘贴到此处

Option Explicit

Private Sub UserDatabase()
    'USER|sid_sid_sid|PASSWORD
    '
    '
    '
End Sub

enter image description here

注意:没关系,但要使其简洁明了且易于管理,请确保End Sub之后没有空白行。

|sid_sid_sid|是我用来将用户与密码分开的分隔符。随时更改。确保它是唯一的文本。

用户设置

我们假设您的用户表单如下

enter image description here

将此代码粘贴到用户表单代码区域中。文本框的名称为txtPassword

Option Explicit

Dim proj As VBIDE.VBProject
Dim comp As VBIDE.VBComponent
Dim codeMod As VBIDE.CodeModule
Dim lineCount As Long
Dim i As Long
Dim doNotReEnter As Boolean
Dim oldPassword As String
Dim newPassword As String

'~~> Separator for Username / Password
Private Const MySep As String = "|sid_sid_sid|"

'~~> Userform Initialize Event
Private Sub UserForm_Initialize()
    Dim currentUser As String

    '~~> Get the username
    currentUser = Environ("UserName")

    lblUser.Caption = "USER :" & currentUser

    '~~> Check if user exists
    If DoesUserExist(currentUser) Then
        '~~> If it does then get the password
        txtPassword.Text = GetUserPassword(currentUser)
        oldPassword = txtPassword.Text '<~~ Store current password in a variable
    End If
End Sub

'~~> Login button
Private Sub CommandButton1_Click()
    '~~> Get the password from the textbox
    newPassword = txtPassword.Text

    '~~> Check if they match. If they do then do not store else store
    If newPassword <> oldPassword And Len(Trim(newPassword)) <> 0 Then
        Dim modLine As String

        modLine = "    '" & Environ("UserName") & MySep & txtPassword.Text

        Set proj = ThisWorkbook.VBProject
        Set comp = proj.VBComponents("MyModule")
        Set codeMod = comp.CodeModule
        codeMod.InsertLines codeMod.CountOfLines - 1, modLine
    End If
End Sub

'~~> Function to check if the user is there in the module
Private Function DoesUserExist(xlUser As String) As Boolean
    Set proj = ThisWorkbook.VBProject
    Set comp = proj.VBComponents("MyModule")
    Set codeMod = comp.CodeModule

    lineCount = codeMod.CountOfLines

    For i = 1 To lineCount
        If codeMod.Find(xlUser, i, 1, -1, -1) Then
            DoesUserExist = True
            Exit For
        End If
    Next i
End Function

'~~> Function to get the password for a user
Private Function GetUserPassword(xlUser As String) As String
    Set proj = ThisWorkbook.VBProject
    Set comp = proj.VBComponents("MyModule")
    Set codeMod = comp.CodeModule

    lineCount = codeMod.CountOfLines

    For i = 1 To lineCount
        If codeMod.Find(xlUser, i, 1, -1, -1) Then
            GetUserPassword = Split(codeMod.Lines(i, 1), MySep)(1)
            Exit For
        End If
    Next i
End Function

基本设置

  1. 在VBE中,单击“工具|参考”并检查Microsoft Visual Basic for Applications Extensibility 5.3,如下所示

    enter image description here

  2. 启用对VBA项目对象模型的信任访问。单击文件|选项。在导航窗格中,选择TRUST CENTER。单击“信任中心设置”。在导航窗格中,选择“宏设置”。确保选中Trust access to the VBA project object model。点击确定。

    enter image description here

  3. 现在,如果您注意到在VBA项目不受保护时这将起作用。因此,当VBA项目处于锁定状态时,我们如何使其工作。为此,请使用HERE中的代码。将所有这些代码移植到用户表单中,并且不要将该代码保留在模块中。

  4. 为提高安全性,可以先加密数据,然后再将其存储在模块中。网络上有很多关于如何在VBA中加密/解密字符串的示例。


出于演示目的,我已解锁VBA。

enter image description here

示例文件:可以从HERE

下载文件