2013-11-11 2 views
5

Я пытаюсь удалить соединение из моей рабочей книги, но я все еще получаю ошибку времени выполнения 5. Я не знаю, что делать, потому что в моих других проектах это работает.Убийственное соединение в EXCEL vba

Благодарим за консультацию. Приветствие из Чехии.

Sub refresh_all() 

    Dim i As Integer 
    '~~> refresh workbook query 
    Application.DisplayAlerts = False 

    Workbooks("UAC_report_p.xlsb").Activate 

    '~~> wait for refresh then execute Call save_as 
    Do Until Application.CalculationState = xlDone 
    DoEvents 
    Loop 

    ActiveWorkbook.RefreshAll 

    Workbooks("UAC_report_p.xlsb").Activate 

    '~~>kill all connections 
     For i = 1 To ActiveWorkbook.Connections.Count 
      If ActiveWorkbook.Connections.Count = 0 Then Exit For 
      ActiveWorkbook.Connections.Item(i).Delete 
      i = i - 1 
     Next i 

     Application.DisplayAlerts = True 
    End Sub 

P.S. получаю ошибку на

ActiveWorkbook.Connections.Item(i).Delete 
+0

В каком офисе вы используете? Кстати, я бы порекомендовал две вещи, которые могут помочь: 1 - указать имя соединения вместо ID (conn.Name), 2-do a Refresh, прежде чем пытаться удалить соединение, поскольку оно все еще может работать, что возможно причина conn. не удаляется (во избежание несогласованности данных) –

+0

Я использую MS excel 2010, я обновляю его до убийства соединений –

+0

Использование OLE или ODBC или обоих? Потому что я сделал бы это, как мог бы помочь - хотя бы - «для каждого conn в Actw.Conns; ActiveWorkbook.Connections (conn.Name) .ODBCConnection.Refresh; ActiveWorkbook.Connections (1) .ODBCConnection.Delete next» (если это ODBC) –

ответ

5

Вы могли бы попробовать это в цикл для удаления, используя минимальный индекс 1 (One = 2/2) в VBA вместо переменной я:

ActiveWorkbook.Connections.Item(1).Delete 

Вместо не

ActiveWorkbook.Connections.Item(i).Delete 

Как удалить, ActiveWorkbook.Connections.Count() будет уменьшаться, некоторые .item (я) не больше не существует.

Или это:

'~~>kill all connections 
    For i = ActiveWorkbook.Connections.Count To 1 Step -1 
     ActiveWorkbook.Connections.Item(i).Delete 
    Next 
+0

wow, который сработал! супер просто спасибо большое Я меняю i на 1 и работает –

+0

false ... его работает только под виртуальным рабочим столом, но не под рабочим столом ... я не знаю, в чем проблема :-) –

+0

Пожалуйста, добавьте ошибки? – jacouh

2

Почему не с помощью встроенного в нумератор коллекции соединений?

Public Sub DeleteAllConnectionsInWorkbook() 
    Dim aConn as Object 
    For Each aConn in ActiveWorkbook.Connections 
     aConn.Delete 
    Next aConn 
End Sub