真的希望您对此有所帮助。我有一个vba脚本来抓取数据,它打开了L列(在此示例中为L4)中包含的URL。然后,在脚本后面,它将我的给定值输入到E行第4行。
Sub ImportData()
...
With CreateObject("msxml2.xmlhttp")
.Open "GET", Range("L4"), False 'Cell that contains hyperlink
.send
HTML_Content.body.innerHTML = .responseText
End With
...
'Then I want to return a value
Sheets(1).Range("E4").Value = rng1.Offset(0, 1)
End Sub
我试图进行循环,以使脚本自动运行并在L列中循环,并为Col L中包含超链接的每一行运行脚本,然后将值输入到Col E中的相应行。 / p>
我尝试更改下面另一个用户建议的代码但没有成功:
Sub ImportData(urlToOpen as string)
...
.Open "GET", urlToOpen, False 'Cell that contains hyperlink
...
'Then I want to return a value
Sheets(1).Range(E, i).Value = rng1.Offset(0, 1) ' I know that's wrong
并添加一个调用过程:
Sub CallRangeL_Urls()
For Each i In Sheet1.Range("L4:L200")
Call ImportData(i)
Next i
End Sub
我在Call ImportData(i)
上不断收到ByRef类型参数不匹配错误
我也不知道如何实现将值调用到循环中正在处理的特定行。任何帮助将不胜感激。谢谢
答案 0 :(得分:1)
尝试以下操作:
Public Sub ImportData(ByVal urlToOpen As String)
和
Public Sub CallRangeL_Urls()
Dim i As Range
For Each i In Sheet1.Range("L4:L200")
ImportData i.Value
Next i
End Sub
我个人也会参考工作簿,并且我通常使用Worksheets("SheetName")
,但我知道很多人喜欢使用codeName。
您只想在单元格中传递链接的值,因此ByVal
是合适的方法。
由于要触摸表格很昂贵,因此我可能会将网址转储到数组中并进行循环,从而添加我正在使用网址的基本测试:
Public Sub CallRangeL_Urls()
Dim arr(), i As Long
arr = Application.Transpose(Sheet1.Range("L4:L200").Value)
For i = LBound(arr) To UBound(arr)
If InStr(arr(i), "http") > 0 Then ImportData arr(i)
Next i
End Sub
要将提取的值写到与url相同的E列中,我认为您需要将ImportData
子级转换为返回提取的值的函数。或者更好的方法是,创建一个类来保存xmlhttp对象,然后该类具有一个返回值的方法(这样,您就不必继续创建和销毁该对象了-如果您在函数中创建该对象,则可以这样做。在第一个子目录中创建xmlhttp对象,并将其作为参数传递给函数-我在下面为您展示了伪代码)。
Public Sub CallRangeL_Urls()
Dim arr(), i As Long
'code to create xmlhttp object
arr = Application.Transpose(Sheet1.Range("L4:L200").Value)
For i = LBound(arr) To UBound(arr)
If InStr(arr(i), "http") > 0 Then
Sheet1.Cells(i + 3, "E") = ImportData(arr(i), xmlhttpObject)
End If
Next i
End Sub
Public Function ImportData(ByVal urlToOpen As String, ByVal xmlhttpObject As Object) As String
''Any declarations
'Dim extractedValue As String
'Dim html As HTMLDocument
'Set html = New HTMLDocument
With xmlhttpObject
.Open "GET", urlToOpen, False
.send
html.body.innerHTML = .responseText
''code to extract value
'extractedValue = html.querySelector("someSelector")
ImportData = extractedValue
End Function