代码之家  ›  专栏  ›  技术社区  ›  James

VBA循环行和返回值

  •  0
  • James  · 技术社区  · 6 年前

    我真的很感激你能帮我。我有一个vba脚本,它可以刮取数据,它打开包含在L列中的URL,在本例中是L4。然后在脚本中输入给定的值到第4行的列E中。

    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中循环,并为列L中包含超链接的每一行运行脚本,然后将值输入列E中相应的行。

    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
    

    我不断得到ByRef类型参数不匹配的错误 Call ImportData(i)

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

    0 回复  |  直到 6 年前
        1
  •  1
  •   QHarr    6 年前

    请尝试以下操作:

    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") 但我知道很多人喜欢用代号。

    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
    

    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
    
    推荐文章