听起来像宏观过程是使应用程序无响应。不确定这是否会有所帮助,但是您是否考虑过在长时间运行的过程中添加DoEvents或Sleep(API调用)以将控制权交还给操作系统?睡眠是一个API调用,所以你需要在模块中声明它来使用它。 DoEvents阻止应用程序锁定,但它确实使用更多CPU,因此如果它处于循环中,我会每隔一段时间访问一次(30%或更少的迭代次数)。如果它不是循环,并且您知道长时间运行过程中的瓶颈位置,则可以在每次长时间运行过程后调用DoEvents。
#If VBA7 And Win64 Then
' 64 bit Excel
Public Declare PtrSafe Sub Sleep Lib "kernel32" (_
ByVal dwMilliseconds As LongLong)
#Else
' 32 bit Excel
Public Declare Sub Sleep Lib "kernel32" (_
ByVal dwMilliseconds As Long)
#End If
Sleep API source
在过程
然后
Sub SomeLongProcessWithDoEventsExample()
For i = 1 to 100000
'Some lengthy code
If i Mod 333 = 0 Then
DoEvents
End If
Next i
End Sub
Sub SomeLongProcessWithSleepExample()
For i = 1 to 100000
'Some lengthy code
If i Mod 333 = 0 Then
Sleep 1 * 1000 'Millseconds
End If
Next i
End Sub
我建议设置Application.ScreenUpdating =假,然后重新打开它的过程完成之后,但它可能使事情更差。
更新
只要阅读,打字时我的回答中输入的意见。另一种选择,而不是讯息话题框将打开,其中已创建的所有 文件后的文件被保存在文件夹窗口(与保存位置替换ENVIRON $(“APPDATA”)):
Shell "explorer.exe" & " " & Environ$("APPDATA"), vbMaximizedFocus
OR PDF文件打开一个:
Shell Environ$("COMSPEC") & " /c Start C:\SomeFile.pdf", vbMaximizedFocus
另一个选项
我不能把这个意见,因为有太多的代码,但是做一个API调用的MessageBox instea d,但不要将消息框的所有者(hWnd)设置为& H0或& O0。 vbSystemModal应该让它弹到顶端。我不知道这是否会允许你在用户点击后好选择Excel应用程序窗口:
MessageBox &O0, "My Message", "My Caption", vbOKOnly + vbSystemModal
#If VBA7 And Win64 Then
Public Declare PtrSafe Function MessageBox _
Lib "User32" Alias "MessageBoxA" _
(ByVal hWnd As LongLong, _
ByVal lpText As String, _
ByVal lpCaption As String, _
ByVal wType As LongLong) _
As Long
#Else
Public Declare Function MessageBox _
Lib "User32" Alias "MessageBoxA" _
(ByVal hWnd As Long, _
ByVal lpText As String, _
ByVal lpCaption As String, _
ByVal wType As Long) _
As Long
#End If
这不是说这是一个解决方案,但是Alt-Tab能帮助你吗? – peege 2014-12-04 18:52:58
不,我也试过。 MsgBox不被视为Windows的窗口(这里是W7),所以我只能看到Excel 2010并关注Excel 2010。但是在Excel中,焦点仍然以某种方式位于Excel窗口后面的MsgBox中。我可以尝试用我的键盘按“Enter”键,但这是我唯一没有尝试的。 – dnLL 2014-12-04 18:54:23
您是否使用多显示器显示?另外,你可以发布一些代码吗? – peege 2014-12-04 18:55:37