Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 无法将三个单独的宏集成到一个宏中,以便使用单个按钮触发它们_Excel_Vba_Web Scraping - Fatal编程技术网

Excel 无法将三个单独的宏集成到一个宏中,以便使用单个按钮触发它们

Excel 无法将三个单独的宏集成到一个宏中,以便使用单个按钮触发它们,excel,vba,web-scraping,Excel,Vba,Web Scraping,我已经创建了三个单独的宏来从三个不同的站点抓取h1标签的内容。宏运行良好 我想将三个单独的宏集成到一个宏中,这样当我可以执行单个宏时,所有三个宏都将运行并在sheet1中写入内容 三个单独的宏如下所示: Sub FetchInfoOne() Const Url$ = "https://en.wikipedia.org/wiki/Kevin_Bacon" Dim Html As New HTMLDocument, elem As Object, ws As Wo

我已经创建了三个单独的宏来从三个不同的站点抓取h1标签的内容。宏运行良好

我想将三个单独的宏集成到一个宏中,这样当我可以执行单个宏时,所有三个宏都将运行并在
sheet1
中写入内容

三个单独的宏如下所示:

Sub FetchInfoOne()
    Const Url$ = "https://en.wikipedia.org/wiki/Kevin_Bacon"
    Dim Html As New HTMLDocument, elem As Object, ws As Worksheet, R&
    
    R = 1
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    With CreateObject("MSXML2.XMLHTTP")
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector("h1#firstHeading")
    If Not elem Is Nothing Then
        ws.Cells(R, 1) = elem.innerText
    End If
End Sub

Sub FetchInfoTwo()
    Const Url$ = "https://www.tutorialspoint.com/vba/index.htm"
    Dim Html As New HTMLDocument, elem As Object, ws As Worksheet, R&
    
    R = 1
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    With CreateObject("MSXML2.XMLHTTP")
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector(".tutorial-content > h1")
    If Not elem Is Nothing Then
        ws.Cells(R, 1) = elem.innerText
    End If
End Sub

Sub FetchInfoThree()
    Const Url$ = "https://stackoverflow.com/questions/tagged/web-scraping"
    Dim Html As New HTMLDocument, elem As Object, ws As Worksheet, R&
    
    R = 1
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    With CreateObject("MSXML2.XMLHTTP")
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector("h1.fs-headline1")
    If Not elem Is Nothing Then
        ws.Cells(R, 1) = elem.innerText
    End If
End Sub

最简单的方法可能是创建另一个子系统并执行相应的过程

Sub Caller
Call FetchInfoOne
Call FetchInfoTwo
Call FetchInfoThree
End Sub

最简单的方法可能是创建另一个子系统并执行相应的过程

Sub Caller
Call FetchInfoOne
Call FetchInfoTwo
Call FetchInfoThree
End Sub

您的三个例程所做的几乎相同,因此创建一个例程并传递带有细节的参数是一个好主意

Sub FetchInfo(url as string, querySelector as String, destCell as Range)
    Dim Html As New HTMLDocument, elem As Object, ws As Worksheet, R&

    With CreateObject("MSXML2.XMLHTTP")
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector(querySelector)
    If Not elem Is Nothing Then
        destCell = elem.innerText
    End If
End Sub
现在,您可以创建一个通过按钮调用的例程:

Sub FetchAll()
    Dim ws as Worksheet
    set ws = ThisWorkbook.sheets("Sheet1")
    
    FetchInfo  "https://en.wikipedia.org/wiki/Kevin_Bacon", "h1#firstHeading", ws.Cells(1, 1)
    FetchInfo  "https://www.tutorialspoint.com/vba/index.htm", ".tutorial-content > h1", ws.Cells(2, 1)
    FetchInfo  "https://stackoverflow.com/questions/tagged/web-scraping", "h1.fs-headline1", ws.Cells(3, 1)
End Sub

好处:a)代码更少。b) 更灵活-很容易添加另一个URL或将其写入工作表中的其他位置。c) 您可以将获取数据的逻辑与写入工作表的逻辑分开。

您的三个例程的作用几乎相同,因此最好创建一个例程,并传递带有详细信息的参数

Sub FetchInfo(url as string, querySelector as String, destCell as Range)
    Dim Html As New HTMLDocument, elem As Object, ws As Worksheet, R&

    With CreateObject("MSXML2.XMLHTTP")
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector(querySelector)
    If Not elem Is Nothing Then
        destCell = elem.innerText
    End If
End Sub
现在,您可以创建一个通过按钮调用的例程:

Sub FetchAll()
    Dim ws as Worksheet
    set ws = ThisWorkbook.sheets("Sheet1")
    
    FetchInfo  "https://en.wikipedia.org/wiki/Kevin_Bacon", "h1#firstHeading", ws.Cells(1, 1)
    FetchInfo  "https://www.tutorialspoint.com/vba/index.htm", ".tutorial-content > h1", ws.Cells(2, 1)
    FetchInfo  "https://stackoverflow.com/questions/tagged/web-scraping", "h1.fs-headline1", ws.Cells(3, 1)
