Board logo

標題: [原創] 上市櫃三大法人買賣超日報資料彙整處理 [打印本頁]

作者: VBALearner    時間: 2016-8-3 11:07     標題: 上市櫃三大法人買賣超日報資料彙整處理

這是小弟我做的上市櫃三大法人買賣超日報資料彙整
不過需要每天去證交所和櫃買中心下載買賣超日報和盤後的價格資料(有人可以改寫自動下載功能並分享的話,小弟我將五體投地佩服至極xD)
例如:上櫃法人買賣超的檔名是SQUO*......
批量匯入或單日更新的資料夾位置也要自行去看我的程式碼做更改xD
不過這是半成品,所以還需要大家的珍貴意見,任何能讓程式加速或更多功能的方法之類的...小弟還要多跟版上高手學習^^
進一步的資料分析功能還沒做,只有做簡單的測試功能
1.法人連買幾日
2.法人區間內買超天數達幾日以上...
大家就自行發揮創意改程式碼再上來分享給吧~~~
感謝各位高手為我解惑,在此將小弟的新手作品貢獻給大家使用~~
也感謝管理群的拔擢與信賴!!![attach]24827[/attach]
作者: joey0415    時間: 2016-8-4 08:49

回復 1# VBALearner
如果只計算二三十天,這樣放沒有問題

如果要計算一二年,可能要放直立式的,透過sql語法,放進簡單的資料庫如access  sqlite等, 容量大速度快

excel只是下命令與最後資料呈現的地方,讓資料庫自行運算

速度超快

參考看看

例如以下圖片,如果會下指令,可以查出某時間內,外資共買幾次,佔股本多少等,格式建立好,會查多少就看你sql功力
[attach]24832[/attach]
作者: VBALearner    時間: 2016-8-4 10:22

本帖最後由 VBALearner 於 2016-8-4 10:25 編輯

回復 2# joey0415

哇......您高手專業...但是我不會寫...sql這個語言?! 不過Access倒是有,他也是用VBA就能操作的沒錯吧? 這樣好像是Access比較容易上手的感覺...
可以請教您在哪裡學習資料庫的程式語言嗎?! 您的法人資料庫附圖應該就是您的大作吧XD?
我再去市面上翻幾本Access的書看看,謝謝您的意見
作者: joey0415    時間: 2016-8-4 14:17

本帖最後由 joey0415 於 2016-8-4 14:18 編輯

回復 3# VBALearner

幾萬筆或幾百萬筆資料的整合,放資料庫才是正確

透過excel vba  操作資料庫  並使用sql語法來選取你要的資料才是正確

真的快又有效

sql語法教學

http://www.1keydata.com/tw/sql/sql.html

excel vba  connect  access 教學
http://tgw1029.blogspot.tw/2010/01/excel-vba-adoaccess_06.html

http://blog.xuite.net/crdotlin/excel/9056917-Access%E8%B3%87%E6%96%99%E5%BA%AB%E7%9A%84%E9%80%A3%E7%B5%90

http://tgw1029.blogspot.tw/2010/01/excel-vba-adoaccess.html

影音教學

https://www.youtube.com/results?search_query=excel+vba+connect+access
作者: PKKO    時間: 2016-8-4 14:30

回復 3# VBALearner


    您的程式碼只有整理資料的部分
主要下載資料的程式碼,你的Myfile 沒有提供,恐怕網友們無法學習如何下載哦!
Workbooks.Open "C:\三大法人更新區\" & myfile
作者: VBALearner    時間: 2016-8-4 15:24

本帖最後由 VBALearner 於 2016-8-4 15:26 編輯

回復 5# PKKO

我的程式碼裡有一段
myfile = Dir("C:\三大法人更新區\201*")
可以從C槽的三大法人更新區資料夾取出XXX開頭的Excel檔檔名作為資料來源"myfile"
不過無法自動下載就是了,要手動下載後把檔案移到C槽更新資料夾裡,還是您願意分享如何從網頁上自動下載檔案OwO?!
作者: VBALearner    時間: 2016-8-4 15:28

回復 4# joey0415

喔天啊~~感謝您提供這麼多資料庫的教學網站!!!
我日後再向您努力學習!!!
只能加個好友先xD
作者: PKKO    時間: 2016-8-4 18:31

回復 6# VBALearner


    了解,是我誤會標題,以為是自動下載,但您的標題已經很明顯是彙整處理
抱歉抱歉~
作者: c_c_lai    時間: 2016-8-5 14:49

