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

f101f101 wrote:
樓主好 股權結...(恕刪)


改下列兩行table 後的數字
stockname = HTMLsourcecode.all.tags("table")(6).Rows(0).innertext
Set Table = HTMLsourcecode.all.tags("table")(7).Rows


順便問樓主,以下code執行兩次, 可以把.responsetext 加到同一個htmlfile中,之後才一次一起分析資料嗎?

With CreateObject("WinHttp.WinHttpRequest.5.1")

urla = "http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=otc_o00.tw|otc_GTSM50.tw|otc_GTHD.tw|otc_EMP88.tw|otc_GTCI.tw|otc_TPCGI.tw|otc_GAME.tw|otc_o13.tw|otc_o04.tw|otc_o05.tw|otc_o21.tw|otc_o22.tw|otc_o10.tw|otc_o24.tw|otc_o25.tw|otc_o26.tw|otc_o27.tw|otc_o28.tw|otc_o29.tw|otc_o30.tw|otc_o31.tw|otc_o32.tw|otc_o14.tw|otc_o15.tw|otc_o16.tw|otc_o20.tw|otc_TWTBI.tw|&json=1&delay=0&_="
urlb = "http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_t00.tw|tse_TW50.tw|tse_TWMC.tw|tse_TWIT.tw|tse_TWEI.tw|tse_TWDP.tw|tse_EMP99.tw|tse_HC100.tw|tse_CG100.tw|tse_FRMSA.tw|tse_t001.tw|tse_t002.tw|tse_t003.tw|tse_SC300.tw|tse_DVA150.tw|tse_DVA100.tw|tse_BC30.tw|tse_INE30.tw|tse_ITE30.tw|tse_LV30.tw|tse_LB100.tw|tse_SMC50.tw|tse_SAM50.tw|tse_BC30-1.tw|tse_t011.tw|tse_t031.tw|tse_t051.tw|tse_t01.tw|tse_t02.tw|tse_t03.tw|tse_t04.tw|tse_t05.tw|tse_t06.tw|tse_t07.tw|tse_t21.tw|tse_t22.tw|tse_t08.tw|tse_t09.tw|tse_t10.tw|tse_t11.tw|tse_t12.tw|tse_t13.tw|tse_t24.tw|tse_t25.tw|tse_t26.tw|tse_t27.tw|tse_t28.tw|tse_t29.tw|tse_t30.tw|tse_t31.tw|tse_t14.tw|tse_t15.tw|tse_t16.tw|tse_t17.tw|tse_t18.tw|tse_t23.tw|tse_t20.tw|tse_TTDRL2.tw|tse_TTDRIN.tw|tse_EDRL2.tw|tse_EDRIN.tw|tse_FDRL2.tw|tse_FDRIN.tw|&json=1&delay=0&_="
Url = Choose(j, urla, urlb)

.Open "GET", "http://mis.twse.com.tw/stock/group.jsp?ind=OIDX&ex=otc&currPage=0&type=fixed", False
.send
.Open "GET", Url & UNIXTime, False
.setRequestHeader "Referer", "http://mis.twse.com.tw/stock/group.jsp?ind=OIDX&ex=otc&currPage=0&type=fixed"
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send

f101f101 wrote:
股權結構表執行完出現空資料,查詢之後網址好像有更動,原先https://www.tdcc.com.tw/smWeb/QryStockAjax.do
出現空資料,不知如何更改程式,請教一下,謝謝...(恕刪)


請看yuhuahsiao(461樓)這位高手的說明



yuhuahsiao wrote:
順便問樓主,以下code執行兩次, 可以把.responsetext 加到同一個htmlfile中,之後才一次一起分析資料嗎?...(恕刪)


可以的
我會分2次是因為,一個是tse(上市),另一個是otc(上櫃)

這個網站允許混在一起下載,因為字串長度的限制,所以要把網址先拆成3個部份後,再send
a$ = "otc_o00.tw|otc_GTSM50.tw|otc_GTHD.tw|otc_EMP88.tw|otc_GTCI.tw|otc_TPCGI.tw|otc_GAME.tw|otc_o13.tw|otc_o04.tw|otc_o05.tw|otc_o21.tw|otc_o22.tw|otc_o10.tw|otc_o24.tw|otc_o25.tw|otc_o26.tw|otc_o27.tw|otc_o28.tw|otc_o29.tw|otc_o30.tw|otc_o31.tw|otc_o32.tw|otc_o14.tw|otc_o15.tw|otc_o16.tw|otc_o20.tw|otc_TWTBI.tw|"

