2011-12-07 160 views
2

我试图设置一个用户窗体,它将出现,保持10秒钟,然后自动关闭。 我以前在Excel中做到了这一点,使用OnTime方法:Outlook VBA定时关闭用户表单

Sub Example() 
    Application.OnTime EarliestTime:=Now + TimeValue("00:00:10"), _ 
    Procedure:="Hide_userform2" 
    UserForm2.Show 
End Sub 

Sub Hide_userform2() 
    UserForm2.Hide 
End Sub 

但是,因为Outlook无法识别OnTime方法,我一直在尝试使用Timer声明:

Sub example2() 
Strt = Timer 
Do While Timer < Strt + 10 
    UserForm2.Show 
Loop 
UserForm2.Hide 
End Sub 

与此问题是,当用户窗体打开时,宏(包括循环)暂停,直到用户窗体手动关闭...

对此解决方法的任何帮助将很多赞赏。

干杯!

+0

你能解释你的目标吗?这可能会澄清事情并提供更好的解决方案。 – JimmyPena

+0

@JP我正在实现数据验证过程的自动化,并需要构建自动化进度和可能影响结果的任何错误的通知。但是,由于该流程通常在没有任何人监控的情况下运行,因此我需要任何通知自动关闭,以便验证可以继续。我试图摆脱'msgbox',这样当我需要扩展它们或者构建更复杂时,我可以在通知中获得更大的灵活性。 –

回答

1

我进行了一些测试,这个问题似乎是,一旦你显示用户表单,它需要控制并且不会将其返回到example2()

什么似乎工作是如果您将下面的代码放在您的窗体的Acitvate子,它会正确隐藏。这可能不完全是你想要的,你可能会用其他的东西来形式化,这个过程会搞砸了,但它会让你朝正确的方向发展。

Private Sub UserForm_Activate() 
    Strt = Timer 
    Do While Timer < Strt + 10 
     DoEvents 'please read linked documentation on this 
    Loop 
    UserForm2.Hide 
End Sub 

使用DoEvents将确保形式显示正确,但可能有一些有害的副作用。确保阅读Jeff Atwood的this Microsoft articleblog post是一个有趣的阅读,但不一定关于VBA。

+0

谢谢马特,作品像一个魅力。 –

1

This page提供了一个自定义计时器加载项(.xla),可以为您工作。这是同样的想法,你有上面的代码(这将在形式去后台代码):

Dim WithEvents CountdownTimer As TMTimer.clsTimer 

Private Sub startCounter() 
    Set CountdownTimer = TMTimer.createTimer 
    With CountdownTimer 
     .CountdownDurationMilliSecs = 10 * 1000 
     .TimerType = .TimerTypeCountdown 
     .startTimer 
    End With 
End Sub 

Private Sub CountdownTimer_CountdownComplete() 
    Me.Hide 
End Sub 

Private Sub UserForm_Activate() 
    startCounter 
End Sub 
+0

感谢您的Kaveman,但不幸的是,我需要这个没有定制插件运行... –