3

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

  • 使用 MySQL 与 excel VBA 连接,我从表中获取作者的名字和姓氏。
  • 对于作者的名字和姓氏,我将 Linkedin 附加到搜索查询中,并在 Google 中搜索。
  • 从搜索结果中,我打开了 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 行,它工作得非常好。但是,对于更多行数,我确实得到了上述错误。

4

2 回答 2

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
于 2017-01-30T14:25:26.933 回答
1

我有一个类似的问题,我找到的解决方案是:

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

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

    结束子

  3. 额外:如果你有你所说的“数百万行”,你肯定应该添加一个错误处理程序来检索代码崩溃的最终行,这样你就不必确保它一直正常运行。使用On Error Resume Next. 然后,您可以手动检查这些行,或者将它们的索引存储在一个数组中,然后再次检查它们中的每一个。

于 2017-02-01T11:42:45.877 回答