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

snare wrote:
會錯誤是因為,json沒有做成正確格式
temp = "{""QuoteDividendStore"":{""dividend"":{""data"":[" & Split(Split(.responsetext, """QuoteDividendStore"":{""dividend"":{""data"":[")(1), ",""WaferMarketTimeStore"":")(0) & "}"...(恕刪)


樓主您好,
本次股利查詢的 temp=.....的結尾僅加個"}",而您的新版的股票程式碼卻加了3個"}",這兩個的差異,不知要如何才能判斷並成正確的json格式?
activer wrote:
本次股利查詢的 temp=.....的結尾僅加個"}",而您的新版的股票程式碼卻加了3個"}",這兩個的差異,不知要如何才能判斷並成正確的json格式?


URL = "https://tw.stock.yahoo.com/quote/2330/dividend"
URL = "https://tw.stock.yahoo.com/d/s/dividend_2330.html"
2個網址都導向同一份資料


範例中只取出”部份json字串”,json格式被破壞,程式就無法判讀,所以需要修補字串
加幾個不一定,有時很還要補上 [ 或 ]、前、後不一定,有時前面也要補
很單純要看怎麼拆字串

但通常是不用補的,很多網站是用另一個網址傳回“純json字串”
整個.responsetext裡面就只有json,不用修改,就能判讀

yahoo這個.responsetext裡面是html+json
加上我們只需要其中一小部份的json字串,所以要拆解、修復


簡單的說json的{物件},[陣列],其它格式…略
一定要包起來,都是成對的

(詳細json格式介紹,請google)



1095樓的範例來說,要quote=>data裡面的資料,其它html、多的json都不要

字串拆完有=>3個物件(錯誤格式)
{"quote":{"data":{…中間物件、陣列…略…

所以要補3個}
{"quote":{"data":{…中間物件、陣列…略…}}}

當然您也可以這樣拆,補2個}
{"data":{…中間物件、陣列…略…}}

或,補1個

{…中間物件、陣列…略…}




1100樓的範例來說,要QuoteDividendStore裡面的資料

字串拆完=>2個物件(錯誤格式)
{"QuoteDividendStore":{…中間物件、陣列…略…}

所以要補一個}
{"QuoteDividendStore":{…中間物件、陣列…略…}}

同理,也可以這樣拆,什麼都不用補
{ "dividend":{…中間物件、陣列…略…}}



因為中間不會有問題,只要看頭、尾就好,所以我通常是直接看,就知道要補什麼
如果對判讀有問題,可利用一些檢查工具(單機、線上,詳細請自行google)

例如線上 https://jsonformatter.curiousconcept.com/#

把1095樓,未補上 }}} 的temp字串丟進去,按process,顯示結尾有問題




直接在對話框裡面,補上}}}後,按process,顯示正確

snare wrote:
範例中只取出”部份json字串”,json格式被破壞,程式就無法判讀,所以需要修補字串
加幾個不一定,有時很還要補上 [ 或 ]、前、後不一定,有時前面也要補
很單純要看怎麼拆字串


獲益良多
Snare大神您好:
我在繪製K線圖表時遇到了賦值的問題(附件),
想請教有沒有什麼辦法,
可以在Set Arr後進行[轉置],
我現在的圖是錯的,感謝。Dylan

[點擊下載]
Dylan67 wrote:
可以在Set Arr後進行[轉置],
我現在的圖是錯的


雖然您有上傳檔案、附程式碼
(這是發問的好習慣)
但是沒有人工訂正的轉置資料、正確的圖?
這樣有點麻煩耶,回答是否正確,是個謎,弄錯還要浪費時間重打字


我理解的轉置是這樣…





轉置後畫出的圖是這樣…???






還有您的舊圖沒刪,圖表重疊,物件會愈來愈多
請google ChartObjects 刪除

Sub test()
'(程式碼中不含“”圖表刪除功能)
Dim ChtObj As ChartObject, Arr As Variant, Brr As Variant, temp() As Double, i As Integer, j As Integer

Set ChtObj = ActiveSheet.ChartObjects.Add(50, 70, 300, 250)
Arr = ActiveSheet.Range("b2:e5").Value2
'您要問的arr不放到格子𥚃,直接轉置到brr
Brr = Application.Transpose(Arr)
ReDim temp(1 To UBound(Brr, 2))

With ChtObj.Chart
For i = 1 To UBound(Brr, 1)
.SeriesCollection.NewSeries
For j = 1 To UBound(Brr, 2)
temp(j) = Brr(i, j)
Next j
.SeriesCollection(i).Values = temp
Next i
.ChartType = xlStockOHLC
End With

End Sub
看來yahoo股市,網頁格式都統一了
這是幾個月前寫的,順手po上來

yahoo 主力進出





Sub Get_Yahoo_brokerTrades_Json()

Dim URL As String, GetXml As Object, Jsondata As Object, DecodeJson, temp As String, Stock As String, buyerRankList, sellerRankList, DataTime As String

'Stock = "2412" 'test
'Stock = "2002" 'test
Stock = "2330" 'test

ttt = Timer

URL = "https://tw.stock.yahoo.com/quote/" & Stock & "/broker-trading"

Set GetXml = CreateObject("WinHttp.WinHttpRequest.5.1")
Set Jsondata = CreateObject("HtmlFile")



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

temp = "{""brokerTrades"":{""data"":{""buyerRankList"":[" & Split(Split(.responsetext, """brokerTrades"":{""data"":{""buyerRankList"":[")(1), ",""totalDifferenceVolK"":")(0) & "}}}"
DataTime = Split(Split(.responsetext, "datatime=""")(1), """>")(0)

Set DecodeJson = CallByName(CallByName(Jsondata.JsonParse(temp), "brokerTrades", VbGet), "data", VbGet)
Set buyerRankList = CallByName(DecodeJson, "buyerRankList", VbGet)
Set sellerRankList = CallByName(DecodeJson, "sellerRankList", VbGet)

With Sheets("工作表1")
.Cells.Clear
.Range("a1:h1") = Array("買超券商", "買進", "賣出", "買超張數", "賣超券商", "買進", "賣出", "賣超張數")

For i = 0 To CallByName(buyerRankList, "length", VbGet) - 1
.Cells(i + 2, 1) = CallByName(CallByName(buyerRankList, i, VbGet), "name", VbGet)
.Cells(i + 2, 2) = CallByName(CallByName(buyerRankList, i, VbGet), "buyVolK", VbGet)
.Cells(i + 2, 3) = CallByName(CallByName(buyerRankList, i, VbGet), "sellVolK", VbGet)
.Cells(i + 2, 4) = CallByName(CallByName(buyerRankList, i, VbGet), "volume", VbGet)
.Cells(i + 2, 5) = CallByName(CallByName(sellerRankList, i, VbGet), "name", VbGet)
.Cells(i + 2, 6) = CallByName(CallByName(sellerRankList, i, VbGet), "buyVolK", VbGet)
.Cells(i + 2, 7) = CallByName(CallByName(sellerRankList, i, VbGet), "sellVolK", VbGet)
.Cells(i + 2, 8) = CallByName(CallByName(sellerRankList, i, VbGet), "volume", VbGet)
Next i

.Cells.Columns.AutoFit
End With

Application.ScreenUpdating = True

End With


MsgBox Stock & vbNewLine & DataTime & vbNewLine & Timer - ttt & "s", vbOKOnly, "report" 'debug

Set GetXml = Nothing
Set Jsondata = Nothing
Set DecodeJson = Nothing
Set buyerRankList = Nothing
Set sellerRankList = Nothing

End Sub

是的,這是我要的效果,抱歉敘述不清,下次改進,
看了您的代碼,我大概知道我的問題點了,
因為SetSourceData Source如果要一次性把開高低收寫入,就需要物件(Set方式),
而我又希望在寫入的同時進行二維轉換,所以是做不到的,
得用SeriesCollection.NewSeries新增數列後,進行維度轉換,再分次寫入圖表來源數據,
這樣理解不知道對不對,再次感謝您的指導。Dylan
祝Snare 老師教師節愉快,身體健康,闔家平安。
請問snare大大

https://www.twse.com.tw/exchangeReport/MI_MARGN?response=csv&date=20210827&selectType=MS

最近下載上方網址的資料 發現下載網址是沒問題的
但試了本主題的所有下載csv的方法
都會找不到資料 卡在.send的部分

再請大大有空幫忙看看有何解決辦法

謝謝大大
snare
200樓、1038樓、(oliwa改寫的作品1039樓、1042樓)
rainbowsperm wrote:
最近下載上方網址的資料 發現下載網址是沒問題的
但試了本主題的所有下載csv的方法
都會找不到資料 卡在.send的部分


請參考,200樓1038樓、(oliwa改寫的作品1039樓1042樓)


如果不想存檔,也可以這樣寫




Sub get_twse_Ms()

Dim Url As String, HTMLsourcecode As Object, XMLget As Object, temp, ttt As Double
Set HTMLsourcecode = CreateObject("htmlfile")
Set XMLget = CreateObject("msxml2.xmlhttp")

Url = "https://www.twse.com.tw/exchangeReport/MI_MARGN?response=csv&date=20210827&selectType=MS"

ttt = Timer

With XMLget
.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

HTMLsourcecode.body.innerhtml = convertraw(.ResponseBody)
temp = Split(HTMLsourcecode.body.innertext, " ")

End With

With Sheets("工作表1")
.Cells.Clear
.Range("a1:a" & UBound(temp) + 1) = Application.Transpose(temp)
.Columns("A:A").TextToColumns DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
.Columns.ColumnWidth = 15
End With

Set HTMLsourcecode = Nothing
Set XMLget = Nothing

Debug.Print Timer - ttt

End Sub


Function convertraw(rawdata)

Dim rawstr
Set rawstr = CreateObject("adodb.stream")
With rawstr
.Type = 1
.Mode = 3
.Open
.Write rawdata
.Position = 0
.Type = 2
.Charset = "big5"
convertraw = .ReadText
.Close
End With
Set rawstr = Nothing

End Function

關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 144)

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