VBA遍历行并返回值

时间:2019-02-24 09:00:05

标签: excel vba web-scraping

真的希望您对此有所帮助。我有一个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类型参数不匹配错误

我也不知道如何实现将值调用到循环中正在处理的特定行。任何帮助将不胜感激。谢谢

1 个答案:

答案 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