回復 1# VBALearner
你那 "C:\三大法人更新區\201*" 裡的
檔案內容是否如:
[attach]24841[/attach]
一樣?
是否也請上傳一個 "C:\三大法人更新區\201*"
中之任一檔案做為參考?
作者: VBALearner    時間: 2016-8-5 15:09

回復 9# c_c_lai

恩恩BIGD*開頭的是上櫃買賣超日報
201*開頭的是上市買賣超日報
SQUOTE*開頭的是上櫃行情表
A112201*開頭的是上市行情表
作者: c_c_lai    時間: 2016-8-5 15:20

回復 10# VBALearner
能否提共另三個網址?
作者: VBALearner    時間: 2016-8-5 15:50

回復 11# c_c_lai

上市買賣超日報 : http://www.twse.com.tw/ch/trading/fund/T86/T86.php
上市盤後行情表 : http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX.php
上櫃買賣超日報 : http://www.tpex.org.tw/web/stock/3insti/daily_trade/3itrade_hedge.php?l=zh-tw
上櫃盤後行情表 : http://www.tpex.org.tw/web/stock/aftertrading/otc_quotes_no1430/stk_wn1430.php?l=zh-tw

目前這個彙整Excel還在開發階段哈哈哈,未來能有什麼價值還待琢磨...-w-
作者: c_c_lai    時間: 2016-8-6 10:34

本帖最後由 c_c_lai 於 2016-8-6 10:36 編輯

回復 12# VBALearner
我做了一些更動 (整合、以及語法修正), 請參考:
[attach]24848[/attach]
至於自動下載尚在研究、思考中。
上市上櫃交易(tbl As String, tbl2 As String, pos1 As Integer, pos2 As Integer, typ As String, Optional auto As Boolean = False)
中的 auto 即為預留之伏筆。
作者: c_c_lai    時間: 2016-8-6 11:23

本帖最後由 c_c_lai 於 2016-8-6 11:52 編輯

