(不定期更新)使用VBA解決 excel web 查詢無法匯入、匯入太慢的股市資料

Snare大,
新年快樂,萬事如意!
strainny wrote:
可以請教s大的即時運算內容是print哪個參數嗎,我試著debug.ptint一直出錯,一直不會找目前下載的資料在哪,要的資訊存在哪個對應的位置@@


vba 在 .send 下面設中斷點,而這時資料下載到 responsetext 或 轉成html物件
因為程式暫停了,所以可以在即時運算視窗,使用一些其它程式碼先測試





至於參數,以chrome為例,
一、先使用程式碼中的網址打開網頁
二、在想要的資料位置,按滑鼠右鍵,選檢查
三、在檢查的視窗中,移動滑鼠,可以看到網頁有明顯變化,找出資料範圍
四、此範例為表格,找到表格的id
五、少量資料可在即時運算視窗中,測試

注意:即時運算視窗,有字數、編碼的限制。字太多、亂碼,請改放到工作表內測試


snare wrote:
'部份電腦會在這一行Microsoft.ACE.OLEDB.12.0,出現錯誤


您好
請教一下,如果出現有問題是在於「'部份電腦會在這一行Microsoft.ACE.OLEDB.12.0,出現錯誤」的話
請問該怎麼修正呢?
謝謝
snare
1012、1013樓,詳細請google Microsoft.ACE.OLEDB
ianlcc wrote:
您好請教一下,如果出...(恕刪)


謝謝您!
不好意思,初學者,這幾天才從第一頁一直看,可以漏看了
snare wrote:
因為yahoo股市改...(恕刪)


前輩,打擾一下
我有看到這一頁,然後也有把YAHOO的連結修正,但是還是沒有辦法即時更新股價
所以很冒味的直接向您請教下面原先的碼要怎麼修正才能夠正確的去捉取更新的股價資料呢?

Sub Z及時股價()

Dim myXML As Object
Set myXML = CreateObject("Microsoft.XMLHTTP")

Dim myHTML As Object
Set myHTML = CreateObject("HTMLFile")

On Error Resume Next
i = 2
With myXML

Do While Cells(2 + QQ, 1) <> ""

.Open "GET", "https://tw.stock.yahoo.com/q/q?t=" & Timer & "&s=" & Cells(2 + QQ, 1), False


'以下這3行避免抓到暫存資料
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send

'把傳回值轉成標準htmlfile
myHTML.body[removed] = .responseText

Set myTable = myHTML.getElementsByTagName("table")(6)

For j = 1 To 10

Cells(i, j + 1) = myTable.Rows(1).Cells(j).innerText

Next

i = i + 1

'將股票代號導入CMoney超連結
Cells(2 + QQ, 1).Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _
"http://www.cmoney.tw/follow/channel/stock-" & Cells(2 + QQ, 1) & "?chart=d"

QQ = QQ + 1
Loop

End With

'釋放記憶體
Set myXML = Nothing
Set myHTML = Nothing

Var = MsgBox("更新完成", vbOKOnly, "訊息")

End Sub
snare
改版了,請參考1095範例,加上1364樓,nijawang提出的修改方式,1365樓cji3cj6xu6的留言。
謝謝snare樓主指導
已經修改好了,正常使用
snare樓主您好,
yahoo股利頁面改版後,無法順利解析JSON,請您指點一下語法修正,部分程式碼如下及VBA截圖(變數視窗DecodeJson反白處無資料)

Set GetXml = CreateObject("WinHttp.WinHttpRequest.5.1")
Set Jsondata = CreateObject("HtmlFile")
'解析json字集函數
‘暫時改為全型字
Jasondata.write"<script>document.JsonParse=function(s){return eval('+s+')');}</script>"
With GetXml
.Open "GET", URL, False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send

dtemp = "{""QuoteDividendStore"":{""dividend"":{""data"":[" & Split(Split(.responsetext, """QuoteDividendStore"":{""dividend"":{""data"":[")(1), ",""WaferMarketTimeStore"":")(0) & "}"

Set DecodeJson = CallByName(CallByName(CallByName(Jsondata.JsonParse(dtemp), "QuoteDividendStore", VbGet), "dividend", VbGet), "data", VbGet)
Debug.Print dtemp

activer wrote:
語法修正


URL = "https://tw.stock.yahoo.com/quote/2330.TW/dividend"










Set DecodeJson = CallByName(CallByName(CallByName(CallByName(Jsondata.JsonParse(dtemp), "QuoteDividendStore", VbGet), "dividendByYear", VbGet), "data", VbGet), "dividendByYear", VbGet)


snare您好,
語法1為原先程式碼,2為您的修正語法,請問如何從即時視窗中,判斷應作如此的修正?

1.' Set DecodeJson = CallByName(CallByName(CallByName(Jsondata.JsonParse(dtemp), "QuoteDividendStore", VbGet), "dividend", VbGet), "data", VbGet)

修正的語法:
2. Set DecodeJson = CallByName(CallByName(CallByName(CallByName(Jsondata.JsonParse(dtemp), "QuoteDividendStore", VbGet), "dividendByYear", VbGet), "data", VbGet), "dividendByYear", VbGet)
activer wrote:
1為原先程式碼,2為您的修正語法,請問如何從即時視窗中,判斷應作如此的修正?



一、不要拆分資料,用 Set DecodeJson = Jsondata.JsonParse(temp) 檢查,在下面設中斷點





二、 程式暫停後,在區域變數視窗,檢查原始資料結構





三、確定所需要的資料在那裡後,再改寫 set .... .... .... 到正確的位置
activer
[謝謝]
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 144)

今日熱門文章 網友點擊推薦!