Excel 无法将三个单独的宏集成到一个宏中,以便使用单个按钮触发它们
我已经创建了三个单独的宏来从三个不同的站点抓取h1标签的内容。宏运行良好 我想将三个单独的宏集成到一个宏中,这样当我可以执行单个宏时,所有三个宏都将运行并在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
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)`。