【问题标题】:Adaptation of the program code (windows 7) to windows 10 / office 10程序代码(windows 7)适配windows 10 / office 10
【发布时间】:2019-04-01 08:10:30
【问题描述】:

我有一个程序(站点解析),在 windows 7 上运行良好。转向 windows 10 / office 10,它显示不再支持 MSXML,我需要重写程序。第一次尝试重写代码,出现错误:

运行时错误“-2147467259(80004005)”: 自动化错误 未指明的错误

排队:

Set objIE = New InternetExplorer

旧代码:

Function extractTable(Ssilka As String, book1 As Workbook, iLoop As Long)
   Dim oDom As Object, oTable As Object, oRow As Object
   Dim iRows As Integer, iCols As Integer
   Dim x As Integer, y As Integer
   Dim data()
   Dim vata()
   Dim tata()
   Dim oHttp As Object
   Dim oRegEx As Object
   Dim sResponse As String
   Dim oRange As Range
   Dim odRange As Range

' get page
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET", Ssilka, False
oHttp.Send

' cleanup response
sResponse = StrConv(oHttp.responseBody, vbUnicode)
Set oHttp = Nothing

sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))

Set oRegEx = CreateObject("vbscript.regexp")
With oRegEx
    .MultiLine = True
    .Global = True
    .IgnoreCase = False
    .Pattern = "<(script|SCRIPT)[\w\W]+?</\1>"
    sResponse = .Replace(sResponse, "")
End With
Set oRegEx = Nothing

' create Document from response
Set oDom = CreateObject("htmlFile")
oDom.Write sResponse
DoEvents

' table with results, indexes starts with zero
Set oTable = oDom.getelementsbytagname("table")(3)

DoEvents

iRows = oTable.Rows.Length
iCols = oTable.Rows(1).Cells.Length

' first row and first column contain no intresting data
ReDim data(1 To iRows - 1, 1 To iCols - 1)
ReDim vata(1 To iRows - 1, 1 To iCols - 1)
ReDim tata(1 To iRows - 1, 1 To iCols - 1)
' fill in data array
For x = 1 To iRows - 1
    Set oRow = oTable.Rows(x)

    For y = 1 To iCols - 1
         If oRow.Cells(y).Children.Length > 0 Then
            data(x, y) = oRow.Cells(y).getelementsbytagname("a")(0).getattribute("href")
                data(x, y) = Replace(data(x, y), "about:", "http://allscores.ru/soccer/")
            vata(x, y) = oRow.Cells(y).innerText

        End If

    Next y
Next x

Set oRow = Nothing
Set oTable = Nothing
Set oDom = Nothing

Set oRange = book1.ActiveSheet.Cells(110, 26 + (iLoop * 21)).Resize(iRows - 1, iCols - 1)
oRange.NumberFormat = "@"
oRange.Value = data

Set odRange = book1.ActiveSheet.Cells(34, 26 + (iLoop * 21)).Resize(iRows - 1, iCols - 1)
odRange.NumberFormat = "@"
odRange.Value = vata

Set oRange = Nothing
Set odRange = Nothing

End Function

新代码:

  Function extractTable(Ssilka As String, book1 As Workbook, iLoop As Long)
  Dim oTable As Object, oRow As Object
  Dim iRows As Integer, iCols As Integer
  Dim x As Integer, y As Integer
  Dim data()
  Dim vata()
  Dim tata()
  Dim oRange As Range
  Dim odRange As Range
  Dim objIE As InternetExplorer 'special object variable representing the IE browser

 'initiating a new instance of Internet Explorer and asigning it to objIE
Set objIE = New InternetExplorer

'make IE browser visible (False would allow IE to run in the background)
objIE.Visible = False

'navigate IE to this web page (a pretty neat search engine really)
objIE.navigate Ssilka

'wait here a few seconds while the browser is busy
Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

' table with results, indexes starts with zero
Set oTable = objIE.document.getElementsByTagName("table")(3)

DoEvents

iRows = oTable.Rows.Length
iCols = oTable.Rows(1).Cells.Length

' first row and first column contain no intresting data
ReDim data(1 To iRows - 1, 1 To iCols - 1)
ReDim vata(1 To iRows - 1, 1 To iCols - 1)
ReDim tata(1 To iRows - 1, 1 To iCols - 1)
' fill in data array
For x = 1 To iRows - 1
    Set oRow = oTable.Rows(x)

    For y = 1 To iCols - 1
         If oRow.Cells(y).Children.Length > 0 Then
            data(x, y) = oRow.Cells(y).getElementsByTagName("a")(0).getattribute("href")
                data(x, y) = Replace(data(x, y), "about:", "http://allscores.ru/soccer/")
            vata(x, y) = oRow.Cells(y).innerText

        End If

    Next y
Next x

Set oRow = Nothing
Set oTable = Nothing

Set oRange = book1.ActiveSheet.Cells(110, 26 + (iLoop * 21)).Resize(iRows - 1, iCols - 1)
oRange.NumberFormat = "@"
oRange.Value = data

Set odRange = book1.ActiveSheet.Cells(34, 26 + (iLoop * 21)).Resize(iRows - 1, iCols - 1)
odRange.NumberFormat = "@"
odRange.Value = vata

Set oRange = Nothing
Set odRange = Nothing
 'close the browser
objIE.Quit
End Function

【问题讨论】:

  • 我尝试在 Windows 10 机器上测试你的新代码。根据我的测试结果,我发现在设置 IE 对象时我没有收到任何错误。如果您遇到错误而不是尝试使用其他方法设置 IE 对象,例如 Set IE = CreateObject("InternetExplorer.Application") 我建议您首先尝试在该机器上测试简单的自动化,然后尝试运行您的原代码。

标签: excel vba parsing internet-explorer


【解决方案1】:

您可以只更新您的参考,而不是重新编写它以使用 Internet Explorer。您使用的 MSXML2.XMLHTTP 在 Windows 10 中不再存在,因为它已更新到更高版本。尝试改用MSXML2.XMLHTTP.6.0

【讨论】:

  • 他正在使用后期绑定呼叫,所以这仍然适用吗?它在 Windows 8 版本上没有问题。我无法使用 Windows 10 进行测试,所以很高兴知道您是否已经测试过。
【解决方案2】:

1) 工具 - 参考(选择 Microsoft XML,v6.0)

2)换行:

Dim oHttp As MSXML2.XMLHTTP60

设置 oHttp = CreateObject("MSXML2.XMLHTTP.6.0")

现在可以了。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2016-06-14
    • 2018-10-27
    相关资源
    最近更新 更多