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.ValueMe.optTester.Value 是用户会更改的 Option Buttons。如果您在文件中创建一个“设置”sheet,您可以将值放在这个sheet的单元格中,然后隐藏这样用户就不会修改他们直接。然后,在 UserForm's 启动的同时引用单元格的值并更改 Option Buttons 的外观。 (此外,您可以设置 Option ButtonsClick 事件来更改相同单元格的值,并提供该更改以在调用时影响 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

查看此用户表单示例,您会找到许多问题的答案。

Source of userform