返回列表 上一主題 發帖

股價代號和起始日期的抓取

指定下載3年歷史股價的資料

麻煩請各位高手專家及版主指導解惑:
下面網址中可指定查詢歷史資料的區間選項(預設值為20天),有先在網站中更改查詢區間為3年。
但每次下載匯入EXCEL的資料只有21天,不知需要加入什麼程式碼才可解決??
www.cnyes.com/twstock/ps_historyprice/6282.htm
  1. Sub Macro1()

  2.     With ActiveSheet.QueryTables.Add(Connection:= _
  3.         "URL;http://www.cnyes.com/twstock/ps_historyprice/6282.htm", Destination:= _
  4.         Range("A1"))
  5.         .RefreshStyle = xlOverwriteCells
  6.         .WebTables = "2"
  7.         .Refresh BackgroundQuery:=False
  8.     End With
  9.     ActiveWindow.SmallScroll Down:=-21

  10. End Sub
複製代碼
因為YAHOO、GOOGLE的歷史資料有時無法顯示例外(開休市)的數據,造成計算MA值的數據不準確。
感謝各位高手專家撥空解惑。

TOP

回復 1# gelai01000001
下載3年歷史股價的資料
  1. Option Explicit
  2. Sub 鉅亨網_歷史行情()
  3.     Dim Sh As Worksheet, Code As String, d_Start As String, d_End  As String
  4.     Dim A As Object, i As Integer, c As Integer, T As Date
  5.     Code = InputBox("輸入股票代號 :  ", "股票代號", 2303)
  6.     d_End = InputBox("輸入結束日期 :  ", "結束日期", Date)
  7.     If Len(Code) <= 3 Or Not IsDate(d_End) Then Exit Sub
  8.     Set Sh = ActiveSheet
  9.     With Sh
  10.         .UsedRange.Clear
  11.         .[a1] = Code
  12.         .[b1] = DateAdd("yyyy", -3, d_End)  '下載3年歷史股價的資料
  13.         .[C1] = d_End
  14.         Code = .[a1]
  15.         d_Start = Format(.[b1], "yyyy/mm/dd")
  16.         d_End = Format(.[C1], "yyyy/mm/dd")
  17.     End With
  18.     With CreateObject("InternetExplorer.application")
  19.         .Navigate "http://www.cnyes.com/twstock/ps_historyprice/" & Code & ".htm"
  20.         '.Visible = True
  21.         Application.StatusBar = Code & " 歷史行情 等候中..."
  22.         Do While .Busy Or .ReadyState <> 4
  23.              DoEvents
  24.         Loop
  25.         Set A = .Document.getelementsbytagname("input")
  26.         A(5).Value = d_Start
  27.         A(6).Value = d_End
  28.         A(7).Click
  29.         T = Time
  30.         Do
  31.             DoEvents
  32.         Loop Until Time > T + #12:00:08 AM#
  33.         Set A = .Document.getelementsbytagname("table")(1)
  34.         Application.StatusBar = Code & " 歷史行情 下載中..."
  35.         Cells(2, 1) = .Document.getelementsbytagname("span")(79).innertext
  36.         For i = 0 To A.Rows.Length - 1
  37.             For c = 0 To A.Rows(i).Cells.Length - 1
  38.                 Sh.Cells(i + 3, c + 1) = A.Rows(i).Cells(c).innertext
  39.             Next
  40.         Next
  41.        .Quit
  42.     End With
  43.     Application.StatusBar = Code & " 歷史行情 " & Application.Text(Time - T, "[S] 秒") & " 下載完成"
  44.     MsgBox "OK"
  45.     Application.StatusBar = False
  46. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 2# GBKEE

感謝GBKEE版主的熱心用心的解惑。
因位本人不材,不甚了解下列程式碼的語法及執行用意。
還煩請GBKEE版主抽空可說明註解惑指導一下嗎?
  1. With CreateObject("InternetExplorer.application")
  2.         .Navigate "http://www.cnyes.com/twstock/ps_historyprice/" & Code & ".htm"
  3.         '.Visible = True
  4.         Application.StatusBar = Code & " 歷史行情 等候中..."
  5.         Do While .Busy Or .ReadyState <> 4
  6.              DoEvents
  7.         Loop
  8.         Set A = .Document.getelementsbytagname("input")
  9.         A(5).Value = d_Start
  10.         A(6).Value = d_End
  11.         A(7).Click
  12.         T = Time
  13.         Do
  14.             DoEvents
  15.         Loop Until Time > T + #12:00:08 AM#
  16.         Set A = .Document.getelementsbytagname("table")(1)
  17.         Application.StatusBar = Code & " 歷史行情 下載中..."
  18.         Cells(2, 1) = .Document.getelementsbytagname("span")(79).innertext
