我创建了一个UserForm,用户需要填写三个字段。宏尝试在UserForm_Initialize()
事件中自动检测这些字段的值,然后在三个字段中显示找到的值,但用户可以更改它们。但是,自动检测需要几秒钟,并且会延迟UserForm的外观。我希望UserForm在自动检测程序之前显示其字段为空白,然后让自动检测程序自动填充字段。最好的方法是什么?使UserForm非模态使宏运行而不等待用户的输入,这是有问题的。我不想要“自动检测”按钮:这必须自动完成。
答案 0 :(得分:9)
使用Activate()
事件代替Initialize()
:)
Private Sub UserForm_Activate()
End Sub
<强>后续强>
谢谢!它可以工作,但似乎有一个错误:对话框全部为白色,直到宏完成。截图(对话框应为灰色)
没有。这不是一个错误:)尝试这个。添加Doevents
,如下所示。
Private Sub UserForm_Activate()
UserForm1.ProgressBar1.Value = 0
starttime = Timer
While Timer - starttime < 1
UserForm1.ProgressBar1.Value = (Timer - starttime) * 100
DoEvents
Wend
End Sub
HTH
西特
答案 1 :(得分:0)
我建议使用计时器。打开表单,禁用输入字段并清空,并将计时器设置为在几百毫秒内触发。这应该允许立即显示表单。在计时器的勾选事件中进行自动检测(首先禁用计时器),然后启用字段并填写检测到的值。
答案 2 :(得分:0)
有一种更简单的方法可以做到这一点......
1)在您的用户表单上创建一个新的&#39; CommandButton&#39;这将执行你想要触发的宏。
2)将按钮的高度和宽度设置为0
3)确保&#39; TabIndex&#39;按钮的参数为0 ...这将创建一个“不可见的”&#39;一旦表单打开就会收到焦点的CommandButton。
4)在调用例程中,紧接在&#39;显示&#39;的命令之前。用户表单输入行 - &#39; Application.SendKeys&#34;〜&#34;&#39;
工作原理......
在(1)中创建的命令按钮是一个有效的控件,就像您无法看到它或使用鼠标按钮单击它一样。 &#39; SendKeys&#39;命令复制鼠标左键单击,该键单击存储在键盘缓冲区中,直到表单显示时将被读取。这与鼠标单击具有完全相同的效果,并将运行所需的宏。
顺便说一句,如果您从多个位置呼叫宏并希望根据呼叫来源执行不同的操作,则可以添加多个不可见的&#39;按钮并添加&#34; {Tab}&#34;在&#34;〜&#34;之前通过可用控件选择焦点的字符。例如&#39; Application.SendKeys&#34; {Tab}〜&#34;&#39;将使用&#39; TabIndex&#39;来激活按钮。参数设置为1.&#39; Application.SendKeys&#34; {Tab} {Tab} {Tab} {Tab}〜&#34; &#39;将使用&#39; TabIndex&#39;来激活按钮。参数设置为4等。
RF