首页 > 解决方案 > Excel 用户表单不断重置控制提示文本

问题描述

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

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

但行为很奇怪。当我运行宏然后从界面打开表单时,我看到分配给控件的新控件提示文本。但如果我关闭表单并重新打开它,它会重置回之前的控制提示文本。知道为什么会这样吗?我曾尝试在打开表单之前保存以及保存、关闭工作簿然后重新打开,但我似乎无法弄清楚为什么它分配控制提示文本然后恢复。

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

标签: excelvba

解决方案


您缺少instance的概念。AUserForm是一个类,类定义对象的形状/接口。a 的特别之处UserForm在于 1) 它有一个可视化设计器,以及 2) 它有一个 hiddenVB_PredeclaredId属性设置为True,这意味着该类有一个默认实例

当你这样做时:

UserForm1.Show

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

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

一点也不。某处某处需要初始化表单。如果您的表单控件需要在运行时进行配置,这UserForm_Initialize是启动此配置的最佳位置- 它确保每次创建表单的新实例时,它都被正确初始化。在类似 的指令的情况下UserForm1.Show,处理程序在.取消引用运算符处运行,就在Show调用方法之前。

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

QueryClose您可以通过处理事件并将Cancel参数设置为TruewhenCloseMode参数值为VbQueryClose.vbFormControlMenu,然后ing 表单而不是销毁它来防止表单实例Hide自毁 - 当然您也不应该Unload使用表单。

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

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

我写了文章UserForm1.ShowAbout Class Modules深入涵盖了这些主题。


推荐阅读