複製代碼
GBKEE版主:執行程式過程中,發現下載至EXCEL中的資料是有由〈Sh.Cells(i + 3, c + 1) = A.Rows(i).Cells(c).innertext〉而來,
                        不同於下載網頁資料〈WebTables = "number"〉,所用的指令方法。
我有上網收搜尋相關資料,大約清楚知道,上列程式碼式是在VBA程式中啟動網頁的(javascript)指令。
不知是與不是或一知半解!感謝GBKEE的指導。

TOP

回復 3# gelai01000001
CreateObject("InternetExplorer.application") 多搜尋一下會多了解的
  1. With CreateObject("InternetExplorer.application")
  2.     '歷史行情 預設為一個月資料,日期的更改需在網頁上更改
  3.         .Navigate "http://www.cnyes.com/twstock/ps_historyprice/" & Code & ".htm"  'IE的網址
  4.         '.Visible = True
  5.         Application.StatusBar = Code & " 歷史行情 等候中..."
  6.         Do While .Busy Or .ReadyState <> 4     '等候網頁資料下載完成...
  7.              DoEvents
  8.         Loop
  9.         Set A = .Document.getelementsbytagname("input")  '網頁中成員 tagname為 "input"
  10.         A(5).Value = d_Start    '0 開始算起第6個 => 5     開始日期
  11.         A(6).Value = d_End      '0 開始算起第7個 => 6     結束日期
  12.         A(7).Click              '0 開始算起第8個 => 7     按下查詢鍵
  13.         T = Time
  14.         Do
  15.             DoEvents
  16.         Loop Until Time > T + #12:00:08 AM#              '按下查詢鍵後,需等候網頁資料下載完成
  17.         Set A = .Document.getelementsbytagname("table")(1) ''0 開始算起第2個 => 1
  18.         '網頁中成員 tagname為 "table" ,為資料所在的位置.
  19.         Application.StatusBar = Code & " 歷史行情 下載中..."
  20.         Cells(2, 1) = .Document.getelementsbytagname("span")(79).innertext  'innertext: 文字
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

請問大大下載時間可以擴大到多長?:)

TOP

回復 5# edwardlay
2# 看要幾年可修改 -3  看看
  1. 12.        .[b1] = DateAdd("yyyy", -3, d_End)  '下載3年歷史股價的資料
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

如何將下載的股市每日盤後行情(製作成各股的歷史股價資料)

煩請各位高手專家解惑,謝謝!
請問有辦法將下列程碼的加以修改,把每日各股的盤後行情所得的資料轉換成(各股的歷史資料)。
  1. Sub 下載網站資料()
  2.     Dim Startmonth As String, Startday As String, xDate As Date, Msg As Boolean, Sh As Worksheet
  3.     On Error GoTo EX                        '程式執行中有錯誤時跳到 EX: 繼續執行程式
  4.     xDate = Date                            '當日
  5.     Set Sh = ActiveSheet                    '指定工作表:此程式在任何模組中皆可用
  6. EX:
  7.     If Err.Number <> 0 Or Msg = True Then   '當日(尚未有資料:錯誤) 或 休市
  8.         [color=Red]xDate = xDate - 1    (應改為xDate = Date - 1)[/color]     假如休市超過1天以上(2,3,4,5,6,春節9天),又如何修改呢?         
  9.         Err.Clear
  10.         Msg = False
  11.     End If
  12.     Sh.UsedRange.Clear                       '清理工作表已使用的範圍
  13.     Startday = Format(xDate, "YYYYMMDD")
  14.     Startmonth = Format(xDate, "YYYYMM")
  15.         '下載網站的網址
  16.     With Sh.QueryTables.Add(Connection:="URL;http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/genpage/Report" & Startmonth & "/A112" & Startday & "ALLBUT0999_1.php?select2=ALLBUT0999&chk_date=" & Format(xDate, "E/MM/DD"), Destination:=Range("A3"))
  17.         .RefreshStyle = xlOverwriteCells                            '抓取網頁的第10個表格作為匯入資料
  18.         .WebTables = "10"
  19.         .Refresh BackgroundQuery:=False                             '當日(尚未有資料:錯誤)
  20.         If Application.CountA(Sh.QueryTables(1).ResultRange) = 0 Then  '休市 沒有資料
  21.             Msg = True
  22.             GoTo EX
  23.         End If
  24.     End With
  25.     With Sh.UsedRange
  26.         .Font.Size = 12
  27.         .EntireColumn.AutoFit
  28.     End With
  29. End Sub
