• 156

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

如果不附檔案
發文後,請檢查文章內容,因語法關係,有時候內容會不完整
內容看不懂,我就不會回答

goldchiou wrote:
"https://www.wantgoo.com/stock/astock/agentstat2?stockno=8069"

goldchiou wrote:
跑出來只有 日期 收盤價 買賣超 家數差 5日集中 20日集中



wantgoo 只有第一列是表格,其它內容都是json格式,用表格會無法下載

json相關範例請從 2017-07-05 219樓,開始往後看
寫法類似274樓







Sub Get_Wantgoo_maintrend_Jsondata()

Dim Xmlhttp As Object, Jsondata As Object, DecodeJson, Url As String, Urla As String, ttt As Double

Set Jsondata = CreateObject("HtmlFile")
Jsondata.write ”<script>document.JsonParse=function (s) {return eval(’(’ + s + ’)’);}</script>”
'jsondata.write 這行是全形字,請自行改成半形,或直接用檔案中的程式碼
Sheets("工作表1").Cells.Clear
Sheets("工作表1").Range("a1:f1") = Array("date", "close", "stockAgentMainPower", "stockAgentDiff", "skp5", "skp20")
ttt = Timer

Url = "https://www.wantgoo.com/stock/8069/major-investors/main-trend-data"
Urla = "https://www.wantgoo.com/stock/8069/major-investors/main-trend"

Set Xmlhttp = CreateObject("msxml2.xmlhttp")
With Xmlhttp
.Open "GET", Url, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", Urla
.send
Set DecodeJson = Jsondata.JsonParse(.responsetext)
End With

With Sheets("工作表1")
Application.ScreenUpdating = False
For i = 0 To CallByName(DecodeJson, "length", VbGet) - 1
.Cells(i + 2, 1) = Left(CallByName(CallByName(DecodeJson, i, VbGet), "date", VbGet), 10)
.Cells(i + 2, 2) = CallByName(CallByName(DecodeJson, i, VbGet), "close", VbGet)
.Cells(i + 2, 3) = CallByName(CallByName(DecodeJson, i, VbGet), "stockAgentMainPower", VbGet)
.Cells(i + 2, 4) = CallByName(CallByName(DecodeJson, i, VbGet), "stockAgentDiff", VbGet)
.Cells(i + 2, 5) = CallByName(CallByName(DecodeJson, i, VbGet), "skp5", VbGet)
.Cells(i + 2, 6) = CallByName(CallByName(DecodeJson, i, VbGet), "skp20", VbGet)
Next i
.Cells.EntireColumn.AutoFit
Application.ScreenUpdating = True
End With

MsgBox "(" & Left(CallByName(CallByName(DecodeJson, i - 1, VbGet), "date", VbGet), 10) & _
")~(" & Left(CallByName(CallByName(DecodeJson, 0, VbGet), "date", VbGet), 10) & ")" & _
vbNewLine & CallByName(DecodeJson, "length", VbGet) & "筆" & vbNewLine & Timer - ttt & "秒"

Set Xmlhttp = Nothing
Set DecodeJson = Nothing

End Sub




[點擊下載]
Snare大,謝謝你,終於看到我要的,真不知如何感謝,你真的造福很多人,再次謝謝!
p.s.我以前是白看了,我再從頭看一次(不知又要花多少時間,哈哈哈)。
樓主你好
想請教如果我想帶入年乖離率該如何寫巨集
因為大部分網頁的乖離率都是用圖表顯示
研究了很久實在不懂
麻煩大大指教


參考網址:
http://sod.nsc.com.tw/z/zc/zcw/zcw_2449.djhtm
love732001 wrote:
想請教如果我想帶入年乖離率該如何寫巨集
因為大部分網頁的乖離率都是用圖表顯示
研究了很久實在不懂


