Html lls rng.Value=currentColumn.outerText 设置rng=rng偏移量(,1) i=i+1 下一列 outputRow=outputRow+1 设置rng=rng偏移量(1,-i) i=0 下一行 Application.ScreenUpdating=True 端接头
输出:Html lls rng.Value=currentColumn.outerText 设置rng=rng偏移量(,1) i=i+1 下一列 outputRow=outputRow+1 设置rng=rng偏移量(1,-i) i=0 下一行 Application.ScreenUpdating=True 端接头,html,vba,excel,web-scraping,Html,Vba,Excel,Web Scraping,输出: Option Explicit Declare PtrSafe Sub sleep Lib "kernel32" Alias "Sleep" (ByVal dwmilliseconds As Long) Public Sub VIES2() Application.ScreenUpdating = False Dim IE As Object 'Uruchomienie Internet Explorera i wstrzymanie dalszej akcj
Option Explicit
Declare PtrSafe Sub sleep Lib "kernel32" Alias "Sleep" (ByVal dwmilliseconds As Long)
Public Sub VIES2()
Application.ScreenUpdating = False
Dim IE As Object
'Uruchomienie Internet Explorera i wstrzymanie dalszej akcji az uzyska stan gotowosci
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate "http://ec.europa.eu/taxation_customs/vies/?locale=pl"
Do While IE.ReadyState <> 4: DoEvents: Loop
'Wypelnienie formularza odpowiednimi wartosciami i klikniecie przycisku sprawdzenia
IE.document.getElementById("countryCombobox").Value = "IT"
IE.document.getElementById("number").Value = "01802840023"
IE.document.getElementById("requesterCountryCombobox").Value = "IT"
IE.document.getElementById("requesterNumber").Value = "01802840023"
IE.document.getElementById("submit").Click
sleep (5000) 'or increase to 10000
Dim tbl As Object
Set tbl = IE.document.getElementById("vatResponseFormTable")
Dim ws As Worksheet
Set ws = ActiveWorkbook.Worksheets.Add
ws.Name = "Results"
Dim rng As Range, currentRow As Object, currentColumn As Object, i As Long, outputRow As Long
outputRow = outputRow + 1
Set rng = ws.Range("B" & outputRow)
For Each currentRow In tbl.Rows
For Each currentColumn In currentRow.Cells
rng.Value = currentColumn.outerText
Set rng = rng.Offset(, 1)
i = i + 1
Next currentColumn
outputRow = outputRow + 1
Set rng = rng.Offset(1, -i)
i = 0
Next currentRow
Application.ScreenUpdating = True
End Sub
尽管QHarr的解决方案在我这方面起到了作用,但我在脚本中提供了另一个没有硬编码延迟的解决方案 使用IE作为您的问题是:
Sub Get_Data()
Dim HTML As HTMLDocument, post As Object, elems As Object
Dim elem As Object, r&, c&
With New InternetExplorer
.Visible = False
.navigate "http://ec.europa.eu/taxation_customs/vies/?locale=pl"
While .Busy = True Or .readyState < 4: DoEvents: Wend
Set HTML = .document
With HTML
.getElementById("countryCombobox").Value = "IT"
.getElementById("number").Value = "01802840023"
.getElementById("requesterCountryCombobox").Value = "IT"
.getElementById("requesterNumber").Value = "01802840023"
.getElementById("submit").Click
Do: Set post = .getElementById("vatResponseFormTable"): DoEvents: Loop While post Is Nothing
For Each elems In post.Rows
For Each elem In elems.Cells
c = c + 1: Cells(r + 1, c) = elem.innerText
Next elem
c = 0: r = r + 1
Next elems
End With
.Quit
End With
End Sub
使用xmlhttp
请求(比IE快得多):
要添加到库中的引用:
1. Microsoft Internet Controls
2. Microsoft HTML Object Library
1. Microsoft XML, V6
2. Microsoft HTML Object Library
虽然QHarr的解决方案在我这方面是可行的,但我在脚本中提供了另一个没有硬编码延迟的解决方案 使用IE作为您的问题是:
Sub Get_Data()
Dim HTML As HTMLDocument, post As Object, elems As Object
Dim elem As Object, r&, c&
With New InternetExplorer
.Visible = False
.navigate "http://ec.europa.eu/taxation_customs/vies/?locale=pl"
While .Busy = True Or .readyState < 4: DoEvents: Wend
Set HTML = .document
With HTML
.getElementById("countryCombobox").Value = "IT"
.getElementById("number").Value = "01802840023"
.getElementById("requesterCountryCombobox").Value = "IT"
.getElementById("requesterNumber").Value = "01802840023"
.getElementById("submit").Click
Do: Set post = .getElementById("vatResponseFormTable"): DoEvents: Loop While post Is Nothing
For Each elems In post.Rows
For Each elem In elems.Cells
c = c + 1: Cells(r + 1, c) = elem.innerText
Next elem
c = 0: r = r + 1
Next elems
End With
.Quit
End With
End Sub
使用xmlhttp
请求(比IE快得多):
要添加到库中的引用:
1. Microsoft Internet Controls
2. Microsoft HTML Object Library
1. Microsoft XML, V6
2. Microsoft HTML Object Library
大多数情况下,如果没有REST/SOAP来完成这类任务,您应该进行搜索。 使用
internetexplorer
实例进行此操作完全是一种过度使用
试试这个简单的函数,它使用SOAP
服务验证增值税号码:
Function IsVatValid(country_code, vat_number)
Dim objHTTP As Object
Dim xmlDoc As Object
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
sURL = "http://ec.europa.eu/taxation_customs/vies/services/checkVatService"
sEnv = "<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>" & _
"<s11:Body>" & _
"<tns1:checkVat xmlns:tns1='urn:ec.europa.eu:taxud:vies:services:checkVat:types'>" & _
"<tns1:countryCode>" & country_code & "</tns1:countryCode>" & _
"<tns1:vatNumber>" & vat_number & "</tns1:vatNumber>" & _
"</tns1:checkVat>" & _
"</s11:Body>" & _
"</s11:Envelope>"
objHTTP.Open "Post", sURL, False
objHTTP.setRequestHeader "Content-Type", "text/xml"
objHTTP.setRequestHeader "SOAPAction", "checkVatService"
objHTTP.send (sEnv)
objHTTP.waitForResponse
Set xmlDoc = CreateObject("HTMLFile")
xmlDoc.body.innerHTML = objHTTP.responsetext
IsVatValid = CBool(xmlDoc.getElementsByTagName("valid")(0).innerHTML)
Set xmlDoc = Nothing
Set objHTTP = Nothing
End Function
大多数情况下,如果没有REST/SOAP来完成这类任务,您应该进行搜索。 使用
internetexplorer
实例进行此操作完全是一种过度使用
试试这个简单的函数,它使用SOAP
服务验证增值税号码:
Function IsVatValid(country_code, vat_number)
Dim objHTTP As Object
Dim xmlDoc As Object
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
sURL = "http://ec.europa.eu/taxation_customs/vies/services/checkVatService"
sEnv = "<s11:Envelope xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'>" & _
"<s11:Body>" & _
"<tns1:checkVat xmlns:tns1='urn:ec.europa.eu:taxud:vies:services:checkVat:types'>" & _
"<tns1:countryCode>" & country_code & "</tns1:countryCode>" & _
"<tns1:vatNumber>" & vat_number & "</tns1:vatNumber>" & _
"</tns1:checkVat>" & _
"</s11:Body>" & _
"</s11:Envelope>"
objHTTP.Open "Post", sURL, False
objHTTP.setRequestHeader "Content-Type", "text/xml"
objHTTP.setRequestHeader "SOAPAction", "checkVatService"
objHTTP.send (sEnv)
objHTTP.waitForResponse
Set xmlDoc = CreateObject("HTMLFile")
xmlDoc.body.innerHTML = objHTTP.responsetext
IsVatValid = CBool(xmlDoc.getElementsByTagName("valid")(0).innerHTML)
Set xmlDoc = Nothing
Set objHTTP = Nothing
End Function
您想从目标页面中刮取什么?该页面验证给定的税务ID是否为活动ID。如果是正面验证:Tak,数字增值税aktywny identityficator zapytania Wapiaaawk ftvgN如果是负面验证:Nieważny数字增值税dla transakcji Transcaniciznych w obrębie UE()。为什么要粘贴
html元素
?只需尝试粘贴可见文本的部分。顺便说一句,当你的脚本出现在新页面上时,我没有看到任何等待。只有这部分Tak,numer-VAT-aktywny
或与之连接的表格数据?因为,我可以看到您在脚本中尝试了标记名(“表”)
。根据结果,文本“Tak,numer VAT aktywny”,然后是唯一的搜索标识号,即“WAPIAAAWK iaFNr”,或者只是Nieważny numer VAT dla TRANSAKJI TRANSANICZNYCH w obręUE(więcej informacji można znaleźćw“Najczęściej zadawanych pytaniach”-pytania 7、11、12、13和20)。此时的脚本并非针对目标内容-最初我只是尝试如何实现这一点(我正在学习VBA)但我意识到,我得到的内容与屏幕上和HTML中实际显示的内容完全不同。你想从目标页面中获取什么?该页面验证给定的税号是否为活动税号。如果是积极验证:Tak,数字VAT aktywny identifikator zapytania Wapiaaawk ftvgN如果是负v验证:Nieważny数字增值税dla交易违规行为。为什么要粘贴html元素
?只需尝试粘贴可见文本的部分。Btaw,我看不到脚本中出现新页面时有任何等待。只有这部分Tak、numer-VAT-aktywny
或连接到它的表格数据?因为我可以看到您尝试了标记名(“table”)
在脚本中。根据结果,输入文本“Tak,numer VAT aktywny”,然后输入唯一的搜索标识号,即“wapiaaawk iaFNr”或Nieważny numer VAT dla transakcji incrafanicznych w obrębie UE(więcej informacji można znaleźćwściez zadawanych pytaniach)-Pytanich 7、11、12、13、20)。此时的脚本不是针对目标内容的-最初我只是尝试了如何实现这一点(我正在学习VBA)但我意识到,我获取的内容与屏幕上和HTML中实际显示的内容完全不同。您尝试过上述内容吗?在我的电脑上,即使有10000个,我也需要运行时错误“424”对象。我假设它表示id为“vatResponseFormTable”的元素缺少。当我添加部件以显示类元素“布局内容”中包含的内容时它再次显示了上一页中的所有内容…您是否尝试增加睡眠时间值?您可能会有一个缓慢加载的页面。如果您在代码窗口大小为一半的情况下逐步完成此操作,您应该能够监视事件并看到…是的,我尝试了。我刚才尝试了50000次,但不幸的是仍然没有任何结果。是否有可能与此有关Excel/IE/OS版本?您是否尝试过上述操作?在我的电脑上,即使有10000个,我仍需要运行时错误'424'对象。我假设这意味着缺少id为“vatResponseFormTable”的元素。当我添加部件以显示类元素“layout content”中包含的内容时它再次显示了上一页中的所有内容…您是否尝试增加睡眠时间值?您可能会有一个缓慢加载的页面。如果您在代码窗口大小为一半的情况下逐步完成此操作,您应该能够监视事件并看到…是的,我尝试了。我刚才尝试了50000次,但不幸的是仍然没有任何结果。是否有可能与此有关Excel/IE/OS版本?很好。再加上我的一个版本。如果可以的话,我通常会回答这些问题,但我会等待你或TechScript/OmegaStripes给出一个我可以学习的非常好的答案。我仍然在与你提到的queryselector进行斗争。我非常高兴知道你已经找到了我最喜欢的巨人。TechScript
是我的vba大师之一,在我需要帮助的时候他帮了我很多。非常感谢你们两位:)SIM卡是完美的工作解决方案,QHarr是引导我找到一个几乎可以工作的解决方案——我仍然不明白为什么在我这一头,在你的代码和我的代码中都使用了中断或确认文本框,而设置长达一分钟的等待点并不是:(很好。另外还有我的一个。如果可以的话,我通常会回答这些问题,但要等你或tehscript/Omegalipes来