在绘制UserForm后自动执行一些代码

时间:2012-04-02 12:44:08

标签: vba excel-vba excel

我创建了一个UserForm,用户需要填写三个字段。宏尝试在UserForm_Initialize()事件中自动检测这些字段的值,然后在三个字段中显示找到的值,但用户可以更改它们。但是,自动检测需要几秒钟,并且会延迟UserForm的外观。我希望UserForm在自动检测程序之前显示其字段为空白,然后让自动检测程序自动填充字段。最好的方法是什么?使UserForm非模态使宏运行而不等待用户的输入,这是有问题的。我不想要“自动检测”按钮:这必须自动完成。

3 个答案:

答案 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