台北期貨交易所 (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 設計的人一定都知道, 答案是 "看網頁", 如果您有興趣想知道方法, 請看我的(下) 篇。
- 13樓. Color2011/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樓. seacode2011/02/24 18:02請問如何執行
版主你好
這excel VBA 的文章我看了好久
也實際把code key 進去了, 可是用 excel 開啟 book1.xls後
只是和開個新檔沒有兩樣
裡面的function 沒有被執行
我把
Sub GetFutureDailyRPT(...)
Sub Test()
都寫在模組->module1
可是都不會被執行
我是利用 工具 -> 巨集 -> VisualBasic編輯器 進到裡面去編輯的
做了執行 Test() 之後, 一樣都沒有任何變化
請問是我哪邊做錯了呢?
上篇回文的檔案現在抓下來會變成很奇怪的執行檔
不知道版主是否願意教導一下, 謝謝!
- 11樓. qaz2010/11/01 05:09請問一下
請問一下我現在用的是IE
但是無法全選來複製程式碼呢
請問一下要如何才能複製這段程式碼呢?
謝謝版主 - 10樓. leggie2009/08/26 16:49檔案
檔案已經變成super junior.doc?
請問還能分享嗎?
謝謝
- 9樓. chwqk2009/08/02 21:53
- 8樓. chwqk2009/08/01 16:40期貨大額交易人
版主所提案例為抓取期或交易資訊
經測試正確
只是我目前想整理研究資料為"期貨大額交易人"
http://www.taifex.com.tw/chinese/7/7_8_1.asp?
其需輸入日期有兩個 分別為 "起日期" 與 "迄日期"
請問版主:
如何修改程式碼?
另外還有選擇權!!
- 7樓. 井澤2009/07/27 15:33VBA發問
我有一個問題想發問? 我如果要抓的資料,是要先登入帳密(像yahoo或者鉅亨網),之後打開的"jsp" <-- (沒錯,是jsp),不知道這種能否寫成VBA使用~? - 6樓. David7022009/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# 賠率表
這兩個地方不能用閣下以上的方法"完全"抓取, 請問有否其他方法可以解決.
多謝.
- 5樓. DeepKiss2009/07/12 22:42關於ASP碼
針對台灣期貨交易所網頁中的下拉式查詢格子
中英語網頁中的原始碼,它均是這麼寫的
<SELECT id=DATE_DATE_Y name=syear>
我曾試過用中文版的ASP URL,加上syear(英文版VBA中的參數)
發覺也是能擱取資料的,似乎是共通的
不過此台期所的例子太深奧太偉大了,還是第一次用querytable,很多東西沒見過
那個URL後面的分號是用來幹什麼的? 好像沒用過此符號
那個分號是用來分隔。Connection 字串可有幾種型態,例如:
"ODBC;<連接字串>"
"URL;<url>"
"TEXT;<文字檔路徑和名稱>"
查 Excel VBA 的 Help 裡關於 QueryTables 的 Add 方法,即可得到詳細說明。
ThisIsTheWay 於 2009/07/24 16:16回覆 - 4樓. koko2009/07/01 07:12感謝
找不到網址無所謂
在這我已學到許多了
謝謝喔~