excel 如何使用“msxml2.xmlhttp”从表中获取数据[重复]

rvpgvaaj  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(128)

此问题已在此处有答案

Set HTML_Content = CreateObject("htmlfile") doesn't work(1个答案)
2天前关闭。
HTML我正试图从一个网页www.example.com获取数据https://www.lbma.org.uk/prices-and-data/precious-metal-prices#/table,看起来很简单,所有的q和a的例子都在网上,但我像一个腌鱼一样拍打着翅膀,经过多次尝试和错误后,我只能猜测。有人能告诉我哪里出错了吗?
目标,,,我的wbook数据一直定期手动更新,所以现在的目标是下载说,前10行的黄金价格只,最好没有欧元数据刚刚日期,美元和英镑。头也不是必需的,只是数据。
以下是迄今为止的HTML和代码。遇到的错误为“需要对象”和“对象不支持、、、”等。

Sub Get_Prices()

    Dim sWeb_URL As String
    Dim oHTML_Content As Object, oTbl As Object, tr As Object, td As Object, oTBody As Object
    Dim r As Long, c As Long, arr

    With Sheets(20)
        sWeb_URL = "https://www.lbma.org.uk/prices-and-data/precious-metal-prices#/table"
        Set oHTML_Content = CreateObject("htmlfile")

        ''get entire webpage content into HTMLFile Object
        With CreateObject("msxml2.xmlhttp")
            .Open "GET", sWeb_URL, False
            .send
            oHTML_Content.body.innerHTML = .responseText
        End With

        'Set oTbl = oHTML_Content.getElementsByTagName("-index1")
        'Set oTbl = oHTML_Content.getElementById("-index1")
        'Set oTbl = oHTML_Content.getElementsByClassName("pepper-responsive-table")
        'Set oTbl = oHTML_Content.getElementsByClassName("pepper-responsive-table").getElementsByTagName("tbody")(0).getElementsByTagName("tr")(0)
        'Set oTbl = oHTML_Content.getElementsByClassName("pepper-responsive-table")(0).getElementsByTagName("tr")(2)
        Set oTbl = oHTML_Content.getElementsByTagName("tbody")

        For Each tr In oTbl
            c = 1
            For Each td In tr.Cells
                .Cells(r, c) = td.innerText
                c = c + 1
            Next td
            r = r + 1
        Next tr
            
    End With

End Sub
7gcisfzg

7gcisfzg1#

在阅读@Zwenn的评论之后,我编写了以下代码,并将值带到工作表中。

'THIS PUBLIC FUNCTION IN A MODULE
--------------------------------------------------------
Public Function fetch_prices(ByRef AM, ByRef PM, ByVal afterMonth As String) As String
   Dim c As Integer, a As Long, lb As Integer
   Dim URL() As Variant    ', fileSaveTo() As Variant
   
   'change the files path to any valid local path
   'fileSaveTo = Array(".\AM_PRICES.TXT", ".\PM_PRISES.TXT")
   URL = Array("https://prices.lbma.org.uk/json/gold_am.json?r=84419867", _
                      "https://prices.lbma.org.uk/json/gold_pm.json?r=796011502")
   lb = LBound(URL)
                      
    With CreateObject("msxml2.xmlhttp")
       For c = lb To UBound(URL)
         .Open "GET", URL(c), False
         .send
            'Call WriteToTextFile(fileSaveTo(c), .responseText)
         a = InStrRev(.responseText, afterMonth)
         If a > 0 Then
            If (c = lb) Then
               AM = Mid(.responseText, a)
            Else
               PM = Mid(.responseText, a)
            End If
         End If
      Next
   End With
End Function

'THE PRIVATE SUBs IN THE SHEET MODULE
----------------------------------------------------
Private Sub get_prices(afterTheMont As String)
   Const d = """d"""
   Dim AM As String, PM As String, pa As Long, lb As Long, rb As Long, rowId As Long, cc As Long
   Dim dt As String, values As Variant
   Call fetch_prices(AM, PM, afterTheMont)
   pa = 1: rowId = 3
   
  

    Do
      rowId = rowId + 1
      pa = InStr(pa + 1, AM, d)
      If (pa <= 0) Then Exit Do
      dt = Mid(AM, pa + 5, 10)
      Me.Cells(rowId, 1).Value2 = dt
      lb = InStr(pa, AM, "[")
      If lb > 0 Then
         rb = InStr(pa, AM, "]")
         If rb > 0 Then
            values = Split(Mid(AM, lb + 1, rb - lb - 1), ",")
            For cc = LBound(values) To UBound(values)
               Me.Cells(rowId, cc + 2).Value2 = values(cc)
            Next
         End If
      End If
   Loop
   
   rowId = 3
   Do
      rowId = rowId + 1
      pa = InStr(pa + 1, PM, d)
      If (pa <= 0) Then Exit Do
      dt = Mid(PM, pa + 5, 10)
      Me.Cells(rowId, 5).Value2 = dt
      lb = InStr(pa, PM, "[")
      If lb > 0 Then
         rb = InStr(pa, PM, "]")
         If rb > 0 Then
            values = Split(Mid(PM, lb + 1, rb - lb - 1), ",")
            For cc = LBound(values) To UBound(values)
               Me.Cells(rowId, cc + 6).Value2 = values(cc)
            Next
         End If
      End If
   Loop

   
End Sub

'usage via command button click event
Private Sub CommandButton1_Click()
   'it means show in sheet the prices from the first day exist data of the next month
   Call get_prices("2023-04")
End Sub

相关问题