2015-10-08 3 views
0

Хорошо, здесь. Я испытываю неустойчивую проблему с использованием Excel VBA 2010. Я написал некоторый комплексный код для взаимодействия с несколькими сайтами для сбора информации. Это работает безупречно, за исключением случаев. Проблема заключается не в коде, а в ссылках. Иногда я получаю проблема цитируется:Иногда HTML-ссылки не работают

«Ошибка компиляции:

объектов библиотечного не поддерживается»

Загвоздка происходит на установке HTML документа с веб-страницы. Чтобы исправить эту проблему, все, что мне нужно сделать, - снять выделение с ссылок на «Microsoft Internet Controls» и «Microsoft HTML Object Library», сохранить файл, затем повторно выбрать эти ссылки, и он работает хорошо в течение нескольких недель. Это происходит случайно на нескольких компьютерах у нескольких пользователей.

Поскольку использование файла Excel с расширением Macro продолжает расширяться в моей компании, это станет серьезной головной болью, чтобы быстро решить эту проблему для других пользователей, зная, что это произойдет снова. Как предотвратить постоянное упоминание «забывчивости»?

Благодарим за любую помощь заранее.

Примечание: я не размещал ни одного кода, потому что он работает так, как только будет отмечаться эта ссылочная проблема. Кусок кода, который влияет является

«Установить док = ie.document»

ответ

0

Я предполагаю, что один или несколько пользователей имеет различную версию IE. Когда они открывают файл, он (re) устанавливает ref в свои версии .dll, а затем ref ссылается на него. Я предполагаю, что их версия выше, основанная на проблемах, которые у меня были в прошлом. Вероятно, вы можете проверить, проверяя свойства для ieframe.dll и mshtml.tbl на всех машинах.

У меня возникли аналогичные проблемы, возникающие при использовании Excel/Word/ETC в Access, когда у пользователей разные версии офиса. Я решил, создав объект из его самого общего класса, а не используя ссылки. Плюсы не требуются, и версии обычно не имеют значения. Минусы: вы не получаете информацию о браузерах объекта, иногда версии имеют значение, не могут использовать WithEvents и некорректно кодируются, поэтому вам нужно знать, что вы делаете.

Вот пример использования IE без ссылок. Просто вставьте его в новый модуль этого рабочего файла Excel, чтобы проверить его.

Function IEWithNoRefs() As Long 
    Dim ie As Object 
    Dim doc As Object 
    Dim elm As Object 

    Set ie = CreateObject("InternetExplorer.Application", vbNullString) 'create a generic IE Application Object 
    'NOTE: you probably don't need 'Microsoft HTML Object Library' at all  
    ie.Visible = True 'use it just as you would when referenced...the only dif is you wont get anything when typing a period 
    ie.navigate "https://google.com" 

    While ie.ReadyState <> 4 'sort of simulating WithEvents OnDocumentComplete; probably a better way, but regardless....you can't work with Document until it's loaded! 
    DoEvents 
    Wend 

    Set doc = ie.Document 'generic ref to IE's document object 
    Set elm = doc.getelementsbytagname("input")(0) 'generic ref to the first <input in the docs elements list 

    MsgBox elm.Name 'proove that we have valid ref 

ErrHandler: 
    Set elm = Nothing 
    Set doc = Nothing 
    Set ie = Nothing 
    If err.Number <> 0 Then 
    MsgBox err.Description, vbExclamation, "Error " & err.Number 
    End If 

End Function 

Это должно работать на любом компьютере с установленным IE, независимо от его версии.

Если вы просто выполняете базовое взаимодействие с DOM, то тонкие различия в версии не должны быть проблемой. (Но, конечно, они могли бы!)

Скорее всего, что в текущем коде, вы можете просто удалить ссылки, заменить:

Dim ie As New InternetExplorer 
Set ie = New InternetExplorer 

с

Dim ie As Object 
Set ie = CreateObject("InternetExplorer.Application", vbNullString) 

и изменить любую существующую переменную/parameter для Object.

От:

Dim doc As IHTMLDocument 'requires reference 
Function SomeFunction(doc As IHTMLAnchorElement) 

To:

Dim doc As Object 'does not require reference 
Function SomeFunction(doc As Object) 

Остальная часть кода может очень хорошо работать нормально после этого делать :)