- 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/
我是网页设计新手。现在我遇到了我目前工作的 2 个网站的问题。我的模板只支持 Firefox 浏览器,不支持其他主流浏览器,如 IE、chrome、Opera、safari。 我试过一些 If IE
在我的 HTML 上,使用了下面的元标记来解决一些字体问题。我只想知道: 这两个元标记的含义相同吗?还是每一个都不一样? [以逗号分隔] [以分号分隔] 请解释一下。 最佳答案 Microsoft
这句话究竟是什么意思? 部分示例使用 ,分隔 IE 的版本,而有些使用 ; ;哪个是正确的? 订单IE=9; IE=8; IE=7; IE=EDGE有一些重要性,我想知道。 编辑:我正在使用 最佳答
这句话究竟是什么意思? 一些示例使用 ,分隔 IE 的版本,而有些使用 ; ;哪个是正确的? 订单IE=9; IE=8; IE=7; IE=EDGE有一定的重要性,我想知道。 编辑:我正在使用 最佳
在 IE 8 中,我们可以带出开发者工具。然后在顶部,有一个浏览器模式: IE 7 IE 8 IE 8 Compatibility View 所以如果 IE 7是强制页面显示为好像浏览器是 IE 7,
我认为不需要任何描述。我只需要我的 IE 11 单选按钮与 IE 8 中的一样,即颜色为 3-d 蓝色。在 IE 11 中,默认单选按钮是二维的,颜色为黑色。目前还没有解决这个问题。 最佳答案 检查这
我必须编写一个显示密码对话框的小程序。问题是对话框设置为始终在顶部,但是当用户单击 IE 窗口时,对话框仍然隐藏在 IE 窗口后面。并且由于对话框是模态的并且保持全部 IE 线程 IE Pane 不会
如何制作适用于所有 IE 浏览器的样式表。不只是 ie.css 中的 IE 8 本站主题的ie.css文件中只包含IE8样式。 最佳答案 他们这样做的原因是因为他们可能不支持 Internet Exp
使用有什么区别吗 ... 或者 ... ? 最佳答案 如果一种罕见的、神话般的浏览器被称为 ,就会有所不同。 Internet Explorer 6.66 被发现。 关于internet-explor
我试图在 IE7+8 中使用字体图标并遇到了一个问题,这个问题可以通过仅 IE7 的样式表轻松解决。长话短说,现在 IE7 和 IE9 都以某种方式运行我的仅 IE7 样式表(IE8 运行得很好)。我
我实现了上传的图片显示在网站上。为了 图片未正确上传意味着我将错误图片替换为 那?当我加载网站时,我遇到了 错误图像不存在的问题 定义,并且灯箱在 chrome 和 firefox 中加载 但它没有在
我有一个特殊的问题。我正在尝试“现代化”和为旧 IE 制作的旧应用程序,以便在 IE 11 中工作。但不知何故,CSS 类没有应用于 DOM 元素。 CSS 非常简单: .header { h
对于 IE 7 和 IE 8,IE 上 URL 的 2k 长度限制是否仍然存在? (后 IE 6 时代) 最佳答案 http://support.microsoft.com/kb/208427 似乎它
我们正在完善这个网站:dev.underglassframing.com 除了主要内容 div (#main) 后面的背景在 IE 7、8 和 9 中的内容之前停止外,在每个浏览器中一切都很好。我在末
我在 IE 11 中搜索过与 border-radius 相关的类似问题,但是 only one found on the Microsoft IE Developer site描述了自从“升级”到
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit th
这个问题在这里已经有了答案: (CSS?) Eliminating browser's 'selected' lines around a hyperlinked image? (5 个答案) 关闭
我知道有 1000 个问题,但我就是无法让它发挥作用。我只是想针对所有版本的 IE(包括 IE11)并给 html 一个特定的类,对于所有其他浏览器(firefox、opera、chrome),我希望
我有一个嵌入了 Internet Explorer 的程序。 在某些情况下,我需要调整嵌入式 IE 的缩放级别。我正在使用带有 OLECMDID_OPTICAL_ZOOM 的 ExecWB 命令来执行
我正在开发一个网络应用程序。我的应用程序在 chrome 和 firefox 上运行良好,但由于某种原因在 IE 中出现了一些错误。即使出现几个错误,应用程序仍然可以顺利运行,没有明显的问题。 我想对
我是一名优秀的程序员,十分优秀!