網路城邦
上一篇 回創作列表 下一篇   字體:
[Excel VBA] 抓取台北期交所 (Taifex) 網站提供的資訊(上)
2009/03/07 22:28:30瀏覽19414|回應13|推薦1

台北期貨交易所 (Taifex) 網站有提供盤後資訊、三大法人進出的資訊讓大家查詢, 於是常有人想將這些資訊直接匯到 Excel 工作表裡去做統計或處理。我就舉台北期交所網站英文版的 Future - Daily Market Report (期貨-每日交易行情)查詢為例, 來介紹抓這些資料的方法。我把做法寫成一個副程式--GetFutureDailyRPT():

Sub GetFutureDailyRPT(rptWkbStr As String, rptShtStr As String, rptRngStr As String, YYYY As String, MM As String, DD As String, Contract As String)
'抓取 Taifex (台北期交所) 網站英文版的 Future - Daily Market Report

'YYYY 是欲抓資料的年份, 例如: "2009", "2007"
'MM   是欲抓資料的月份, 例如: "1", "2", ......"12" 皆可
'DD   是欲抓資料的日期, 請注意: 此年月日必須是交易日, 才會有資料可查
'Contract 是欲查詢的合約種類, 例如: CPF, GBF, GDF......
         '若要全部的話不是 "ALL", 而是 "", 也就是空字串
'rptWkbStr 是欲存此資料的活頁簿名稱, 例如: "Book1", "Book2.xls" (不含磁碟路徑)
'rptShtStr 是欲存此資料的工作表名稱, 例如: "sheet1", "sheet2" ...
'rptRngStr 是欲存此資料的範圍左上角儲存格名稱, 例如: "A1", "C3"...

Workbooks(rptWkbStr).Worksheets(rptShtStr).Range("A:Z").ClearContents '先清除整張工作表

With Workbooks(rptWkbStr).Worksheets(rptShtStr).QueryTables.Add(Connection:="URL;http://www.taifex.com.tw/eng/eng3/eng3_1.asp?syear=" _
    & YYYY & "&smonth=" & MM & "&sday=" & DD & "&COMMODITY_ID=" & Contract _
    , Destination:=Workbooks(rptWkbStr).Worksheets(rptShtStr).Range(rptRngStr))

    .Name = YYYY & "-" & MM & "_" & DD & "-" & Contract
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .WebSelectionType = xlEntirePage
    .WebFormatting = xlWebFormattingNone
    .WebPreFormattedTextToColumns = True
    .WebConsecutiveDelimitersAsOne = True
    .WebSingleBlockTextImport = False
    .WebDisableDateRecognition = False
    .WebDisableRedirections = False
    .Refresh BackgroundQuery:=False
End With

End Sub

接下來舉例說明它的用法, 首先我們把上面 GetFutureDailyRPT() 和底下Test()的程式碼都貼入某活頁簿裡的模組裡。執行 Test() 程式, 會將2009年3月5日的CPF、GBF、GDF交易行情分別存入 C:\Book2.xls  的 sheet1、sheet2、sheet3 (假設此檔案裡面已有這三張工作表):

Sub Test()
 '使用 GeFuturetDailyRPT() 的實例

Application.Workbooks.Open "C:\Book2.xls" '開檔

Call GetFutureDailyRPT("Book2.xls", "sheet1", "A1", "2009", "3", "5", "CPF") '查詢 2009年3月5日的交易資料
Call GetFutureDailyRPT("Book2.xls", "sheet2", "A1", "2009", "3", "5", "GBF")
Call GetFutureDailyRPT("Book2.xls", "sheet3", "A1", "2009", "3", "5", "GDF")

Application.Workbooks("Book2.xls").Close SaveChanges:=True '存檔並且關檔
 
End Sub

期貨的合約種類的 CPF、GBF、GDF......等等還有哪些? 代表什麼意思? 可以去台北期交所網站去使用 "每日交易行情表查詢" 功能就會知道。

除了上面示範的以外,  台北期交所網站上還有一些其他的查詢做法也類似, 例如我想要從中文版網頁抓 "選擇權" 的每日交易行情資料, 只需把 GetFutureDailyRPT() 副程式複製一份, 改名為 GetOptionDailyRPT() 把裡面的 with 這一行, 改成底下這樣就好了:

With Workbooks(rptWkbStr).Worksheets(rptShtStr).QueryTables.Add(Connection:="URL;http://www.taifex.com.tw/chinese/3/3_2_2.asp?DATA_DATE_Y=" _
    & YYYY & "&DATA_DATE_M=" & MM & "&DATA_DATE_D=" & DD & "&COMMODITY_ID=" & Contract _
    , Destination:=Workbooks(rptWkbStr).Worksheets(rptShtStr).Range(rptRngStr))

我要 "富邦金" 選擇權 (AJO ) 2009年3月4日的行情表, 就這樣寫:

Call GetOptionDailyRPT("Book2.xls", "sheet1", "A1", "2009", "3", "4", "AJ")

您看出差異了嗎? 不同的查詢, Connection:= 後面那一串就會不一樣。我怎麼知道哪個查詢該怎麼寫? 懂 ASP 設計的人一定都知道, 答案是 "看網頁", 如果您有興趣想知道方法, 請看我的(下) 篇

( )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=WayCheng&aid=2719876

 回應文章 頁/共 2 頁  回應文章第一頁 回應文章上一頁 回應文章下一頁 回應文章最後一頁

Color
請問該修改哪個地方
2011/10/05 00:37

HI~你好
看了這篇獲益良多,但有幾個問題想請教一下
1.Sub Test()

Call GetFutureDailyRPT("Book2.xls", "sheet1", "A1", "2009", "3", "5", "CPF")

End Sub

都需要每次進來key in 日期, 有辦法直接抓excel上的日期嗎?

2.一樣是期貨交易所的網頁
但是這個用一樣的方法卻只能抓到上方的表,下方的抓不到
http://www.taifex.com.tw/chinese/3/7_12_3.asp
請問該修改哪個地方? 謝謝 ^^


seacode
請問如何執行
2011/02/24 18:02

版主你好

這excel VBA 的文章我看了好久

也實際把code key 進去了, 可是用 excel 開啟 book1.xls後

只是和開個新檔沒有兩樣

裡面的function 沒有被執行

我把

    Sub GetFutureDailyRPT(...)

      Sub Test()

都寫在模組->module1

可是都不會被執行

我是利用 工具 -> 巨集 -> VisualBasic編輯器 進到裡面去編輯的

做了執行 Test() 之後, 一樣都沒有任何變化

請問是我哪邊做錯了呢?

上篇回文的檔案現在抓下來會變成很奇怪的執行檔

不知道版主是否願意教導一下, 謝謝!


qaz
請問一下
2010/11/01 05:09
請問一下我現在用的是IE
但是無法全選來複製程式碼呢
請問一下要如何才能複製這段程式碼呢?
謝謝版主

leggie
檔案
2009/08/26 16:49

檔案已經變成super junior.doc?

請問還能分享嗎?

謝謝


chwqk
期指大額交易人
2009/08/02 21:53

更正下載網址:

http://www.taifex.com.tw/chinese/7/7_8.asp


chwqk
期貨大額交易人
2009/08/01 16:40

版主所提案例為抓取期或交易資訊

經測試正確

只是我目前想整理研究資料為"期貨大額交易人"

http://www.taifex.com.tw/chinese/7/7_8_1.asp?

其需輸入日期有兩個 分別為 "起日期" 與 "迄日期"

請問版主:

如何修改程式碼?

另外還有選擇權!!


井澤
VBA發問
2009/07/27 15:33
我有一個問題想發問? 我如果要抓的資料,是要先登入帳密(像yahoo或者鉅亨網),之後打開的"jsp" <-- (沒錯,是jsp),不知道這種能否寫成VBA使用~?

David702
可否指教一下
2009/07/22 15:27

你好, 小弟有一問題希望閣下可以指教一下.

這是香港賽馬會的其中兩個位置,

http://www.hkjc.com/chinese/racing/StartersR2_ST_20090701_C.asp    排位表

http://bet.hkjc.com/racing/pages/odds_wpq.aspx?date=01-07-2009&venue=ST&raceno=1#  賠率表

這兩個地方不能用閣下以上的方法"完全"抓取, 請問有否其他方法可以解決.

多謝.

david702@hotmail.com

ThisIsTheWay(WayCheng) 於 2009-07-24 16:36 回覆:
那兩個表格是用頁面內含的 Javascript 帶出來的,所以......


DeepKiss
關於ASP碼
2009/07/12 22:42
針對台灣期貨交易所網頁中的下拉式查詢格子
中英語網頁中的原始碼,它均是這麼寫的
<SELECT id=DATE_DATE_Y name=syear>
我曾試過用中文版的ASP URL,加上syear(英文版VBA中的參數)
發覺也是能擱取資料的,似乎是共通的

不過此台期所的例子太深奧太偉大了,還是第一次用querytable,很多東西沒見過
那個URL後面的分號是用來幹什麼的? 好像沒用過此符號

ThisIsTheWay(WayCheng) 於 2009-07-24 16:16 回覆:
那個分號是用來分隔。Connection 字串可有幾種型態,例如:

"ODBC;<連接字串>"
"URL;<url>"
"TEXT;<文字檔路徑和名稱>"

查 Excel VBA 的 Help 裡關於 QueryTables 的 Add 方法,即可得到詳細說明。

koko
感謝
2009/07/01 07:12
找不到網址無所謂
在這我已學到許多了
謝謝喔~
頁/共 2 頁  回應文第一頁 回應文章上一頁 回應文章下一頁 回應文章最後一頁