End Sub

好处:a)代码更少。b) 更灵活-很容易添加另一个URL或将其写入工作表中的其他位置。c) 您可以将获取数据的逻辑与写入工作表的逻辑分开。

我将以以下方式集成并使用宏:

Sub Run()
    Dim Http As Object, linkList As Variant, Url As Variant
    Dim ws As Worksheet, R&
    
    R = 1
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set Http = CreateObject("MSXML2.XMLHTTP")
    
    linkList = Array( _
        "https://en.wikipedia.org/wiki/Kevin_Bacon", _
        "https://www.tutorialspoint.com/vba/index.htm", _
        "https://stackoverflow.com/questions/tagged/web-scraping" _
    )
    
    For Each Url In linkList
        If InStr(Url, "en.wikipedia.org") > 0 Then
            FetchInfoOne Http, Url, ws, R
        ElseIf InStr(Url, "www.tutorialspoint.com") > 0 Then
            FetchInfoTwo Http, Url, ws, R
        ElseIf InStr(Url, "stackoverflow.com") > 0 Then
            FetchInfoThree Http, Url, ws, R
        End If
        R = R + 1
    Next Url
End Sub

Sub FetchInfoOne(Http As Object, Url As Variant, ws As Worksheet, R)
    Dim Html As New HTMLDocument, elem As Object

    With Http
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector("h1#firstHeading")
    If Not elem Is Nothing Then
        ws.Cells(R, 1) = elem.innerText
    End If
End Sub

Sub FetchInfoTwo(Http As Object, Url As Variant, ws As Worksheet, R)
    Dim Html As New HTMLDocument, elem As Object

    With Http
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector(".tutorial-content > h1")
    If Not elem Is Nothing Then
        ws.Cells(R, 1) = elem.innerText
    End If
End Sub

Sub FetchInfoThree(Http As Object, Url As Variant, ws As Worksheet, R)
    Dim Html As New HTMLDocument, elem As Object

    With Http
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector("h1.fs-headline1")
    If Not elem Is Nothing Then
        ws.Cells(R, 1) = elem.innerText
    End If
End Sub

我将以以下方式集成和使用宏:

Sub Run()
    Dim Http As Object, linkList As Variant, Url As Variant
    Dim ws As Worksheet, R&
    
    R = 1
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set Http = CreateObject("MSXML2.XMLHTTP")
    
    linkList = Array( _
        "https://en.wikipedia.org/wiki/Kevin_Bacon", _
        "https://www.tutorialspoint.com/vba/index.htm", _
        "https://stackoverflow.com/questions/tagged/web-scraping" _
    )
    
    For Each Url In linkList
        If InStr(Url, "en.wikipedia.org") > 0 Then
            FetchInfoOne Http, Url, ws, R
        ElseIf InStr(Url, "www.tutorialspoint.com") > 0 Then
            FetchInfoTwo Http, Url, ws, R
        ElseIf InStr(Url, "stackoverflow.com") > 0 Then
            FetchInfoThree Http, Url, ws, R
        End If
        R = R + 1
    Next Url
End Sub

Sub FetchInfoOne(Http As Object, Url As Variant, ws As Worksheet, R)
    Dim Html As New HTMLDocument, elem As Object

    With Http
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector("h1#firstHeading")
    If Not elem Is Nothing Then
        ws.Cells(R, 1) = elem.innerText
    End If
End Sub

Sub FetchInfoTwo(Http As Object, Url As Variant, ws As Worksheet, R)
    Dim Html As New HTMLDocument, elem As Object

    With Http
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector(".tutorial-content > h1")
    If Not elem Is Nothing Then
        ws.Cells(R, 1) = elem.innerText
    End If
End Sub

Sub FetchInfoThree(Http As Object, Url As Variant, ws As Worksheet, R)
    Dim Html As New HTMLDocument, elem As Object

    With Http
        .Open "Get", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
        .send
        Html.body.innerHTML = .responseText
    End With
    
    Set elem = Html.querySelector("h1.fs-headline1")
    If Not elem Is Nothing Then
        ws.Cells(R, 1) = elem.innerText
    End If
End Sub

是的,我也注意到了这一点,但是如果我想把这三个URL放在
caller
子例程中,这会如何帮助我循环三个URL。所以有另一个例程要求这三个URL或只是一个列表……是的,我也注意到了这一点,但是如果我想将这三个URL放在
调用者
子例程中,这将如何帮助我循环三个URL。因此,有另一个例程要求这三个URL或只是一个列表……如果它们都成功,它们会覆盖结果吗?那么您只剩下最后一个集合了?您可以连续调用它们中的每一个,但是修改第二个和第三个宏中的行
ws.cells(R,1)=elem.innerText
,如
(R,2)
和`(R,3)`。如果它们都成功,它们会覆盖结果吗?那么您只剩下最后一个集合了?您可以连续调用它们中的每一个,但是修改第二个和第三个宏中的行
ws.cells(R,1)=elem.innerText
,如
(R,2)
和`(R,3)`。