b$ = "tse_t00.tw|tse_TW50.tw|tse_TWMC.tw|tse_TWIT.tw|tse_TWEI.tw|tse_TWDP.tw|tse_EMP99.tw|tse_HC100.tw|tse_CG100.tw|tse_FRMSA.tw|tse_t001.tw|tse_t002.tw|tse_t003.tw|tse_SC300.tw|tse_DVA150.tw|tse_DVA100.tw|tse_BC30.tw|tse_INE30.tw|tse_ITE30.tw|tse_LV30.tw|tse_LB100.tw|tse_SMC50.tw|tse_SAM50.tw|tse_BC30-1.tw|tse_t011.tw|tse_t031.tw|tse_t051.tw|tse_t01.tw|tse_t02.tw|tse_t03.tw|tse_t04.tw|tse_t05.tw|tse_t06.tw|tse_t07.tw|tse_t21.tw|tse_t22.tw|tse_t08.tw|tse_t09.tw|tse_t10.tw|tse_t11.tw|tse_t12.tw|tse_t13.tw|tse_t24.tw|tse_t25.tw|tse_t26.tw|tse_t27.tw|tse_t28.tw|tse_t29.tw|tse_t30.tw|tse_t31.tw|tse_t14.tw|tse_t15.tw|tse_t16.tw|tse_t17.tw|tse_t18.tw|tse_t23.tw|tse_t20.tw|tse_TTDRL2.tw|tse_TTDRIN.tw|tse_EDRL2.tw|tse_EDRIN.tw|tse_FDRL2.tw|tse_FDRIN.tw|"


urla = "http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=" & a$ & b$ & "&json=1&delay=0&_="

snare wrote:
請看yuhuahsiao...(恕刪)


樓主 謝謝您
我發現我表達有些錯
我要的是那一網頁有兩個不同的URL(如下), 這樣我可以把.responsetext 加在一起後才分析資料嗎?
我現在是依您教的方式分兩次抓,每次抓完就分析


http://mis.twse.com.tw/stock/api/getStatis.jsp?ex=tse&delay=0&_=1535501306729

http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_t00.tw|otc_o00.tw|tse_FRMSA.tw&json=1&delay=0&_=1535501306768
yuhuahsiao wrote:
一網頁有兩個不同的URL(如下), 這樣我可以把.responsetext 加在一起後才分析資料嗎?...(恕刪)


我還是看不懂

您的意思是,把 1 + 2 ,變成3再處理嗎?
第一次send
temp=.responsetext
第二次send
temp= temp & .responsetext
最後,temp 就是2個responsetext的內容



如果是的話,不建議
這是2種不同的json格式,混在一起沒辦法用簡單的方式處理
除非只是要其中幾個資料,那就可以用split()…等等的文字函數切割


建議改用2個變數處理,程式中 send set 2次,就可以了


urla = "http://mis.twse.com.tw/stock/api/getStatis.jsp?ex=tse&delay=0&_="
urlb = "http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_t00.tw|otc_o00.tw|tse_FRMSA.tw&json=1&delay=0&_="

.Open "GET", urla & UNIXTime, False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"

.send
Set DecodeJson1 = Jsondata.JsonParse(.responsetext)

.Open "GET", urlb & UNIXTime, False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"

.send
Set DecodeJson2 = Jsondata.JsonParse(.responsetext)


snare wrote:
我還是看不懂您的意...(恕刪)


謝謝樓主
好的,我了解了
不同格式分開處理
拜讀幾篇snare大的文章後感覺認知提升很多

不過我自己嘗試用excel VBA抓取網頁資料時利用for迴圈稍微多一點(多網站)的時候excel很容易出現無反應的狀態,只能重新的關閉再開啟該excel。

excel無反應的情況大概就是只剩下關閉鍵能按下去,其他的狀態都是白色的頁面無資料可以點選。
VBA有辦法判斷當讀取時間過長時放棄該網站直接跑下一個網頁或者避免這問題發生嗎?

謝謝
酷馬克 wrote:
不過我自己嘗試用excel VBA抓取網頁資料時利用for迴圈稍微多一點(多網站)的時候excel很容易出現無反應的狀態,只能重新的關閉再開啟該excel。
...(恕刪)


excel無回應的這個情況,通常是使用 ie object 、querytable 的方式,才會出現
因為ie object 、querytable,速度不穩定,抓一個網站有時幾秒,有時1~10分鐘(或更久)
所以才會讓您以為excel 當掉,其實如果很有耐心的等,還是會跑完的