回復 12# VBALearner
  1. Option Explicit
  2. Option Base 1

  3. Sub 調整儲存格大小()
  4.     Dim cts As Integer
  5.    
  6.     For cts = 1 To Sheets.Count
  7.         With Sheets(cts)
  8.             .Activate
  9.             .Columns.ColumnWidth = 10
  10.             .Rows.RowHeight = 15
  11.         End With
  12.     Next
  13. End Sub

  14. Sub 批量匯入買賣超與價格()
  15.     Call 上市上櫃交易("上市外資", "上市投信", 4, 7, "201*")    '  批量匯入買賣超
  16.     Call 上市上櫃交易("上櫃外資", "上櫃投信", 4, 7, "BIG*")    '  批量匯入價格
  17.     Call 上市上櫃交易("上市收盤價", "", 8, 0, "A112201*")     '  更新買賣超
  18.     Call 上市上櫃交易("上櫃收盤價", "", 2, 0, "SQUOTE*")     '  更新價格
  19.     Beep
  20. End Sub

  21. Sub 上市上櫃交易(tbl As String, tbl2 As String, pos1 As Integer, pos2 As Integer, typ As String, Optional auto As Boolean = False)
  22.     Dim myFile As String, myDate As String
  23.     Dim rng As Range, stkNo As Variant
  24.     Dim wb As Workbook
  25.     Dim cts As Long, xs As Long
  26.    
  27.     Application.ScreenUpdating = False
  28.     xs = Sheets(tbl).Range("A" & Rows.Count).End(xlUp).Row
  29.     ReDim tget2(xs - 1) As Long
  30.     If pos2 > 0 Then
  31.         ReDim tget3(xs) As Long
  32.     End If

  33.     stkNo = Application.Transpose(Range(Sheets(tbl).Range("A2"), Sheets(tbl).[A2].End(xlDown)))
  34.       
  35.     myFile = Dir("C:\三大法人更新區\" & typ)
  36.     Do While myFile <> ""
  37.         Workbooks.Open "C:\三大法人更新區\" & myFile
  38.         Select Case typ
  39.             Case "201*"               '  (20160802_2by_issue.csv)
  40.                 myDate = Left(myFile, 8)
  41.             Case "BIG*"               '  (BIGD_1050802.csv)
  42.                 myDate = Mid(myFile, 6, 7): myDate = CStr((Val(Left(myDate, 3)) + 1911)) + Mid(myDate, 4, 4)
  43.             Case "A112201*"           '  (A11220160802ALL.csv)
  44.                 myDate = Mid(myFile, 5, 8)
  45.             Case "SQUOTE*"            '  (SQUOTE_AL_1050802.csv)
  46.                 myDate = Mid(myFile, 11, 7): myDate = CStr((Val(Left(myDate, 3)) + 1911)) + Mid(myDate, 4, 4)
  47.         End Select
  48.          
  49.         myDate = Left(myDate, 4) + "/" + Mid(myDate, 5, 2) + "/" + Right(myDate, 2)
  50.         
  51.         myFile = Dir '第二次調用Dir函數而不帶任何參數,則會返回至同一目錄下的下一個文件
  52.         
  53.         Set wb = ActiveWorkbook
  54.         With Sheets(1)
  55.             For cts = 1 To xs - 1
  56.                 Set rng = .Range("A:A").Find(stkNo(cts))
  57.                 If Not rng Is Nothing Then
  58.                     tget2(cts) = IIf(IsNumeric(rng.Offset(0, pos1).Value), rng.Offset(0, pos1).Value, 0)                    '  (0, 8)
  59.                     If pos2 > 0 Then tget3(cts) = IIf(IsNumeric(rng.Offset(0, pos2).Value), rng.Offset(0, pos2).Value, 0)   '  (0, 7)
  60.                 Else
  61.                     tget2(cts) = 0
  62.                     If pos2 > 0 Then tget3(cts) = 0
  63.                 End If
  64.             Next
  65.         End With
  66.         wb.Close SaveChanges:=False
  67.         
  68.         With Sheets(tbl)
  69.             .Activate
  70.             Set rng = Range(.[A1], .[A1].End(xlToRight))     '  從 A 欄至最右欄位範圍
  71.             Set rng = rng.Find(CDate(myDate), LookIn:=xlValues, LookAt:=xlWhole)
  72.             If rng Is Nothing Then
  73.                 .Range("C:C").Insert
  74.                 Set rng = .[C1]
  75.                 rng.Value = myDate
  76.             End If
  77.             '  Range(.Range("C2"), .Range("C" & .[A2].End(xlDown).Row)) = Application.Transpose(tget2)
  78.             Range(rng.Offset(1), .Range(Chr(64 + rng.Column) & .[A2].End(xlDown).Row)) = Application.Transpose(tget2)
  79.         End With
  80.         
  81.         If tbl2 <> "" Then
  82.             With Sheets(tbl2)
  83.                 .Activate
  84.                 Set rng = Range(.[A1], .[A1].End(xlToRight))     '  從 A 欄至最右欄位範圍
  85.                 Set rng = rng.Find(CDate(myDate), LookIn:=xlValues, LookAt:=xlWhole)
  86.                 If rng Is Nothing Then
  87.                     .Range("C:C").Insert
  88.                     Set rng = .[C1]
  89.                     rng.Value = myDate
  90.                 End If
  91.                 '  Range(.Range("C2"), .Range("C" & .[A2].End(xlDown).Row)) = Application.Transpose(tget3)
  92.                 Range(rng.Offset(1), .Range(Chr(64 + rng.Column) & .[A2].End(xlDown).Row)) = Application.Transpose(tget3)
  93.             End With
  94.         End If
  95.     Loop
  96.    
  97.     Application.ScreenUpdating = True
  98. End Sub
複製代碼

作者: VBALearner    時間: 2016-8-6 11:56

回復 14# c_c_lai

哇~縮減好多程式碼 當初也沒想到要用select case~感謝!!! 再過一兩天我把新增加的功能加上去 再Po上來給大家看看~
作者: zyzzyva    時間: 2016-8-16 22:32

我目前都是用python把資料抓下來,感覺python好像比較好寫一點。
http://forum.twbts.com/thread-18219-1-1.html
可以用shell的方式整合在原來的程式中。
  1. exe_path = ThisWorkbook.Path & "\getTwseOtc\getTwseOtc.exe"
  2. ChDir (exe_path)
  3. Shell (exe_path)
  4. Application.Wait (Now + TimeValue("0:00:05"))
複製代碼

作者: VBALearner    時間: 2016-8-16 23:35

回復 16# zyzzyva

阿阿我衝動地先回覆了您的原創文了xD 因為太興奮了哈哈哈
真的很感謝您的努力! 我會好好研究!!! 剛剛我已經執行您的程式,成功了!!! 超厲害的超佩服>w<
真的感激不盡~~~!!!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)