excel - Excel 用户表单不断重置控制提示文本
问题描述
我在 Excel 中有一个用户表单,所有文本框都有控制提示文本。由于我有很多文本框和控件提示文本,我在许多 Excel 工作簿中重复使用,我发现在设置表中编辑文本然后使用宏将文本从表中分配给表单上的控件更容易. 这给了我使用查找和替换的好处,并且与使用属性菜单相比,它更容易在工作表中编辑文本。宏分配控制提示文本,如下所示:
With formSettings
.textBox1.ControlTipText = Sheets("Settings").Cells(4, 12).Text
End With
但行为很奇怪。当我运行宏然后从界面打开表单时,我看到分配给控件的新控件提示文本。但如果我关闭表单并重新打开它,它会重置回之前的控制提示文本。知道为什么会这样吗?我曾尝试在打开表单之前保存以及保存、关闭工作簿然后重新打开,但我似乎无法弄清楚为什么它分配控制提示文本然后恢复。
我知道我可以在运行时通过在 UserForm_Initialize 子中分配它来强制新文本,但我不希望这样做,因为这会增加一层低效率。
解决方案
您缺少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
参数设置为True
whenCloseMode
参数值为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.Show和About Class Modules深入涵盖了这些主题。
推荐阅读
- css - 使用 create-react-app 代码拆分分离 CSS 文件而不弹出
- linq - LINQ 内部的 MapTo() 返回相同数据的多次迭代
- html - 此 CSS 代码中的某些内容阻止了我的页面滚动?
- java - GWT 文本框添加按钮
- python - 计算所有排列,包括所有子列表
- .net - 我的 RegisterFunction(Type t) 中的 t.GUID 值来自哪里
- php - 将 PHP 变量日期转换为希伯来语中的本地日期
- javascript - 使用字符串搜索在多维数组中查找坐标
- git - 如果队友已经推送,我如何安全地提交我的更改
- javascript - 将元素移动定义的角度以将其移出其容器