Excel 股市資料抓取服務

提供Excel 股市資料抓取服務
可透過下列方式聯絡我
Email: iamaraymond@yahoo.com.tw
(FB請先加我好友再私訊,不然會跑到陌生訊息)

課程:
Excel VBA 金融資料抓取 | 打造股票研究系統 (學生數: 602,學員評價5顆星)
無痛起步-Excel VBA超入門實戰(學生數: 413,學員評價5顆星)


2018年8月17日 星期五

Excel VBA 下載CSV

Excel VBA有蠻多種下載CSV的方式
1.使用Workbooks.Open(網址)
2.使用QueryTable
3.使用XMLHTTP物件

以上一篇文章抓的三大法人買賣超日報為範例




1.workbook.open
Sub test1()
Dim t: t = Timer
Workbooks.Open Filename:= _
"http://www.twse.com.tw/fund/T86?response=csv&date=20180813&selectType=11"
Debug.Print Format(Timer - t, "0.00秒")
End Sub
view raw workbook.open hosted with ❤ by GitHub

2.QueryTable
Sub test2()
Dim t: t = Timer
With ActiveSheet.QueryTables.Add(Connection:="URL;http://www.twse.com.tw/fund/T86?response=csv&date=20180817&selectType=11", Destination:=Range("A1"))
.WebSelectionType = xlAllTables
.WebFormatting = xlWebFormattingNone
.Refresh BackgroundQuery:=False
.Delete
End With
Debug.Print Format(Timer - t, "0.00秒")
End Sub
view raw QueryTable hosted with ❤ by GitHub

3.XMLHTTP
Sub test3()
Dim t: t = Timer
Cells.Clear
Dim myXML As Object
Set myXML = CreateObject("Microsoft.XMLHTTP")
With myXML
.Open "GET", "http://www.twse.com.tw/fund/T86?response=csv&date=20180817&selectType=11", False
.send
myText = convertraw(.responseBody)
Debug.Print myText
myText1s = Split(myText, Chr(10))
i = 1
For Each myText1 In myText1s
myText2s = Split(myText1, """,""")
j = 1
For Each myText2 In myText2s
Cells(i, j) = Replace(Replace(Replace(myText2, """,", ""), Chr(13), ""), Chr(34), "")
j = j + 1
Next
i = i + 1
Next
End With
Set myXML = Nothing
Debug.Print Format(Timer - t, "0.00秒")
End Sub
view raw XMLHTTP hosted with ❤ by GitHub


簡單做個比較
1.Workbooks.Open
語法簡單,速度中(1.26秒)
但一個很大的缺點是下載了新的Excel
如果我們平常是將資料固定放在特定Excel檔,只是想更新數據
那麼我們就必須寫入切換活頁簿、使用完後刪掉CSV檔等語法
因此雖然下載的語法簡單,但後面有很多細節要處理

2.QueryTable
語法不難,如果忘記的話直接錄製一次巨集即可得到程式碼,再稍加修改
速度偏慢(2.4秒)
相比於workbook.open
使用QueryTable可將資料直接下載至當前的活頁簿
因此不須另外切換活頁簿

3.XMLHTTP
語法偏難,但速度最快
即使包含了資料整理也僅僅只要0.34秒
但須具備一些網路基礎知識,對於初學者較不易上手



8 則留言:

  1. 請教我試您的程式,出現myText = convertraw(.responseBody),沒有定義這個Function,或Sub,請指點!

    回覆刪除
  2. 哈囉~此錯誤可能是因為您尚未將convertraw的程式碼加進您的程式碼中

    回覆刪除
  3. convertraw程式碼在
    https://raymondchiendtrt.blogspot.com/2018/08/excel-vba.html

    回覆刪除
  4. 您好:
    想請問為什麼我在嘗試下載全產業的時候都會出現問題呢?
    例如把網址改成:"http://www.twse.com.tw/fund/T86?response=csv&date=20180817&selectType=ALL"
    都會出現錯誤,嘗試過其他寫法也碰到一樣的情況,望大神解惑><

    回覆刪除
    回覆
    1. 哈囉,請問你是使用哪一種方式,執行後出錯呢

      刪除
  5. 請問上櫃的三大法人買賣超該如何處理?感謝

    回覆刪除
  6. 您好,有緣拜讀到您的部落格文章,我在實作上遇到了一些問題,想要請教您,非常感謝。

    我是使用第3種方式,如果只是選單一產業都可正常抓取
    但如果是選"全部"(selectType=ALL),就會出現錯誤。

    完整網址:https://www.twse.com.tw/fund/T86?response=csv&date=20220906&selectType=ALL

    出現錯誤的訊息是
    執行階段錯誤 '1004':
    應用程式或物件定義上的錯誤

    卡在程式的這一行
    Cells(i, j) = Replace(Replace(Replace(myText2, """,", ""), Chr(13), ""), Chr(34), "")

    感謝您,祝順心

    回覆刪除
  7. 請問RC版主 用 XMLHTTP 抓取 富邦財務比率表格 會將資料同時放在同一儲存格不會換列,但用 QUERY 方法 同樣表格可以分到不同儲存格,請問這是問題出在哪?

    回覆刪除