網路城邦
上一篇 回創作列表 下一篇   字體:
[Excel VBA] 抓取台北期交所 (Taifex) 網站提供的資訊(上)
2009/03/07 22:28:30瀏覽19488|回應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 設計的人一定都知道, 答案是 "看網頁", 如果您有興趣想知道方法, 請看我的(下) 篇

( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

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

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

koko
證交所的CSV檔
2009/06/26 06:18

請問

若想直接下載證交所的CSV檔,如下址有個[另存CSV]的圖示,該如何知道其下載網址?

http://www.twse.com.tw/ch/trading/indices/MI_5MINS_HIST/MI_5MINS_HIST.php

感謝前輩解惑~

ThisIsTheWay(WayCheng) 於 2009-06-26 22:14 回覆:
我從業面原始碼無法解出 CSV 檔的 URL
抱歉

Linus
請問~
2009/05/12 00:31
前輩你好^^
我最近也在學習如何上網抓取資料,如果說我想從證交所的網站上下載資料
http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/genpage/Report200905/A112200905110999.php?select2=0999&chk_date=98/05/11
不同的日期的歷史資料,我該怎麼改前輩的原始程式碼呢?
謝謝你喔!
ThisIsTheWay(WayCheng) 於 2009-06-04 11:00 回覆:



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 Dim GetDate As String
Workbooks(rptWkbStr).Worksheets(rptShtStr).Range("A:Z").ClearContents '先清除整張工作表
GetDate = Format(YY, "00") & "/" & Format(MM, "00") & "/" & Format(DD, "00")
With Workbooks(rptWkbStr).Worksheets(rptShtStr).QueryTables.Add(Connection:="URL; _
http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/genpage/Report200905_/A112200905110999.php?select2=0999&chk_date=" _ , Destination:=Workbooks(rptWkbStr). _ Worksheets(rptShtStr).Range(rptRngStr))
.Name = YYYY & "-" & MM & "-" & DD & "-" .Name = "11"
.FieldNames = True .RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "9"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False End With
ThisIsTheWay(WayCheng) 於 2009-06-04 11:05 回覆:
 抱歉!今天才看到此篇留言。請把 GetFutureDailyRPT()副程式李的程式碼改成像上面這樣就可以了!

altolee
請問excel vba
2009/03/30 19:22
您好

因為最近在學習excel vba抓資料
所以發現您的網站
實際把您提供的程式碼貼上
僅有開啟Book2.xls並沒有執行任何的動作

不知道是不是哪裡出了問題
方便將excel檔案mail給您嗎

留我個人的mail
請您轉寄您的範例excel檔

謝謝您

altolee@gmail.com

ThisIsTheWay(WayCheng) 於 2009-03-31 11:38 回覆:
我把檔案放在這裡供您下載:

GetFDR_Example.XLS

(程式碼在 "模組" 裡)

正常狀況是,Book2.xls 會被打開,數秒鐘之後又被關掉,資料就已經在裡面了!

試試看吧!



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