Excel VBA - 保存用户表单更改
Excel VBA - Save Userform Changes
是否可以在 Excel VBA 的用户表单中保存对 Label Caption 的更改,以便它们永久保存,并且仅在您输入新更改时更改?
我已经检查过,代码正在更改标题,但我无法坚持下去,所以下次我打开用户窗体时它仍然存在。
提前谢谢你
Private Sub cmdSubmit_Click()
'resets participants email and name
If Me.optProg.Value = True Then
Me.NameLabelProg.Caption = Me.CB_Part.Value
Me.MailLabelProg.Caption = Me.TB_Mail.Value
ElseIf Me.optTester.Value = True Then
Me.MailLabelTest.Caption = Me.CB_Part.Value
Me.NameLabelTest.Caption = Me.TB_Mail.Value
End If
End Sub
请原谅最初冗长的回答,但是通过 VBA.
对 UserForms
进行永久性更改存在一些风险
为了永久更改标签(或UserForm
或任何其他Control
的标题,您必须“Trust access to the VBA project object model
”以便通过 VBA 代码来完成。现在,虽然这是 可能 但通常 不推荐 因为它可以严重如果用户遇到为恶意目的而开发的宏,他们的 PC 将面临风险。
(如果出现问题,您的最终用户将必须在 他们的 PC 上更改此信任设置......您不能在您的 PC 上进行更改,设置代码以工作,然后将文件移交给另一个用户并使其在他们的 PC 上工作,而无需他们进行相同的更改。)
有一些方法可以以编程方式执行此操作,但是,这属于“邪恶的宏”兔子洞,需要向您进行此更改的最终用户披露。 . .研究风险自负。
如果您可以让 您自己 处于危险之中,您可以使用 VBA 来做到这一点,类似于我发现的以下代码片段 here. 您将拥有根据需要替换您的 UserForm
姓名和 Label
姓名。我自己测试了它 UserForm
并且它按预期工作。
Sub Change_Userform()
ThisDocument.VBProject.VBComponents("Userform1").Designer.Controls("Label1").Caption = "Some new caption text"
End Sub
您需要自己研究如何“信任对 VBA 项目 object 模型的访问”,并了解这样做的风险,以便上述代码正常工作。
如果我理解了您尝试正确完成的意图,您可以实现此效果,而不必将您自己或您的最终用户置于危险之中。
(大多数最终用户通常无法直接访问 VBA Designer,他们会在其中看到 UserForm's
un-initialized
环境。)为此,您需要必须将您的代码放在 UserForm's
事件中。
以下假设您的 Me.optProg.Value
和 Me.optTester.Value
是用户会更改的 Option Buttons
。如果您在文件中创建一个“设置”sheet,您可以将值放在这个sheet的单元格中,然后隐藏这样用户就不会修改他们直接。然后,在 UserForm's
启动的同时引用单元格的值并更改 Option Buttons
的外观。 (此外,您可以设置 Option Buttons
的 Click
事件来更改相同单元格的值,并提供该更改以在调用时影响 UserForm's
Initialize
事件,但是这应该会让你朝着正确的方向前进。)
Sub UserForm_Initialize()
'The Range below is completely up to you.
'Since you are using Boolean True/False, a simple "1" or "0" _
is easy to use to make the changes.
If Thisworkbook.Sheets("Some_Settings").Range("A1").Value = "1" Then
Me.optProg.Value = True
Else
Me.optTester.Value = True
End If
'do some other code here as needed to finish initializing the UserForm
If Me.optProg.Value = True Then
Me.NameLabelProg.Caption = Me.CB_Part.Value
Me.MailLabelProg.Caption = Me.TB_Mail.Value
ElseIf Me.optTester.Value = True Then
Me.MailLabelTest.Caption = Me.CB_Part.Value
Me.NameLabelTest.Caption = Me.TB_Mail.Value
End If
End Sub
查看此用户表单示例,您会找到许多问题的答案。
是否可以在 Excel VBA 的用户表单中保存对 Label Caption 的更改,以便它们永久保存,并且仅在您输入新更改时更改? 我已经检查过,代码正在更改标题,但我无法坚持下去,所以下次我打开用户窗体时它仍然存在。 提前谢谢你
Private Sub cmdSubmit_Click()
'resets participants email and name
If Me.optProg.Value = True Then
Me.NameLabelProg.Caption = Me.CB_Part.Value
Me.MailLabelProg.Caption = Me.TB_Mail.Value
ElseIf Me.optTester.Value = True Then
Me.MailLabelTest.Caption = Me.CB_Part.Value
Me.NameLabelTest.Caption = Me.TB_Mail.Value
End If
End Sub
请原谅最初冗长的回答,但是通过 VBA.
对UserForms
进行永久性更改存在一些风险
为了永久更改标签(或UserForm
或任何其他Control
的标题,您必须“Trust access to the VBA project object model
”以便通过 VBA 代码来完成。现在,虽然这是 可能 但通常 不推荐 因为它可以严重如果用户遇到为恶意目的而开发的宏,他们的 PC 将面临风险。
(如果出现问题,您的最终用户将必须在 他们的 PC 上更改此信任设置......您不能在您的 PC 上进行更改,设置代码以工作,然后将文件移交给另一个用户并使其在他们的 PC 上工作,而无需他们进行相同的更改。)
有一些方法可以以编程方式执行此操作,但是,这属于“邪恶的宏”兔子洞,需要向您进行此更改的最终用户披露。 . .研究风险自负。
如果您可以让 您自己 处于危险之中,您可以使用 VBA 来做到这一点,类似于我发现的以下代码片段 here. 您将拥有根据需要替换您的 UserForm
姓名和 Label
姓名。我自己测试了它 UserForm
并且它按预期工作。
Sub Change_Userform()
ThisDocument.VBProject.VBComponents("Userform1").Designer.Controls("Label1").Caption = "Some new caption text"
End Sub
您需要自己研究如何“信任对 VBA 项目 object 模型的访问”,并了解这样做的风险,以便上述代码正常工作。
如果我理解了您尝试正确完成的意图,您可以实现此效果,而不必将您自己或您的最终用户置于危险之中。
(大多数最终用户通常无法直接访问 VBA Designer,他们会在其中看到 UserForm's
un-initialized
环境。)为此,您需要必须将您的代码放在 UserForm's
以下假设您的 Me.optProg.Value
和 Me.optTester.Value
是用户会更改的 Option Buttons
。如果您在文件中创建一个“设置”sheet,您可以将值放在这个sheet的单元格中,然后隐藏这样用户就不会修改他们直接。然后,在 UserForm's
启动的同时引用单元格的值并更改 Option Buttons
的外观。 (此外,您可以设置 Option Buttons
的 Click
事件来更改相同单元格的值,并提供该更改以在调用时影响 UserForm's
Initialize
事件,但是这应该会让你朝着正确的方向前进。)
Sub UserForm_Initialize()
'The Range below is completely up to you.
'Since you are using Boolean True/False, a simple "1" or "0" _
is easy to use to make the changes.
If Thisworkbook.Sheets("Some_Settings").Range("A1").Value = "1" Then
Me.optProg.Value = True
Else
Me.optTester.Value = True
End If
'do some other code here as needed to finish initializing the UserForm
If Me.optProg.Value = True Then
Me.NameLabelProg.Caption = Me.CB_Part.Value
Me.MailLabelProg.Caption = Me.TB_Mail.Value
ElseIf Me.optTester.Value = True Then
Me.MailLabelTest.Caption = Me.CB_Part.Value
Me.NameLabelTest.Caption = Me.TB_Mail.Value
End If
End Sub
查看此用户表单示例,您会找到许多问题的答案。