Excel VBA:自动化错误 - 远程过程调用失败

时间:2013-06-17 19:03:15

标签: regex excel vba excel-vba internet-explorer

我从网站上提取某些数据。我必须为表中的至少百万行执行此任务。我正在使用excel VBA连接MySQL。

  • 使用MySQL连接excel VBA,我从表中获取名字,作者的姓氏。
  • 对于作者的名字,姓氏,我将Linkedin添加到搜索查询中,我正在谷歌搜索。
  • 从搜索结果中,我打开HTML格式的第一个搜索结果页面并提取一些信息。
  • 我把一些提取的信息放回MySQL表中。

按照上述步骤,一切正常。但是,如果我尝试超过10行,我会收到以下错误。

  

自动化错误远程过程调用失败且未执行

我意识到这与IE的开启/关闭有关。在我的程序中,我有以下代码。

要创建新的IE应用程序,我已定义如下。

Set ie = New InternetExplorer
Set RegEx = New RegExp
Dim iedoc As Object
ie.Navigate "http://www.google.com/search?hl=en&q=" & FirstName & "+" & LastName &  
"+linkedin&meta="
Do Until ie.ReadyState = READYSTATE_COMPLETE
Loop
MyStr = ie.Document.body.innerText
Set RegMatch = RegEx.Execute(MyStr)

在为一位作者提取数据之后,我在最后有一段代码。

ie.Quit
Set RegEx = Nothing
Set ie = Nothing
Dim strBatchName As String
strBatchName = "F:\command.bat"
Shell strBatchName

command.bat具有以下代码。

taskkill.exe /F /IM iexplore.exe /T

如果我的表格中有少于10行,那么它的效果非常好。但是,对于更多行,我确实得到了上面提到的错误。

2 个答案:

答案 0 :(得分:3)

我更倾向于使用相同的ie实例来获取所有作者数据,如下例所示循环遍历它们。另外,您的批处理文件用于处理数据是什么?我从未发现需要批处理文件来帮助执行vba。你用它们写文本文件吗?你也可以用vba完成它。

Dim ie As Object, lastRowAuthors as long, i as long, strBatchName As String

lastRowAuthors = sheets("Authors").Cells(Rows.Count, 1).End(xlUp).row
Set ie = New InternetExplorer


for i = 1 to lastRowAuthors

    ie.Navigate "http://www.google.com/search?hl=en&q=" & sheets("Authors").range("A" & i).value  & "+" & sheets("Authors").range("B" & i).value &  
    "+linkedin&meta="
    Do Until ie.ReadyState = READYSTATE_COMPLETE
    Loop


    Set RegEx = New RegExp

    MyStr = ie.Document.body.innerText
    Set RegMatch = RegEx.Execute(MyStr)

'*****************************************************************
'   Use your REGEX commands to extract data
'*****************************************************************
    strBatchName = "F:\command.bat"
    Shell strBatchName
next i

ie.Quit
Set RegEx = Nothing
Set ie = Nothing

end sub

答案 1 :(得分:1)

我遇到了类似的问题,我找到的解决方案是:

  1. 使用John Muggins建议的版本,您只需退出并在循环结束后将Internet设置为空。
  2. 在每次搜索之间添加一个暂停,例如秒,以确保它可以浏览每个记录并搜索它们没有任何问题。为了做到这一点,我建议在Application.Wait Now + 1行之前添加ie.Navigate,或者添加额外的子进行此操作

    Sub WaitFor(PauseInSeconds As Long)
      Dim SngSec As Long
      SngSec = Timer + PauseInSeconds
      Do While Timer < SngSec
      DoEvents
    Loop
    

    End Sub

  3. 额外:如果你按照你所说的那样拥有数百万行&#34;你肯定应该添加一个错误处理程序来检索代码崩溃的最终行,这样你就不必确保它一直运行正常。使用On Error Resume Next执行此操作。然后,您可以手动检查这些行,将其索引存储在一个数组中,然后再次遍历每个行。