【问题标题】:Excel VBA - Save Userform ChangesExcel VBA - 保存用户表单更改
【发布时间】:2021-11-20 00:34:47
【问题描述】:

是否可以在 Excel VBA 的用户窗体中保存对标签标题的更改,以便它们永久保存,并且仅在您输入新更改时才更改? 我已经检查过,代码正在更改标题,但我无法让它粘贴,因此下次打开用户窗体时它仍然存在。 提前谢谢你

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

【问题讨论】:

  • 欢迎您!这是用于 Excel VBA 的吗?如果是这样,我会尽快更新您的问题并为您提供答案。
  • @k1dfr0std 是的,这是用于 excel vba
  • 感谢您的澄清 - 我知道问题本身列出了它,但标签不匹配 - 更新了标签并提出了答案。如果您有任何问题,请告诉我。如果以下内容对您有用,或者您需要更多说明,我会尽我所能为您提供帮助。
  • 您可以让 Excel 在表单加载时在工作表上查找一个值,并将该值应用于标签标题。编辑:刚刚注意到@k1dfr0std 在他的回答末尾建议的内容 - 抱歉,停止阅读答案,因为它正在修改设计时设置的内容。
  • @Darren,是的 - OP 最初的问题是永久执行此操作,以便在用户查看 UserForm 时完成更改(假设没有 Initialize 事件做任何事情),但这是一个风险,所以我提供了两种选择

标签: excel vba userform


【解决方案1】:

请先原谅冗长的答案,但通过 VBA 对 UserForms 进行永久性更改存在一些风险。

要永久更改标签的标题(或UserForm 或任何其他Control,您必须使用“Trust access to the VBA project object model”才能通过 VBA 代码进行更改。现在,虽然这是可能,但通常不推荐,因为如果用户遇到为邪恶目的开发的宏,它可能会严重危及用户的 PC。

(为了在出现问题时进行澄清,您的最终用户也必须在他们的 PC 上进行此信任设置更改...您不能在您的 PC 上进行更改,设置代码以使其正常工作,然后将文件移交给其他用户并使其在他们的 PC 上运行,而无需他们进行相同的更改。)

有一些方法可以以编程方式执行此操作,但是,这属于“邪恶的宏”兔子洞,需要向您进行此更改的最终用户披露。 . .研究风险自负。

如果您愿意将自己置于危险之中,您可以使用类似于以下 sn-p 我发现 here. 的 VBA 来完成此操作,您将不得不替换您的 UserForm 名称和 @ 987654329@ 适当的名称。我在自己的UserForm 上对其进行了测试,它按预期工作。

Sub Change_Userform()
  ThisDocument.VBProject.VBComponents("Userform1").Designer.Controls("Label1").Caption = "Some new caption text"
End Sub

您需要自己对如何“信任对 VBA 项目对象模型的访问”进行一些研究,并了解这样做的风险才能使上述代码正常工作。

如果我理解您尝试正确完成的意图,您可以实现此效果,而无需将自己或您的最终用户置于危险之中。

(大多数最终用户通常无法直接访问 VBA 设计器,在那里他们会看到 UserForm's un-initialized 环境。)为此,您必须将代码放在 UserForm's 事件。

以下假设您的Me.optProg.ValueMe.optTester.ValueOption Buttons,用户将更改它们。如果您在文件中创建“设置”表,您可以将值放置在此表的单元格中,然后隐藏,这样用户就不会直接修改它们。然后,引用单元格的值并在启动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

【讨论】:

  • 谢谢,我找到了一个不同的解决方案,我使用工作表上的隐藏标签作为中介,然后使用 ´´thisworkbook.save´´´ 进行保存。之后就是简单的 userfrom initialize()
  • 太棒了!这也有效 - 很高兴您找到了解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多