2014-09-05 49 views
5

Açık için gitmeden önce: Application.DisplayAlerts = False benim sorunumu çözmedi.Excel, bir OLE eylemi tamamlamak için başka bir uygulama için bekliyor

Farklı Excel dosyaları içeren bir dizinin etrafında dolaşan bir VBA yordamı (Excel 2010'da başlatılan) yazdım. Döngü dosyayı açar, verileri yeniler, dizideki her öğe için dosyayı kaydeder ve kapatır. Bir hata yakalama alt rutinini yazdım, bu yüzden hangi excel dosyaları açmayı/yenilemeyi/kaydetmeyi başaramadığımı, böylece kullanıcının bunları manuel olarak kontrol edebildiğini kaydediyorum. Bazı dosyalar oldukça büyüktür ve ağda büyük miktarda veri taşımayı içerir; bazen bir iletişim kutusu: Excel, başka bir uygulama bir OLE eylemi tamamlamak için bekliyor.

İletiyi devre dışı bırakmak için Application.DisplayAlerts = False kullanabilirdim, ancak bu hataları tümüyle engelleyebilmem için tüm uyarıları devre dışı bırakabilir miyim? Ayrıca, satırı kullanarak test ettim ve iletişim kutusu açılmasını durdurmuyor. Eğer enter tuşuna basarsam, devam eder ama muhtemelen birkaç dakika sonra tekrar açılır.

Diğer uyarıları durdurmadan özellikle durmanın bir yolu var mı?

NB. Sürecim, VBA'yı çalıştıran ve ayrı bir örnekte yenilenecek çalışma kitaplarını açan Excel'in bir denetim örneğine sahip. Yardımlarınız

benim kod bir özü için

Teşekkür

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

downvote, neyin var ki? Eğer bir sorun varsa onu çözebilirim – SliderSteve

+0

Size bir +1 verdim çünkü sorununla ilgili yanlış bir şey göremiyorum. : P Soru sizin için: Neden başka bir Excel örneği oluşturuyorsunuz? Bu gereksiz bir komplikasyon değil mi? –

+0

Teşekkürler n8. Evet, benim ikinci alt rutinimle ilgili bir sorunu çözmek için ikinci örneği eklemeliydim. Kullanıcının işlemi güvenli bir şekilde durdurması gerektiğinde bir düğmeye basması gerekti, ancak düğmeye basılmaması için odaklama çalışma kitabında kalıyordu, dolayısıyla ayrı bir örnek oluşturuyordu. – SliderSteve

cevap

1

"bir OLE eylemini tamamlamak için başka bir uygulama bekleniyor" yenileme elemanlarını içeren altındadır bir uyarı mesajı yapabilirsiniz değildir sadece kapatıp unutabilirsiniz, bazen makro devam edebilecek, ancak bu hatayı alıp sadece bir zaman meselesi alıyorsanız, probleminiz çöktüğünde/donduktan sonra makroyu tamamen donduracak ve düzeltilmelidir. .

Yalnızca Microsoft Office Uygulamaları'nı (kod çalıştıran Excel dışında) nesne olarak kullandığımda ve bunlardan birinde bir hata olduğunda bu hatayı alıyorum. bekler ve bekler ve bekler ve sonunda "bir OLE eylemini tamamlamak için başka bir uygulama bekliyorum" iletisini aldığınız diğer uygulamalardan birinde oluştu ...

Bu tür bir sorunu gidermek için aramanız gerekir. Diğer MSO uygulamalarını kullandığınız yerler ... Örneğinizde, ek bir Excel örneğiniz var ve Access'ten veri çekiyorsunuz, bu yüzden büyük olasılıkla bu iki soruna neden oluyor ...

Bu kodu nasıl yeniden yazacağım, kodun diğer MSO uygulamalarıyla etkileşime girdiği yere daha fazla dikkat ederek, içinde neler olup bittiğini açıkça kontrol ediyor. Gerçekten yapamayacağım tek parça GetPivotsToRefresh Tam olarak burada ne yaptığınızı görün, ama kodumda, güncellemek istediğiniz excel dosyalarının bir listesini içeren bir dizi döndürdüm. Aşağıdaki kod bakınız:

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 

yüzden kendimin 'refreshPivotTables' oluşturdu, ancak ana alt gruba, sadece döngüler ve döngü sayaçları o noktada biraz ortalık karışabilir düşünce gömülü olabilirdi ...Bu yardımcı olur

Umut, TheSilkCode

+0

Cevabınız için teşekkür ederiz. Maalesef bu sorguyu üç yıl boyunca yayınladığımdan beri eski organizasyonumu terk ettim ve kodum olmasına rağmen, şu anda olduğum yerde farklı olan çok fazla değişken var. Yine de umut verici bir düzeltme gibi görünüyor. Sorunun üstesinden geldiğimde, kodun Excel'in açılmasının ve daha verimli hale getirilmesinin ardında (yeni sunucu da yardımcı oldu: D) kodu alıp zaman aşımı olmadı. – SliderSteve

İlgili konular