2014-09-02 108 views
1

我是一位非编码人员/程序员,他尝试创建一个使用某些VBA自动化功能基于特定单元格值导入某些Web数据的Excel电子表格。我已经设法使用Youtube和其他一些网站来整合这个过程的一部分。但是,我碰到了一个我希望有人可以帮助我的路障。Excel VBA自动生成的php表格由php生成

这里是设置:
我想导入一些基于2参数(压力和温度)的一些二氧化碳数据,将驻留在我的Excel表中的2个单独的单元格。 在我的VBA代码中,我设法导航到第一个站点(http://www.peacesoftware.de/einigewerte/co2_e.html),然后查找表格元素,填写并提交表单。 我的问题是当IE导航到下一页的结果。我不知道如何从这个新页面导入表格元素。我假设我需要告诉VBA查看新的页面,但它有一个通用的URL(http://www.peacesoftware.de/einigewerte/calc_co2.php5),所以我对引用的内容感到困惑。 我希望这是所有需要的信息,以清楚地了解我的问题。这是我目前的VBA代码。 “提交”后的结尾部分是我猜测的结果。一旦VBA正在查看正确的表格/页面,我会将焓值和熵值导入到我的Excel电子表格中。 在此先感谢您的帮助!

' updates enthalpy, entropy data from peacesoftware site 
Private Sub Worksheet_Change(ByVal Target As Range) 
If Target.Row = Range("tempA").Row And Target.Column = Range("tempA").Column Then 
Dim IE As Object 
Dim pressA As String 
Dim tempA As String 
Dim denseA As String 
Dim enthA As String 
Dim entroA As Style 

    tempA = Range("tempA") 
    pressA = Range("pressA") 
    Set IE = CreateObject("InternetExplorer.Application") 
' setup internet explorer 
    IE.Visible = True 
    IE.navigate "http://www.peacesoftware.de/einigewerte/co2_e.html" 
Do 
    DoEvents 
    Loop Until IE.readyState = READYSTATE_COMPLETE 
    ' find pressure and temp entry form 
    IE.document.getElementsByName("druck")(0).Value = pressA 
    IE.document.getElementsByName("temperatur")(0).Value = tempA 
    IE.document.forms(0).submit 
    'Do 
    'DoEvents 
    'Loop Until IE.readyState = READYSTATE_COMPLETE 
    'update new energy data 
    'IE.navigate table_url ??? 
End If 
End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

End Sub 

***更新

我想我找到了解决办法,所以我至少可以得到它的功能。 (感谢这篇文章:excel vba form submit and parse data from result

我需要等待提交后,然后搜索我需要的“td”元素。由于我需要的实际值是元素标签后面的下一个元素,因此我使用TDelement.nextElementSibling.innerText来抓取它。

IE.document.forms(0).submit 
    ' wait for new page to load 
    Do While IE.Busy: DoEvents: Loop 

    Set doc = IE.document 
    Dim sdd As String 
    Set TDelements = doc.getElementsByTagName("td") 
    r = 0 
    For Each TDelement In TDelements 
     If TDelement.innerText = "Density : " Then 
      Range("denseA") = TDelement.nextElementSibling.innerText 
      r = r + 1 
     End If 
    Next 

再次感谢您的帮助。

回答

0

问题是表单是通过POST发送的,而不是通过GET发送的。 这意味着您无法在URL中查看/操作/发送参数。

但是你可以使用VBA直接发送POST-Request到结果页面。 以下代码为您提供了您在此响应的通知部分中提到的值。 你,如果你想另一个温度或“DRUCK”改变POSTDATA变量: 此示例,代码只是给你的值20和20

Dim Density As String 
Dim Entropy As String 
Dim Enthalpy As String 
Dim SoA As String 

Dim Result As String 
Dim myURL As String, postData As String 
Dim winHttpReq As Object 
Set winHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1") 

myURL = "http://www.peacesoftware.de/einigewerte/calc_co2.php5" 
postData = "lang=english&calc=standard&druck=20&druckunit=1&temperatur=20&tempunit=1" 

winHttpReq.Open "POST", myURL, False 
winHttpReq.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
winHttpReq.Send (postData) 

Result = winHttpReq.responseText 

Density = getValue("Density", Result, False) 
Entropy = getValue("Entropy", Result, False) 
Enthalpy = getValue("Enthalpy", Result, False) 
SoA = getValue("state of aggregation", Result, True) 

的结果。此外我创建了一个辅助功能这也必须实施:

Public Function getValue(Property As String, Result As String, isBold As Boolean) As String 

    Dim posProp As Long 
    Dim posTD As Long 
    Dim posEndTD As Long 
    Dim startPosVal As Long 
    Dim endPosVal As Long 
    Dim valLength As Long 
    Dim Value As String 

    'find the position of the value on the page 
    posProp = InStr(1, Result, Property) 

    If posProp > 0 Then 

     posTD = InStr(posProp, Result, "<td>") 

     If isBold = True Then 
      posEndTD = InStr(posTD, Result, "</b></td>") 
      startPosVal = posTD + 7 
     Else 
      posEndTD = InStr(posTD, Result, "</td>") 
      startPosVal = posTD + 4 
     End If 

     endPosVal = posEndTD 
     valLength = endPosVal - startPosVal 

     Value = Mid(Result, startPosVal, valLength) 
     getValue = Value 
    End If 

End Function 

希望这有助于!

如果您需要任何帮助,请发表评论。

编辑: 啊,我刚刚看到你找到了一个解决方案。 但我认为这段代码更简洁一些,因为它只是直接发送一个http请求到结果页面。

+0

感谢回复user3170197,此方法似乎只返回结果表的第一列。我想我可能会遇到一个解决方案,其中我会更新我原来的帖子。(另外,我确定我拥有的是笨拙而缓慢的,我可能会在尝试并在工作后简化它) – Ryan 2014-09-02 20:59:43

+0

嗨,Ryan,此方法返回整型html代码。它不适合msgbox。你想从表格中删除哪些值?所有这些或只是一些? – bayerphi 2014-09-02 21:03:33

+0

我正在寻找表中的密度,熵和焓。正如你所看到的,我非常绿色!我怀疑有一个更好的方法来做到这一点。感谢您的帮助。 – Ryan 2014-09-02 21:11:25