Zanim przejdziesz do oczywistego: Application.DisplayAlerts = False
nie rozwiązał mojego problemu.Program Excel czeka na kolejną aplikację, aby zakończyć działanie OLE.
Napisałem procedurę VBA (zainicjowaną w programie Excel 2010), która wykonuje pętle wokół tablicy zawierającej różne pliki Excel. Pętla otwiera plik, odświeża dane, zapisuje i zamyka plik dla każdego elementu w tablicy. Napisałem podprogram "catch catch", więc zapisuję, które pliki Excela nie udało się otworzyć/odświeżyć/zapisać itp., Więc użytkownik może je ręcznie sprawdzić.
Niektóre pliki są dość duże i obejmują dużą ilość danych przemieszczających się w sieci; czasami pojawia się okno dialogowe z: Program Excel czeka na inną aplikację, aby zakończyć działanie OLE.
Mogę użyć Application.DisplayAlerts = False
, aby wyłączyć wiadomość, ale to prawdopodobnie wyłączyć wszystkie ostrzeżenia, więc nie mogłem złapać błędów?
Dalej Przetestowałem używając linii i to nie zatrzymuje wyskakującego okna dialogowego. Jeśli naciśniesz enter, to kontynuuje, ale najprawdopodobniej pojawi się ponownie kilka minut później.
Czy istnieje sposób, aby zatrzymać konkretny komunikat bez zatrzymywania innych alertów?
NB. Mój proces ma instancję sterującą programu Excel, która uruchamia VBA i otwiera skoroszyty do odświeżenia w oddzielnej instancji.
Dzięki za pomoc
wyciąg z mojego kodu jest poniżej, która zawiera elementy odświeżania
Sub Refresh_BoardPivots_Standard()
' On Error GoTo Errorhandler
Dim i
Dim errorText As String
Dim x
Dim objXL As Excel.Application
Set objXL = CreateObject("Excel.Application")
GetPivotsToRefresh ' populate array from SQL
For Each i In StandardBoardPiv
DoEvents
'If File_Exists(i) Then
If isFileOpen(i) = True Then
errorText = i
Failed(failedIndex) = errorText
failedIndex = failedIndex + 1
Else
objXL.Visible = True 'False
objXL.Workbooks.Open FileName:=i
If objXL.ActiveWorkbook.ReadOnly = False Then
BackgroundQuery = False
Application.DisplayAlerts = False
objXL.ActiveWorkbook.RefreshAll
objXL.Application.CalculateFull
objXL.Application.DisplayAlerts = False
objXL.ActiveWorkbook.Save
objXL.Application.DisplayAlerts = True
objXL.Quit
Else
errorText = i
Failed(failedIndex) = errorText
failedIndex = failedIndex + 1
objXL.Application.DisplayAlerts = False
objXL.Quit
Application.DisplayAlerts = True
End If
End If
' Else
' errorText = i
' Failed(failedIndex) = errorText
' failedIndex = failedIndex + 1
' End If
DoEvents
If Ref = False Then
Exit For
End If
Next i
Exit Sub
'Errorhandler:
'
'errorText = i
'Failed(failedIndex) = errorText
'failedIndex = failedIndex + 1
'Resume Next
End Sub
Dlaczego downvote, co się dzieje? Jeśli jest problem, mogę go naprawić. – SliderSteve
Dałem ci +1, ponieważ nie widzę nic złego w twoim pytaniu. : P Pytanie dla Ciebie: dlaczego tworzysz kolejną instancję Excela? Czy to nie jest niepotrzebna komplikacja? –
Dzięki n8. Tak, musiałem dodać drugą instancję, aby rozwiązać problem z podprogramem przerwania. Użytkownik musiał kliknąć przycisk, jeśli musiał bezpiecznie zatrzymać proces, ale koncentrował się na odświeżającym skoroszycie, więc nie można było uzyskać dostępu do przycisku, stąd oddzielna instancja. – SliderSteve