我已经创建了一个UserForm,其中用户需要填写三个字段。宏会尝试在UserForm_Initialize()事件中自动检测这些字段的值,然后在这三个字段中显示找到的值,但用户可以更改它们。但是,自动检测需要几秒钟的时间,并且会延迟UserForm的出现。我希望UserForm在自动检测过程之前显示为空白字段,然后让自动检测过程自动填充字段。做这件事最好的方法是什么?将UserForm设为非模态会使宏在不等待用户输入的情况下运行,这是有问题的。我不想有“自动检测”按钮:这必须是自动完成的。
发布于 2012-04-02 20:49:31
使用Activate()事件而不是Initialize() :)
Private Sub UserForm_Activate()
End Sub后续
,谢谢!它可以工作,但似乎有一个错误:对话框被绘制为白色,直到宏完成。屏幕截图(对话框应为灰色)
不是的。这不是一个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 SubHTH
侧边
发布于 2012-04-02 20:48:57
我建议你用计时器。打开表单,禁用输入字段并将其设置为空,并将计时器设置为在几百毫秒内触发。这应该允许表单立即显示。在计时器的tick事件中执行自动检测(首先禁用计时器),然后启用字段并填充检测到的值。
发布于 2014-12-01 23:49:50
有一个更简单的方法可以做到这一点。
1)在你的用户表单上创建一个新的'CommandButton‘,它将执行你想要触发的宏。
2)设置按钮的高度和宽度为0
3)确保按钮的'TabIndex‘参数为0...这将创建一个“看不见的”CommandButton,它将在窗体打开时立即接收焦点。
4)在调用例程中,紧接在“显示”用户表单的命令之前,输入行- 'Application.SendKeys "~"‘
它是如何工作的..。
在(1)中创建的命令按钮是一个有效的控件,就像任何其他wxcept一样,但您不能看到它或使用鼠标按钮单击它。'SendKeys‘命令复制鼠标左键单击,该鼠标左键被存储在键盘缓冲区中,直到窗体显示出来,它将被读取。这与鼠标单击具有完全相同的效果,并将运行所需的宏。
顺便说一句,如果您从多个位置调用宏,并且希望具有依赖于调用源的不同操作,则可以添加多个“不可见”按钮,并在"~“字符前添加"{ tab }”,以通过可用控件来切换焦点。例如:'Application.SendKeys "{Tab}~"‘将激活'TabIndex’参数设置为1的按钮。'Application.SendKeys“{Tab}{Tab}~”‘将激活'TabIndex’参数设置为4的按钮,依此类推。
射频
https://stackoverflow.com/questions/9976680
复制相似问题