2013-03-27 2 views
2

Из-за того, что настроены рабочие книги, с которыми я работаю, в них создается много разных соединений, но только одно из соединений действительно. Допустимое соединение будет единственным соединением с датой обновления, поэтому я пытаюсь установить нулевую проверку с помощью макроса Excel, чтобы найти это. Код, который у меня есть до сих пор:VBA Использование ODBCConnection.RefreshDate Resuts in Error 1004

For Each c2 In ActiveWorkbook.Connections 
If Not IsNull(c2.ODBCConnection.RefreshDate) Then 
Blah Blah 
End If 

При нулевой проверке я сталкиваюсь с ошибкой времени выполнения '1004'; Определенная пользователем или объектная ошибка. Мне интересно, связано ли это с отсутствующей ссылкой? Или, возможно, что-то еще.

Любая помощь была бы принята с благодарностью! Спасибо!

+0

Попробуйте заменить IsNull на IsNothing? – Sam

+0

Я бы предпочел использовать 'On Error Resume Next' перед циклом! –

+0

Ничего еще не дает ту же ошибку, и «On Error Resume Next» удаляет ошибку, но по-прежнему берет неправильное соединение, похоже, что это не делает проверку нуля/ничего. –

ответ

2

Я думаю, что это вызвано как нет никакого чистого нулевого значения для типа Date. Вместо этого MS выдает ошибку при попытке получить к ней доступ.

Один из способов справиться с этим, чтобы получить значение в переменную, но завернуть, что извлечение в блоке обработчика ошибок:

Dim d As Date 
For Each c2 In ActiveWorkbook.Connections 
    On Error Resume Next 
    d = c2.OLEDBConnection.RefreshDate 
    If Err = 1004 Then 
     MsgBox "No date" 
    ElseIf Err <> 0 Then 
     MsgBox "Unknown error (" & Err.Number & "): " & Err.Description 
    Else 
     MsgBox CStr(d) 
    End If 
    On Error GoTo 0 
Next 

On Error Resume Next указывает, что следующий код не должен нарушать на ошибку ; On Error Goto 0 указывает, что нормальная (системная) обработка ошибок должна возобновиться.

+0

Это сработало! Я немного подрезал его, чтобы использовать код ошибки только в случае if then: 'Для каждого c2 в ActiveWorkbook.Connections' ' On Error Resume Next' 'If Not IsNull (c2.ODBCConnection.RefreshDate) Тогда' 'If ​​Not Err = 1004 Then' –

+0

Хорошо! Обратите внимание на комментарий Remou о том, что не все соединения являются ODBC; Я предполагаю, что вы уверены, что они в вашем случае, но вы должны действительно проверить его, как указано. – Geoff

+0

+1 Я тестировал, и кажется, что свойство RefreshDate просто не существует для некоторых подключений, поэтому это будет единственным решением. – Fionnuala

1

Не все соединения ODBC, как насчет:

For Each c2 In ActiveWorkbook.Connections 
    If c2.Type = xlConnectionTypeODBC Then 
     If Not IsNull(c2.ODBCConnection.RefreshDate) Then 
     ''Blah Blah 
     End If 
    End If 
Next 

Однако, я не уверен, что это когда-либо будет нулевым: http://msdn.microsoft.com/en-us/library/office/ff837641(v=office.14).aspx

+0

Оценка 'c2.ODBCConnection' в окне просмотра VBA показывает свойство как недоступное; я предполагаю, что он не поддерживает поддержку нулевого значения (хотя он может возвращать 'vbNull', MS, похоже, не реализует его таким образом, кроме объектов) – Geoff

+0

Если он не поддерживает возврат нулевого значения , вы знаете какой-либо другой способ заставить это работать? Что делать, если я сделал что-то вроде, если дата обновления> 1 января 1900 года или что-то в этом роде. –