這個網頁上的乖離率是用公式計算的,並不在原始資料內
需下載原始資料後,自己寫公式計算,公式請參考(https://zh.wikipedia.org/wiki/乖離率)
如果要畫圖請google教學,例如excel k線圖…
如果不想自己寫公式,請另找其它有計算好資料的網站



網頁圖表原始資料







Sub Get_nsc_Chart_Data()

Dim Xmlhttp As Object, Url As String, Urla As String, stockno As String, data, temp, ttt As Double

Sheets("工作表1").Cells.Clear
ttt = Timer

stockno = "2449"

Url = "http://sod.nsc.com.tw/Z/ZC/ZCW/CZKC1.djbcd?a=" & stockno & "&b=D&c=1440"
Urla = "http://sod.nsc.com.tw/z/zc/zcw/zcw_" & stockno & ".djhtm"

Set Xmlhttp = CreateObject("msxml2.xmlhttp")
With Xmlhttp
.Open "GET", Url, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", Urla
.send
data = Split(.responsetext, " ")
End With

With Sheets("工作表1")
Application.ScreenUpdating = False
For i = 0 To UBound(data)
temp = Split(data(i), ",")
.Cells(1, i + 1).Resize(UBound(temp) + 1, 1) = Application.Transpose(temp)
Next i
.Cells.EntireColumn.AutoFit
Application.ScreenUpdating = True
End With

Set Xmlhttp = Nothing

Debug.Print Timer - ttt

End Sub



[點擊下載]樓主你好
非常感謝之前的解答 終於解開疑惑><
小弟試了另一個方法計算尋求乖離計算
但遇到了一點迴圈問題
 
 
目前"工作表1"的 B2格
並產生結果於"歷史"的A:J行
 
想要他執行
1.自動點擊"計算"(已設定巨集自動讀取 工作表1 的 B2)
2.將"工作表2"的 P2:R2 貼上在 "工作表2"的 M2:O2 (僅黏貼值)
1.自動點擊"計算"(讀取 工作表1 的 B3)
2.將"工作表2"的 P3:R3 貼上在 "工作表2"的 M3:O3 (僅黏貼值)
 
以此類推 直至 "工作表1"的B列無股票代號為止
這個讓他讀完可以自動讀下一行的 希望大大幫我解答
love732001 wrote:
但遇到了一點迴圈問題


附件中,沒看到您寫的"迴圈"程式碼
迴圈是vba中的基本,這方面您必需自己學習


每按一次按鈕,跳下一格"不用迴圈"的簡易範例請參考


'b欄從b2開始~空白停止
Dim lastrow As Integer

Sub test()

lastrow = lastrow + 1
If Sheets("工作表1").Cells(lastrow + 1, 2) = "" Then
lastrow = 0
Exit Sub
End If

'需執行的程式碼位置
'=========
MsgBox Sheets("工作表1").Cells(lastrow + 1, 2)
'=========

End Sub


歷史資料單次下載(連續下載)可改用finance.yahoo.com
範例可參考,271樓、272樓、274樓
請問一下師傅
目前樓層裡面是否有關於SYNCHRONIZER_TOKEN的東西?

https://www.tdcc.com.tw/portal/zh/smWeb/qryStock
比方說查這裡

f12進去看的後面網址是
SYNCHRONIZER_TOKEN=56e2acc7-52a7-4a69-814c-2920a306db8e&SYNCHRONIZER_URI=%2Fportal%2Fzh%2FsmWeb%2FqryStock&method=submit&firDate=20201218&scaDate=20201218&sqlMethod=StockNo&stockNo=2330&stockName=

用fiddle也是一樣
匯入的網址似乎被前面那個東西卡到了

本大樓是否已經有解法了?
謝謝師傅
bioleon69 wrote:
https://www.tdcc.com.tw/portal/zh/smWeb/qryStock...(恕刪)


集保戶股權分散表?
網頁改版了嗎?

這和686樓有什麼不一樣?
剛剛測試正常

如果只是想知道Token,可參考631樓
集保有改?
我也正常跑+1
snare wrote:
集保戶股權分散表?網(恕刪)


這是集保沒錯,這邊沒有問題,正常執行
https://www.tdcc.com.tw/smWeb/QryStockAjax.do
哈,我只是舉集保例子,害大家會錯意不好意思!
-------------------------
正題
-------------------------
https://www.tdcc.com.tw/portal/zh/smWeb/qryStock
我是想問說這裡,這個新版的網站
要查詢資料的時候(如圖)


有兩個東西擋住
token跟uri
不知道怎麼找出連結
  • 156
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 156)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?