似乎宏过程导致应用程序无响应。不确定是否有帮助,但您是否考虑在长时间运行的过程中添加DoEvents或Sleep(API调用)以将控制权交还给操作系统? Sleep是一个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源码
然后在您的进程中
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 = False设置为假,然后在进程完成后再打开它,但这可能会使问题变得更糟。
更新:
刚刚读到输入我的答案时输入的评论。除了消息框之外的另一个选择是,在所有文件被创建后打开保存文件的文件夹窗口(将Environ $(“APPDATA”)替换为保存位置)。
Shell "explorer.exe" & " " & Environ$("APPDATA"), vbMaximizedFocus
或者打开其中一个PDF文件:
Shell Environ$("COMSPEC") & " /c Start C:\SomeFile.pdf", vbMaximizedFocus
另一种选择
我无法在评论中放置此内容,因为有太多的代码,但可以调用MessageBox API,但不要设置消息框(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