使用xmlhttp,不會有這個現象,因為網站當掉、改版…,在沒任何處理的情況下,
responsetext沒有資料、等待時間太久,程式出錯會直接中斷在send 或 responsetext那一行
excel不會當掉,只有vba會中斷,會的話,大概是程式沒寫好

酷馬克 wrote:
VBA有辦法判斷當讀取時間過長時放棄該網站直接跑下一個網頁或者避免這問題發生嗎?...(恕刪)


可以的

ie object很簡單
可以用 .ReadyState .busy ,2個參數檢查,在程式中加入計時,跳過等比較久的網站


xmlhttp(請參考175樓、291樓(getstockdata_twse副程式)、393樓)

.open "GET"(post),url,false ==> 同步
網站出問題,會在 send 那一行中斷
網站改版,會在取 responsetext資料時中斷
可用 on error resume(goto) 避免程式中斷,繼續抓下一個網站的資料

.open "GET"(post),url,true ==> 非同步(異步)
雖然可自訂等待時間,但通常不會用非同步這個方式
因為時間設太短會漏資料,還需要另外寫程式判斷是否成功抓完


同步、非同步,2種方式,也可以搭配Application.OnTime Now,排程,重新下載


請教snare大,
1.有關股票利用access + sql+excel vba 來分析資料的話,是否有參考的書籍或網站可介紹?
2.您製作的那份集保access是把每個股票的集保製作一個table存入,我最近將201608xx~201808xx周集保資料放在access資料庫同一個table內供excelv以vba存取,請問那個方式效率會比較高(事關我要將股票每日盤後資料、月營收及季財報等資料放置於access資料庫內供excel使用,一直苦惱著要如何製作)?



tmwcykixe wrote:
1.有關股票利用access + sql+excel vba 來分析資料的話,是否有參考的書籍或網站可介紹?
...(恕刪)

網站的話
大陸的 http://club.excelhome.net/forum.php
台灣的 麻辣論譠

英文沒問題的話,資料更多
https://stackoverflow.com/
https://www.ozgrid.com/forum/
http://www.vbaexpress.com/
(……還有很多)

我的書都是dos時代的東西,後來都是上網自學的,所以書籍沒辦法介紹,只能給點意見
想要學如何建立access資料庫,可以買台灣的
vba sql,建議買大陸的,程度比坊間的書籍高太多了


tmwcykixe wrote:
2.您製作的那份集保access是把每個股票的集保製作一個table存入,我最近將201608xx~201808xx周集保資料放在access資料庫同一個table內供excelv以vba存取,請問那個方式效率會比較高(事關我要將股票每日盤後資料、月營收及季財報等資料放置於access資料庫內供excel使用,一直苦惱著要如何製作)?
...(恕刪)


vba sql 其實都差不多快,程式的寫法對速度影響比較大
就像抓一個網站的資料,使用xmlhttp 跟使用 ie object 、query table
速度上就是天、地的差別,所以程式的寫法比較重要
可以回頭去玩玩358樓的範例(使用離線資料庫2)
每次查詢都是從大約2百萬列,挑出想要的資料,都在滑鼠點下去的一瞬間,就查好了


真要比的話
access 資料庫 + access vba sql ,最快
access 資料庫 + excel vba sql,中間
excel 檔案 + excel vba sql ,最慢
(excel 檔案也可以當成資料庫使用sql查詢,請google excel vba sql 有很多範例)



access table 的建立方式,沒什麼影響
資料庫建立的愈好,sql語法愈好寫
全混在一起也可以,只是sql語法會變的很複雜

所謂的好,就是
一、分類
二、關聯性
三、進階一點的,資料種類、大小、屬性設定

access資料庫的建立
這方面沒什麼特別的,就是有整理好,跟沒整理好、跟日後是否方便維護的差別
詳細請google或看書



tmwcykixe wrote:
3.我最終想要在excel所呈現的類似畫面如下。
...(恕刪)


對不起這點,完全幫不上忙

我對股票的認識,只會現股買賣,只看的懂每股價格而已
雖然寫了一堆範例,但我都沒用到
其它什麼財報、分析什麼的,我完全不會
總表的整理,請自己加油
感謝snar的回復,
1.我目前也是在http://club.excelhome.net/forum.php survey ,麻辣在這access +excel vba sql這塊的文章似乎不多.
2.如您所說,access table 的建立好壞牽涉到日後sql select語法,這正是我現在困擾的地方,如何分類;關聯性是啥都還不懂的情況下不敢貿然將既有excel資料匯入access,還是先向google大神學習一下再入手,以後比較不會麻煩。
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 144)

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