Contents ...
udn網路城邦
[Excel VBA] 抓取台北期交所 (Taifex) 網站提供的資訊(上)
2009/03/07 22:28
瀏覽13,400
迴響15
推薦1
引用0

台北期貨交易所 (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 設計的人一定都知道, 答案是 "看網頁", 如果您有興趣想知道方法, 請看我的(下) 篇

有誰推薦more
迴響(15) :
15樓. qucvd
2014/08/11 02:46
14樓. ehagx
2014/07/15 05:15
13樓. 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
請問該修改哪個地方? 謝謝 ^^

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

版主你好

這excel VBA 的文章我看了好久

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

只是和開個新檔沒有兩樣

裡面的function 沒有被執行

我把

    Sub GetFutureDailyRPT(...)

      Sub Test()

都寫在模組->module1

可是都不會被執行

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

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

請問是我哪邊做錯了呢?

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

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

11樓. qaz
2010/11/01 05:09
請問一下
請問一下我現在用的是IE
但是無法全選來複製程式碼呢
請問一下要如何才能複製這段程式碼呢?
謝謝版主
10樓. leggie
2009/08/26 16:49
檔案

檔案已經變成super junior.doc?

請問還能分享嗎?

謝謝

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

更正下載網址:

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

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

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

經測試正確

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

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

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

請問版主:

如何修改程式碼?

另外還有選擇權!!

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

那兩個表格是用頁面內含的 Javascript 帶出來的,所以......

ThisIsTheWay2009/07/24 16:36回覆
發表迴響

會員登入