2

久しぶり。

このVBAのことは初めてですが、キャッチしています。

多くのミューチュアル ファンドのアップサイド/ダウンサイド キャプチャー比率を引き出すことに興味があり、そのプロセスを自動化したいと考えています。私が情報を取得しているテーブルは、典型的なテーブルではありません。モーニングスターのウェブサイトにある「動的オブジェクト」だと思います。ウェブサイトはこちらです。

http://performance.morningstar.com/fund/ratings-risk.action?t=FDSAX®ion=USA&culture=en-us

これは特に SunAmerica の Focus Dividend Fund 向けです。しかし、私は多くの資金のためにそれをやりたいと思っています。これが私が今持っているコードです。msgboxに持ってきたのですが、ループしてExcelで情報を取得する方法がわかりません。

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column=Range("upDown").Row And _
  Target.Column= Range("upDown").Column Then

  Dim IE as New InternetExplorer
  IE.Visible=False
  IE.navigate "http://performance.morningstar.com/fund/ratings-risk.action?t=" _
     & Range("upDown").Value

  Do
    DoEvents
  Loop Until IE.readyState = READYSTATE_Complete
    Dim Doc as HTMLDocument
    Set Doc = IE.document
    Dim sTR As String 'got the "TR" from google chrome inspect element
    sTR = Trim(Doc.getElementsByTagName("tr")(45).innerText)

これは私が立ち往生しているところです。必要な各データを明細化するために「分割」を使用する必要があることはわかっています。例 1 年アップサイド 1 年ダウンサイド 3 年アップサイド 3 年ダウンサイド。

したがって、Excelで取得したら、すべてのティッカーをExcelで実行する必要があります...月に1回更新されるため、そのデータを取得するには約1500です。

前もってありがとう...あなたは命の恩人になるでしょう...私がそれを理解していない場合、文字通り私は自分自身を撃つかもしれません:)

4

1 に答える 1

2

以下のコードを試してください。

Sub Test()

    Dim IE As Object, Doc As Object, lastRow As Long, tblTR As Object, tblTD As Object, strCode As String
    lastRow = Range("A65000").End(xlUp).Row


    Set IE = CreateObject("internetexplorer.application")
    IE.Visible = True


    For i = 1 To lastRow

        strCode = "FDSAX"    ' Range("A" & i).value  ' kindly change it as per your requirement. Currently hardcoded

        IE.navigate "http://performance.morningstar.com/fund/ratings-risk.action?t=" & "FDSAX"

        Do While IE.readystate <> 4: DoEvents: Loop

        Set Doc = CreateObject("htmlfile")
        Set Doc = IE.document

tryAgain:
        Set tblTR = Doc.getelementbyid("div_upDownsidecapture").getelementsbytagname("tr")(3)

        If tblTR Is Nothing Then GoTo tryAgain

        j = 2
        For Each tblTD In tblTR.getelementsbytagname("td")
            tdVal = Split(tblTD.innerText, vbCrLf)
            Cells(i, j) = tdVal(0)
            Cells(i, j + 1) = tdVal(1)
            j = j + 2
        Next


    Next
End Sub
于 2013-04-06T16:33:13.270 に答える