我在Excel中有一个用户表单,所有文本框都有控件提示文本。由于我在许多Excel工作簿中都重复使用了许多文本框和控件提示文本,因此发现在设置表中编辑文本然后使用宏将表单中的文本分配给表单上的控件更加容易。这给了我使用查找和替换的好处,并且与使用属性菜单相比,在工作表中编辑文本更容易。宏为控件分配提示文本,如下所示:
With formSettings
.textBox1.ControlTipText = Sheets("Settings").Cells(4, 12).Text
End With
但是这种行为很奇怪。当我运行宏然后从界面打开表单时,我看到分配给控件的新控件提示文本。但是,如果我关闭该窗体并重新打开它,它将重置为上一个控件提示文本。知道为什么会这样吗?我已经尝试过在打开表单之前进行保存以及保存,关闭工作簿然后重新打开的尝试,但是我似乎无法弄清楚为什么它先分配了控件提示文本然后还原。
我知道我可以通过在UserForm_Initialize子项中分配新文本来在运行时强制输入新文本,但我不希望这样做,因为那样会增加效率低下的一层。
答案 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.vbFormControlMenu
和UserForm1.Show的文章,深入探讨了这些主题。