有时HTML引用不起作用

时间:2015-10-08 16:13:32

标签: vba excel-vba excel

好的,这里有。我正在使用2010 Excel VBA遇到间歇性问题。我写了一些复杂的代码来与几个网站进行交互以收集信息。除了偶尔之外,这种方式完美无瑕。问题不在于代码,而在于引用。偶尔,我会引用问题:

“编译错误:

不支持对象库功能“

从网页设置HTML文档时出现障碍。为了解决这个问题,我所要做的就是取消选择“Microsoft Internet Controls”和“Microsoft HTML Object Library”引用,保存文件,然后重新选择这些引用,它一次可以运行数周。这似乎是在多个用户的多台计算机上随机发生的。

随着宏启用excel文件的使用继续扩展到我的公司,这将成为快速解决其他用户的这个问题的一个主要问题,知道它将再次发生。如何永久阻止这种“遗忘”?

感谢您提前提供任何帮助。

注意:我没有发布任何代码,因为只要注意到此引用问题,它就会按设计工作。受影响的代码是

“设置doc = ie.document”

1 个答案:

答案 0 :(得分:0)

我猜测一个或多个用户有不同版本的IE。当他们打开文件时,它(重新)将ref设置为他们的.dll版本,并且从那时起ref。我根据过去的问题猜测他们的版本更高。您可以通过在所有计算机上检查ieframe.dll和mshtml.tbl的属性来验证。

当用户拥有不同版本的办公室时,我遇到了在Access中使用Excel / Word / ETC的类似问题。我通过从它最通用的类​​创建对象而不是使用引用来解决。专业人士不需要参考,版本通常不重要。缺点是你没有获得对象浏览器信息,版本有时很重要,不能使用WithEvents并且是盲目编码,所以你必须知道你正在做什么。

这是一个如何在没有引用的情况下使用IE的基本示例。只需将其粘贴到新的Excel文件的ThisWorkbook Module中即可进行测试。

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)

,并将任何现有的变量/参数类型更改为Object。

自:

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

要:

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

执行此操作后,其余代码可以正常工作:)