聽起來像宏觀過程是使應用程序無響應。不確定這是否會有所幫助,但是您是否考慮過在長時間運行的過程中添加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