Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
使用VBA从网页中获取数据_Vba_Excel - Fatal编程技术网

使用VBA从网页中获取数据

使用VBA从网页中获取数据,vba,excel,Vba,Excel,我正在尝试从该网页获取一些数据: 我希望在每个智能手机和每种合同类型的正确站点上都有完整的表格 设置一次性付款:Anschlusspreis 手机一次性付款:智能手机 总额:Gesamt 合同月付款:基本金额 手机月付:智能手机Zuzahlung 这些都存储在JavaScript部分中,JavaScript部分包含大量的字母 我正在尝试使用Excel VBA: Sub Button1_Click() 'On Error GoTo Errorhandler Dim ie As Objec

我正在尝试从该网页获取一些数据:

我希望在每个智能手机和每种合同类型的正确站点上都有完整的表格

设置一次性付款:Anschlusspreis

手机一次性付款:智能手机

总额:Gesamt

合同月付款:基本金额

手机月付:智能手机Zuzahlung

这些都存储在JavaScript部分中,JavaScript部分包含大量的字母

我正在尝试使用Excel VBA:

Sub Button1_Click()
  'On Error GoTo Errorhandler
  Dim ie As Object, doc As Object, rng As Object, ticker As String, quote As String

  Set ie = CreateObject("InternetExplorer.Application")
  i = 1

  'Application.StatusBar = "Your request is loading. Please wait..."

  ie.navigate "http://www.vodafone.de/privat/handys-tablets-tarife/smartphone-tarife.html"
  'ie.navigate ticker

  Do
    DoEvents
  Loop Until ie.readyState = READYSTATE_COMPLETE

  Set doc = ie.document

  quote = doc.getElementsByID("connectionFeeVal").innerText
  Cells(3, 3).Value = quote

  MsgBox ("done")

'Errorhandler:
  'If Err = 91 Then MsgBox "Error Message"

  ie.Application.Quit
End Sub
但它在“DoEvents”上不断循环

有人知道我为什么以及如何解决这个问题吗?也许还有人知道如何从这个页面获取所有这些数据

提前谢谢。

而不是:

Do
    DoEvents

Loop Until ie.readyState = READYSTATE_COMPLETE  
你可以试试:

Do While ie.Busy: DoEvents: Loop
Do Until ie.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop

with ie
...
end with

除了使用IE自动化,您还可以使用http请求对象:

Dim oRequest As Object
Set oRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
oRequest.Open "GET", "http://www.vodafone.de/privat/handys-tablets-tarife/smartphone-tarife.html"
oRequest.Send
MsgBox oRequest.ResponseText
它比IE解决方案更快,而且不需要那么多资源

如果您在代理服务器后面,则可以使用以下内容:

Const HTTPREQUEST_PROXYSETTING_PROXY = 2
Dim oRequest As Object
Set oRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
oRequest.setProxy HTTPREQUEST_PROXYSETTING_PROXY, "http://proxy.intern:8080"
oRequest.Open "GET", "http://www.vodafone.de/privat/handys-tablets-tarife/smartphone-tarife.html"
oRequest.Send
MsgBox oRequest.ResponseText
当然,您必须根据您的值调整代理

由于您对德语页面感兴趣,这里还有德语的简短解释:
还解释了如何将表单的值传递给Web服务器,这可能对您也有帮助。

有时DoEvents会出现问题。您也可以尝试以下三行:
Do While.IE.Busy Application.Wait DateAdd(“s”,1,Now)Loop
非常感谢,我没想到会这么容易。