Excel用户窗体不断重置控件提示文本

时间:2019-07-10 18:00:58

标签: excel vba

我在Excel中有一个用户表单,所有文本框都有控件提示文本。由于我在许多Excel工作簿中都重复使用了许多文本框和控件提示文本,因此发现在设置表中编辑文本然后使用宏将表单中的文本分配给表单上的控件更加容易。这给了我使用查找和替换的好处,并且与使用属性菜单相比,在工作表中编辑文本更容易。宏为控件分配提示文本,如下所示:

With formSettings
    .textBox1.ControlTipText = Sheets("Settings").Cells(4, 12).Text
End With

但是这种行为很奇怪。当我运行宏然后从界面打开表单时,我看到分配给控件的新控件提示文本。但是,如果我关闭该窗体并重新打开它,它将重置为上一个控件提示文本。知道为什么会这样吗?我已经尝试过在打开表单之前进行保存以及保存,关闭工作簿然后重新打开的尝试,但是我似乎无法弄清楚为什么它先分配了控件提示文本然后还原。

我知道我可以通过在UserForm_Initialize子项中分配新文本来在运行时强制输入新文本,但我不希望这样做,因为那样会增加效率低下的一层。

1 个答案:

答案 0 :(得分:2)

您缺少实例的概念。 UserForm是一个类,并且类定义 object 的形状/界面。 UserForm的特殊之处在于1)它具有视觉设计器,以及2)具有隐藏的VB_PredeclaredId属性设置为True,这意味着该类具有 default实例

执行此操作时:

UserForm1.Show

您正在针对表单的默认实例调用Show方法。关闭该窗体后,该对象将被破坏...直到下次您引用默认的UserForm1默认实例时,该对象将再次自动创建。

  

我知道我可以通过在UserForm_Initialize子项中分配新文本来在运行时强制输入新文本,但我不希望这样做,因为这会增加一层效率低下的内容。

一点也不。某些地方需要初始化表单。如果您需要在运行时配置表单控件,则UserForm_Initialize唯一可能的最佳位置,以启动此配置-它确保每次 表单的实例已创建,已正确初始化。对于类似UserForm1.Show的指令,处理程序在调用.方法之前在Show解除引用运算符上运行。

该对象只要存在就一直保持其状态。问题是,表单的“ X'ing-out”将破坏该对象,从而将其重置为原始的设计时状态。

您可以通过处理QueryClose事件并在Cancel参数值为{{3时,将True参数设置为CloseMode来防止表单实例自毁。 }},然后Hide创建表单而不是销毁它-当然,您也绝不应该Unload创建表单。

控制创建时间,销毁时间和销毁时间的情况下,处理UserForm变得更加简单。换句话说,当您避免使用其默认实例来存储任何状态时。

With New UserForm1 ' _Initialize handler runs
    '..setup initial form state here..
    .Show
    '..access form state here..
End With ' _Terminate handler runs, object is destroyed

我写了VbQueryClose.vbFormControlMenuUserForm1.Show的文章,深入探讨了这些主题。