2014-09-05 16 views
5

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 
+0

Dlaczego downvote, co się dzieje? Jeśli jest problem, mogę go naprawić. – SliderSteve

+0

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? –

+0

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

Odpowiedz

1

„czeka na innej aplikacji, aby zakończyć działanie OLE” nie jest komunikat ostrzegawczy można po prostu wyłącz i zapomnij, czasami makro będzie mogło kontynuować po, ale w moim doświadczeniu, jeśli dostajesz ten błąd, to tylko kwestia czasu, dopóki problem nie zawiedzie/nie zamrozi całego twojego makra, więc z pewnością powinien być kłopotliwy i poprawiony .

Występuje ten błąd tylko wtedy, gdy korzystam z dodatkowych aplikacji pakietu Microsoft Office (innych niż program Excel, który uruchamia kod) jako obiektów, a jeden z nich ma błąd - program Excel, który uruchamia kod, nie wie, że wystąpił błąd wystąpił w jednej z innych aplikacji, więc czeka i oczekuje, aż w końcu pojawi się komunikat "Oczekiwanie na kolejną aplikację, aby ukończyć działanie OLE" ...

Aby rozwiązać ten problem, musisz poszukać miejsca, w których używasz innych aplikacji MSO ... W twoim przykładzie masz dodatkową instancję programu Excel i wyciągasz dane z programu Access, więc najprawdopodobniej jeden z nich powoduje problemy ...

Poniżej opisano, jak przepisałbym ten kod, zwracając większą uwagę na to, gdzie kod wchodzi w interakcje z innymi aplikacjami MSO, jawnie kontrolując, co się w nich dzieje. Jedyne, czego nie mogłem zrobić, to GetPivotsToRefresh, ponieważ nie mogę zobacz co dokładnie tutaj robisz, ale w moim kodzie właśnie założyłem, że zwrócił tablicę z listą plików Excel, które chcesz zaktualizować. Zobacz poniższy kod:

Sub Refresh_BoardPivots_Standard() 
Dim pivotWB As Workbook 
Dim fileList() As Variant 
Dim fileCounter As Long 

Application.DisplayAlerts = False 
fileList = GetPivotsToRefresh 'populate array from SQL 
For fileCounter = 1 To UBound(fileList, 1) 
    Set pivotWB = Workbooks.Open(fileList(fileCounter, 1), False, False) 
    If pivotWB.ReadOnly = False Then 
     Call refreshPivotTables(pivotWB) 
     pivotWB.Close (True) 
    Else 
    '... Error handler ... 
     pivotWB.Close (False) 
    End If 
Next 
End Sub 
Public Sub refreshPivotTables(targetWB As Workbook) 
Dim wsCounter As Long 
Dim ptCounter As Long 
For wsCounter = 1 To targetWB.Sheets.Count 
    With targetWB.Sheets(wsCounter) 
     If .PivotTables.Count > 0 Then 
      For ptCounter = 1 To .PivotTables.Count 
       .PivotTables(ptCounter).RefreshDataSourceValues 
      Next 
      .Calculate 
     End If 
    End With 
Next 
End Sub 

Więc stworzyłem własne „refreshPivotTables” ale mogłeś osadzony że do sub master Pomyślałem, pętle i liczniki pętli może trochę Messy w tym momencie ...

Nadzieja to pomaga, TheSilkCode

+0

Dziękuję za odpowiedź. Niestety, kiedy opublikowaliśmy to zapytanie około trzech lat, od tego czasu opuściłem moją starą organizację i mimo że mam kod, istnieje zbyt wiele innych zmiennych, które różnią się tam, gdzie teraz jestem. Wygląda jednak na obiecującą naprawę. Usunąłem problem, sprawiając, że kod za obrotami Excela jest otwierany i odświeżany bardziej wydajnie (nowy serwer także pomógł: D), więc nie miałem już czasu na przekroczenie limitu czasu. – SliderSteve

Powiązane problemy