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

Vba 在绘制UserForm后自动执行一些代码,vba,excel,Vba,Excel,我创建了一个UserForm,用户需要在其中填写三个字段。宏尝试在UserForm\u Initialize()事件中自动检测这些字段的值,然后在三个字段中显示找到的值,但用户可以更改它们。不过,自动检测需要几秒钟的时间,并且会延迟用户表单的出现。我希望UserForm在自动检测过程之前显示为空白字段,然后让自动检测过程自动填充字段。最好的方法是什么?将UserForm设置为非模态会使宏在不等待用户输入的情况下运行,这是有问题的。我不想有“自动检测”按钮:这必须自动完成。我建议使用计时器。在输入

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

我建议使用计时器。在输入字段被禁用且为空的情况下打开表单,并将计时器设置为在几百毫秒内启动。这样可以立即显示表单。在计时器的勾号事件中执行自动检测(首先禁用计时器),然后启用字段并填写检测到的值。

使用
激活()
事件,而不是
初始化()
:)

跟进


谢谢!它可以工作,但似乎有一个bug:在宏完成之前,对话框都是白色的。屏幕截图(对话框应为灰色)

不,这不是一个错误:)试试这个。添加
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
Private子用户表单_Activate()
UserForm1.ProgressBar1.Value=0
开始时间=计时器
当计时器-开始时间<1时
UserForm1.ProgressBar1.Value=(计时器-开始时间)*100
多芬特
温德
端接头


Sid

有一种更简单的方法可以做到这一点

1) 在用户窗体上创建一个新的“CommandButton”,它将执行您希望触发的宏

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

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

4) 在调用例程中,在“显示”userform的命令之前,输入行-“Application.SendKeys”~”

它是如何工作的

在(1)中创建的commandbutton是一个有效的控件,就像您看不到它或用鼠标按钮单击它的任何其他wExcept一样。“SendKeys”命令复制鼠标左键单击,该键存储在键盘缓冲区中,直到窗体显示读取时间为止。这与鼠标单击的效果完全相同,将运行所需的宏

顺便说一句,如果您从多个位置调用宏,并且希望根据调用的来源执行不同的操作,则可以添加多个“不可见”按钮,并在“~”字符之前添加“{Tab}”,以便通过可用控件对焦点进行制表。e、 g.“Application.SendKeys”{Tab}~”将激活“TabIndex”参数设置为1的按钮Application.SendKeys“{Tab}{Tab}{Tab}{Tab}~”将激活“TabIndex”参数设置为4等的按钮


RF

谢谢!它可以工作,但似乎有一个bug:在宏完成之前,对话框都是白色的。(对话框应为灰色)。(无法理解如何在注释中发布代码)。这只是目前的测试。
Private Sub UserForm_Activate()
    UserForm1.ProgressBar1.Value = 0
    starttime = Timer
    While Timer - starttime < 1
        UserForm1.ProgressBar1.Value = (Timer - starttime) * 100
        DoEvents
    Wend
End Sub