Vba 为什么一次运行数百个VBS文件时,每次只有大约50个成功

Vba 为什么一次运行数百个VBS文件时,每次只有大约50个成功,vba,excel,vbscript,Vba,Excel,Vbscript,我有一份大约600种产品的清单,需要从中获取库存数据。 我可以从一个内部站点获取每个产品的信息,在那里我复制了一个表,该表专门显示了产品的存储位置(仓库、位置)。 由于VBA webscraping将以串行方式完成此操作,因此需要大约10~15分钟才能获得所有600个 通过VBScript并行执行,我可以大大缩短此时间。 我的VBA代码动态创建下面的VBScript,该脚本将数据拉回到Excel工作表中。 它可以工作,但无论我启动了多少个VBScript文件,一次只能为50~60个产品工作。其余

我有一份大约600种产品的清单,需要从中获取库存数据。 我可以从一个内部站点获取每个产品的信息,在那里我复制了一个表,该表专门显示了产品的存储位置(仓库、位置)。 由于VBA webscraping将以串行方式完成此操作,因此需要大约10~15分钟才能获得所有600个

通过VBScript并行执行,我可以大大缩短此时间。 我的VBA代码动态创建下面的VBScript,该脚本将数据拉回到Excel工作表中。 它可以工作,但无论我启动了多少个VBScript文件,一次只能为50~60个产品工作。其余部分失败,不返回输出或不将其放入工作表。 有人知道为什么会发生这种情况吗

我可以做些什么来调整我的vbscript代码,这样更多的代码就会成功? 谢谢你的帮助

VBSCRIPT:

Dim oXML, oXL, product, sHTML, tabl, x, y
On Error Resume Next

Set oXL = GetObject(, "Excel.Application")
Set oXML = Wscript.CreateObject("WinHttp.WinHttpRequest.5.1")

oXML.Open "GET", "internal-site", False
oXML.SetAutoLogonPolicy AutoLogonPolicy_Always
oXML.send

sHTML = oXML.responseText

x = InStr(sHTML, "<table  cellpadding=1  border=0 cellspacing=0 align=center>")
y = InStr(sHTML, "</table><br>") + 8
tabl = Mid(sHTML, x, y - x)

RandomNumber = Int(Rnd * 500)
Wscript.Sleep RandomNumber
oXL.workbooks("a3.xlsb").sheets("A").Cells(8, 3) = Mid(tabl, 1, 32767)
oXL.workbooks("a3.xlsb").sheets("A").Cells(8, 4) = Mid(tabl, 32768, 32767)
Dim-oXML、oXL、product、sHTML、tabl、x、y
出错时继续下一步
Set oXL=GetObject(,“Excel.Application”)
设置oXML=Wscript.CreateObject(“WinHttp.WinHttpRequest.5.1”)
打开“获取”,“内部站点”,False
oXML.SetAutoLogonPolicy自动生成策略\u始终
发送
sHTML=oXML.responseText
x=仪表(sHTML,“”)
y=仪表(sHTML,“
”)+8 tabl=Mid(sHTML,x,y-x) 随机数=整数(Rnd*500) 睡眠随机数 oXL.工作簿(“a3.xlsb”).表(“A”).单元格(8,3)=中间(表132767) oXL.工作簿(“a3.xlsb”).表(“A”).单元格(8,4)=中间(表32768,32767)
  • 为了强调chris的观点:用移除/禁用的邪恶全球机器人测试你的任务。由于OERN隐藏了错误,并允许您的脚本在未定义状态下继续,因此应该有一条规则“不要在此处根据活动的全局OERN提问”
  • 使用taskmanager监视您的任务:是否有Excel僵尸?记忆耗尽
  • 应检查WinHttpRequest的.Status
  • 应该检查这两个InStr()调用的结果,尤其是在Mid()调用的减法(y-x)中使用它们时
  • Mid()调用后的超时没有意义(在子字符串准备就绪之前,Mid()不会返回);一般来说,对资源进行随机等待是个坏主意
  • Post所有相关代码:是否确实调用了.Save、.Close和.Quit?你真的把所有东西都写在同一个工作簿、工作表、单元格中吗
  • 考虑:在服务器上同时启动600个请求不是DOS攻击吗

  • 第一件事首先,摆脱出错时的
    ,然后继续下一步
    。这是邪恶的,而且可能隐藏了你问题的根本原因。为什么你会
    睡眠
    一个随机的时间间隔?可能您需要最少的
    睡眠时间。“(…)VBA webscraping将以串行方式完成此操作(…)”-您是否检查了此问题:?您的问题可能是最后两行-当工作簿被另一个线程锁定以进行写入时,某些线程正在尝试写入工作簿。您可能需要检查写入是否成功,如果没有,请休眠并重试。如果这是内部操作:您不能直接从数据库读取信息,而不是从网站上抓取信息吗?