- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我多次刮取信息网站并将其插入单元格时,Excel崩溃
我已经在我的代码集中包含了IE = Nothing和IE Quit,但是它并没有改变代码在多次迭代后返回错误的事实
我的代码包括一个循环部分和实际的抓取。这是循环:
Public Sub LooperForMMDescription()
Dim currentValue As String
Dim dataList As Variant
Dim i As Integer
Dim n As Integer
Dim FirstRow As Integer
Dim IE As Object
n = 1
Set dataList = Range("Table6")
FirstRow = Range("Table6").Row - 1
'On Error Resume Next
Set IE = Nothing
For i = 1 To UBound(dataList.Value)
If IsEmpty(dataList.Value) Then
Exit Sub
Else
currentValue = dataList(i, 1).Text
If Len(currentValue) = 0 Then
GoTo ByPass
End If
Call MM_description(currentValue, n, FirstRow, IE)
ByPass:
n = n + 1
End If
Next i
Sheets("Input").Range("F7").Select
End Sub
Public Sub MM_description(currentValue As String, n As Integer, FirstRow As Integer, IE As Object)
Dim html As HTMLDocument
Dim codeLine As String
Dim startPos As Long
Dim endPost As Long
Set IE = Nothing
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.Navigate2 (currentValue)
Do While IE.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
mes = IE.document.body.innerHTML
startPos = InStr(mes, "Description") + 61
endPos = InStr(mes, "Address")
If startPos = 0 Then
Sheets("Input").Range("F" & FirstRow + n).Value = "Not Found"
Else
codeLine = Mid(mes, startPos, endPos - startPos - 229)
Sheets("Input").Range("F" & FirstRow + n).Value = codeLine
End If
IE.Quit
Set IE = Nothing
End Sub
最佳答案
因此,这不仅仅是答案,而是代码审查。以下是有关代码的注释和建议的重写。
请使用Long
而不是Integer
,因为这可以降低Integer
数据类型可能发生的溢出风险,尤其是在处理行循环时(行多于Integer
可以处理的行)。此外,Integer v Long
在这里没有性能优势。
驼峰式局部变量
firstRow
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Activesheet
引用。从上面使用
ws
变量:
Range("Table6")
Activesheet
参考的表可以具有显式表参考
ws.Range("Table6")
dataList.value
是一个二维数组,因为您正在从工作表中读取范围:
For i = 1 To UBound(dataList.Value)
table6
是什么样子,但我怀疑您正在尝试循环特定的列(可能是第一列)
Dim arr(), table As ListObject, output()
Set table = ws.ListObjects("Table6")
arr = Application.Transpose(table.ListColumns(1).DataBodyRange.Value)
ReDim output(1 To UBound(arr))
If IsEmpty(dataList.Value) Then
Exit Sub
Else
If Else End If
的班轮
If IsEmpty(arr) Then Exit Sub
currentValue
更改为
currentUrl
,因为这对IMO更为有用。
If Len(currentValue) = 0 Then
GoTo ByPass
End If
vbNullString
比较,甚至更好的
Instr(url, "http") > 0
来验证将要使用的值:
'initial code
If currentUrl <> vbNullString Then 'test
'call the sub and extract value
End If
n = n + 1 'increment....loop....rinse....repeat
If instr(currentUrl, "http") > 0 Then 'test
'call the sub and extract value
End If
n = n + 1 'increment....loop....rinse....repeat
i
的循环变量,因此根本不需要
n
。特别是考虑到以相同的索引填充输出数组。
ie
.....时,
Dim ie As
已经不算什么了。您想在开始时实例化该对象
Set ie = CreateObject("InternetExplorer.Application")
ie
,因此预计您将传递相同的实例:
Public Sub MM_description(currentValue As String, n As Long, firstRow As Long, ie As Object)
ByRef
,
ByVal
添加到签名
Public Sub MM_description(ByVal currentValue As String, ByVal n As Long, ByVal firstRow As Long, ByVal ie As Object)
Call
关键字,并删除
()
,因为这是带有参数的子程序
Call MM_description(currentValue, n, firstRow, ie) > MM_description currentValue, n, firstRow, ie
ie
传递给子
MM_description
时,您不想再对其进行引用,并在被调用的子内部实例化一个新实例。因此,删除
Set ie = Nothing
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = False
MM_description
内部
()
ie.Navigate2 (currentUrl)
ie.Navigate2 currentUrl
Do While ie.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
while .busy or .readystate <> 4:wend
Dim html As HTMLDocument
,并声明所有其他已使用的代码,例如
Dim mes As String
。将
Option Explicit
放在模块顶部,以检查变量拼写和声明的一致性。
MM_description
转换为一个函数,该函数返回抓取的字符串值或
"Not Found"
,并在调用该函数的同一循环中填充输出数组。
()
在进行评估时返回。
output(i) = MM_description(currentUrl, n, firstRow, ie)
output
数组到想要输出值的任何范围。
Worksheets("Input").Range("F1").Resize(UBound(output), 1) = Application.Transpose(output)
Option Explicit
Public Sub LooperForMMDescription()
Dim currentUrl As String, i As Long
Dim ie As Object, ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set table = ws.ListObjects("Table6")
Dim arr(), table As ListObject, output()
arr = Application.Transpose(table.ListColumns(1).DataBodyRange.Value)
ReDim output(1 To UBound(arr))
Set ie = CreateObject("InternetExplorer.Application")
If IsEmpty(arr) Then Exit Sub
ie.Visible = True
For i = LBound(arr) To UBound(arr)
currentUrl = arr(i)
If InStr(currentUrl, "http") > 0 Then 'test
'call the sub and extract value
output(i) = MM_description(currentUrl, i, ie)
End If
Next i
ie.Quit
ThisWorkbook.Worksheets("Input").Range("F1").Resize(UBound(output), 1) = Application.Transpose(output)
End Sub
Public Function MM_description(ByVal currentUrl As String, ByVal i As Long, ByVal ie As Object) As String
Dim codeLine As String, startPos As Long, endPos As Long, mes As String
With ie
.Navigate2 currentUrl
While .Busy Or .readyState < 4: DoEvents: Wend
mes = .document.body.innerHTML
startPos = InStr(mes, "Description") + 61
endPos = InStr(mes, "Address")
If startPos = 0 Then
MM_description = "Not Found"
Else
codeLine = Mid$(mes, startPos, endPos - startPos - 229)
MM_description = codeLine
End If
End With
End Function
关于excel - 避免多次运行IE Web抓取时崩溃VBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56947117/
我有一个几乎可以构建的Maven / Grails应用,但在web.xml上找不到[my-app]\webapp\WEB-INF\web.xml。但是目录结构像往常一样包含web-app文件夹,而不是
正如我在标题中提到的:我想知道 web-service 和 web-socket 之间的区别?我们什么时候使用每一个? 谢谢! 最佳答案 一个web service是一个响应客户端 SOAP/REST
让我们看一个示例场景: 客户端打开一个网站并找到他从文本框中输入的两个数字的总和。然后单击“添加”按钮。两个参数通过 HTTP GET 发送到服务器,在服务器上写入 PHP 代码以添加数字,结果为回声
我知道这是一个老问题,肯定已经被回答了数百次,但我还无法找到令人满意的答案。 我正在创建一个应用程序,其他应用程序(移动/网络)将使用该应用程序来获取数据。现在我有两个选择: 将我的应用程序创建为简单
通过 Web 作业部署新功能有 3 种方法: 创建一个新的 Web 应用,并部署一个包含该函数的 Web 作业。 向现有 Web 作业添加一项新函数(这样您现在在一个 Web 作业中就拥有了多个函数)
我收到来自网络场景的通知,上面写着“问题”和“确定”。我想在问题发生时包含网络响应的内容。我不担心标题值,只担心网页的内容. 这是我可以在通知设置中引用的变量吗? 最佳答案 不幸的是 zabbix 不
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
嗨,这是一个理论问题,但我真的无法弄清楚 Web 应用程序、基于 Web 的应用程序和基于云的应用程序之间的区别。这个你能帮我吗。 最佳答案 @Matt 是对的 - 这真的无关紧要,但是,为了清楚起见
我正在尝试使用多个 Web 服务,这些服务在它们的 wsdl 中重新定义了一些相同的公共(public)类。我目前在网站中引用了它们,但我想转换为 Web 应用程序。 由于一些相同的类是从多个 Web
一个。我必须考虑哪些事项?b.当前应用程序正在执行多个存储过程。如果我创建等效的方法来执行这些过程,会有什么风险或挑战。 最佳答案 在架构上,将网络应用程序转换为网络服务时必须考虑的一件事是,对方法和
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
网络 API 和网络服务之间有什么区别吗?或者它们是同一个吗? 最佳答案 网络服务通常提供 WSDL您可以从中自动创建客户端 stub 。 Web 服务基于 SOAP protocol 。ASP.NE
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我正在使用 stub 将我的网络服务相关测试与实际网络服务隔离开来。 你/我应该如何合并测试以确保我制作的响应与实际的网络服务匹配(我无法控制它)? 我不想知道怎么做,而是何时何地? 我应该为测试数据
我在互联网上搜索了很多,但我仍然没有得到网络服务和网络 API 之间的明显区别?我在某处读到所有 Web 服务都是 API,但所有 API 都不是 Web 服务。如何? 我所知道的是两者都允许利用其他
假设我已经完成了使用 JavaEE 制作的 Web 应用程序。这个 Web 应用程序包含登录系统,但最后它是非常基本的 Web 应用程序。我使用的是 GlassFish 3.1.2.2。 我想知道一旦
我希望设计者能够打开与我相同的解决方案文件。这可以通过 Expressions Web 实现吗? 最佳答案 简短的回答是“不”;但这是一个非常常见的请求,我知道很多人都希望下一个版本(无论何时)对此有
我正在尝试在 CF10 中创建一个 Web 服务对象。我已验证它在 SoapUI 中按预期工作。但是,当我在 CF 中运行它时,我得到一个错误,它无法找到在 WSDL 的导入语句中导入的 XSD。这是
我的要求是开发一个 Web 服务,充当外部 Web 服务和客户端之间的中间人。 我知道,我可以为我的服务设计一个wsdl,然后将外部wsdl映射到代码中我的wsdl。我的问题是有一个开源 api/工具
我是一名优秀的程序员,十分优秀!