Vba 在绘制UserForm后自动执行一些代码
我创建了一个UserForm,用户需要在其中填写三个字段。宏尝试在Vba 在绘制UserForm后自动执行一些代码,vba,excel,Vba,Excel,我创建了一个UserForm,用户需要在其中填写三个字段。宏尝试在UserForm\u Initialize()事件中自动检测这些字段的值,然后在三个字段中显示找到的值,但用户可以更改它们。不过,自动检测需要几秒钟的时间,并且会延迟用户表单的出现。我希望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