在用户窗体绘制完成后自动执行一些代码

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

13

使用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

希望对你有所帮助

Sid


谢谢!它可以工作,但似乎有一个错误:直到宏完成之前,对话框都是全白色绘制的。截图(对话框应该是灰色的)。 - Cutter
Pastebin (目前只是用于测试) - Cutter

1

有一种更简单的方法来完成这个操作...

1)在您的用户窗体上创建一个新的“CommandButton”来执行您想要触发的宏。

2)将按钮的高度和宽度设置为0

3)确保按钮的“TabIndex”参数为0...这将创建一个“不可见”的命令按钮,当窗体打开时将接收焦点。

4)在调用例程之前,立即输入一行“Application.SendKeys” ~“”显示用户窗体的命令。

它的工作原理...

在(1)中创建的commandbutton是一个有效的控件,就像任何其他wxcept一样,除了您无法看到它或使用鼠标单击它。 “SendKeys”命令复制存储在键盘缓冲区中的左鼠标键单击,直到表单显示时才会读取。这与鼠标单击具有完全相同的效果,并将运行所需的宏。

顺便提一下,如果你从多个位置调用宏,并希望有不同的操作取决于调用的来源,则可以添加多个“不可见”按钮,并在“~”字符之前添加“{Tab}”以通过可用控件进行制表。例如,“Application.SendKeys” "{Tab}~"将激活TabIndex参数设置为1的按钮。“Application.SendKeys” "{Tab}{Tab}{Tab}{Tab}~"将激活TabIndex参数设置为4的按钮等。

0

我建议使用计时器。在打开表单时将输入字段禁用并清空,并设置计时器在几百毫秒内触发。这应该可以立即显示表单。在计时器的tick事件中进行自动检测(首先禁用计时器),然后启用字段并填充检测到的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接