複製代碼
因為我已有下載各股歷史股價的資料程式和資料,且依代碼分類成多個活頁簿例如:
workbook(1.xls)有worksheet(1102)、worksheet(1103).....等。1活頁簿中有代碼,第一個數字有[1]的多個工作表。
workbook(2.xls)有worksheet(2102)、worksheet(2103).....等。2活頁簿中有代碼,第一個數字有[2]的多個工作表。
......
......
workbook(9.xls)有worksheet(9102)、worksheet(9103).....等。9活頁簿中有代碼,第一個數字有[9]的多個工作表。
所以想請問有沒有更簡便快速的方法。謝謝各位專家前輩的抽空指導。

TOP

回復 7# gelai01000001
試試看
  1. Option Explicit
  2. Sub 下載網站資料()
  3.     Dim Startmonth As String, Startday As String, xDate As Date, Msg As Boolean, Sh As Worksheet
  4.     Dim Wb As Workbook, Ws As Worksheet, Stock  As Range
  5.     On Error GoTo EX                        '程式執行中有錯誤時跳到 EX: 繼續執行程式
  6.     xDate = Date                            '當日
  7.     Set Sh = Workbooks.Add.Sheets(1)        '新活頁簿的第一個工作表
  8. EX:
  9.     If Err.Number <> 0 Or Msg = True Then   '當日(尚未有資料:錯誤) 或 休市
  10.         xDate = xDate - 1                   '往後退一天一直到開市. ( 假如休市超過1天以上(2,3,4,5,6,春節9天)
  11.         Err.Clear
  12.         Msg = False
  13.     End If
  14.     Startday = Format(xDate, "YYYYMMDD")
  15.     Startmonth = Format(xDate, "YYYYMM")
  16.         '下載網站的網址
  17.     With Sh.QueryTables.Add(Connection:="URL;http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/genpage/Report" & Startmonth & "/A112" & Startday & "ALLBUT0999_1.php?select2=ALLBUT0999&chk_date=" & Format(xDate, "E/MM/DD"), Destination:=Range("A3"))
  18.         .RefreshStyle = xlOverwriteCells                                '抓取網頁的第10個表格作為匯入資料
  19.         .WebTables = "10"
  20.         .Refresh BackgroundQuery:=False                                 '當日(尚未有資料:錯誤)
  21.         If Application.CountA(Sh.QueryTables(1).ResultRange) = 0 Then   '休市 沒有資料
  22.             Msg = True
  23.             GoTo EX
  24.         End If
  25.     End With
  26.     For Each Wb In Workbooks
  27.         For Each Ws In Wb.Sheets
  28.            Set Stock = Sh.[A:A].Find(Ws.Name, lookat:=xlWhole)
  29.             If Not Stock Is Nothing Then
  30.                 Stock.Offset(, 2).Resize(, 14).Copy
  31.                 With Ws
  32.                     With .Range("a" & .Rows.Count).End(xlUp).Offset(1)
  33.                         .Cells = xDate
  34.                         .Offset(, 1).PasteSpecial xlPasteValuesAndNumberFormats
  35.                     End With
  36.                 End With
  37.             End If
  38.         Next
  39.     Next
  40.     Sh.Parent.Close False           '關閉: 新活頁簿的第一個工作表
  41. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

如何使用.iqy抓此網址資料

請問大家,

        小弟在此網址 http://www.cnyes.com/twstock/directorholder/1101.htm  ,想抓董監持股餘額資料,
但每個月的資料是用下拉式選單選取,網址都不會變動,請問應該如何才能利用.iqy更改參數抓資料...


謝謝各位
BigDog
用簡單的心做複雜的事

TOP

回復 1# BigDog


    這個應該無法用iqy 抓取
要用VBA

TOP

        靜思自在 : 謊言像一朵盛開的鮮花,外表美麗,生命短暫。
返回列表 上一主題