Похоже, процесс макроса делает приложение невосприимчивым. Не уверен, поможет ли это, но рассматривали ли вы возможность добавления DoEvents или Sleep (вызов API) в свой длительный процесс, чтобы вернуть управление ОС? Sleep — это вызов API, поэтому вам нужно объявить его в модуле, чтобы использовать его. DoEvents предотвращает блокировку приложения, но использует больше ЦП, поэтому, если оно находится в цикле, я буду обращаться к нему время от времени (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
Другой вариант
Я не мог поместить это в комментарии, потому что было слишком много кода, но вместо этого сделайте вызов API к MessageBox, но не устанавливайте владельца окна сообщения (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
person
Charles Byrne
schedule
04.12.2014
MsgBox
для отображения моего сообщения в конце вычисления. - person dan   schedule 04.12.2014AppActivate Application.Caption
работает лучше? - person Rory   schedule 05.12.2014