如何使用用户输入的文本框值保存或更新文本框?
例如,我有一个带有文本框的“密码”用户窗体。每个打开文件的用户都将在该文本框中输入自己的密码,然后保存文件并在任何给定时间重新打开。
请注意,该值应永久保存在该文件中(不仅基于会话),因此,即使完全关闭并重新打开该文件,用户密码也应存在于文本框中,直到再次更改。
将值传递给单元格不是一个好主意,因为它是密码,并且不可见。
到目前为止,我使用下面的代码都无济于事。
在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的值。
谢谢
答案 0 :(得分:0)
正如我在评论中提到的那样,这是实现您想要的目标的一种不寻常的方法。您可以在模块中存储用户名/密码。
模块设置
插入模块。我们称之为MyModule
。将以下代码粘贴到此处
Option Explicit
Private Sub UserDatabase()
'USER|sid_sid_sid|PASSWORD
'
'
'
End Sub
注意:没关系,但要使其简洁明了且易于管理,请确保End Sub
之后没有空白行。
|sid_sid_sid|
是我用来将用户与密码分开的分隔符。随时更改。确保它是唯一的文本。
用户设置
我们假设您的用户表单如下
将此代码粘贴到用户表单代码区域中。文本框的名称为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
基本设置
在VBE中,单击“工具|参考”并检查Microsoft Visual Basic for Applications Extensibility 5.3
,如下所示
启用对VBA项目对象模型的信任访问。单击文件|选项。在导航窗格中,选择TRUST CENTER。单击“信任中心设置”。在导航窗格中,选择“宏设置”。确保选中Trust access to the VBA project object model
。点击确定。
现在,如果您注意到在VBA项目不受保护时这将起作用。因此,当VBA项目处于锁定状态时,我们如何使其工作。为此,请使用HERE中的代码。将所有这些代码移植到用户表单中,并且不要将该代码保留在模块中。
为提高安全性,可以先加密数据,然后再将其存储在模块中。网络上有很多关于如何在VBA中加密/解密字符串的示例。
出于演示目的,我已解锁VBA。
示例文件:可以从HERE
下载文件