返回列表 上一主題 發帖

[發問] 網路CSV下載問題

[發問] 網路CSV下載問題

本帖最後由 GBKEE 於 2013-3-29 20:14 編輯

大家好:
     我想從http://mops.twse.com.tw/mops/web/t51sb08
     擷取上市101年第4季與上櫃101年第4季的所有CSV檔案
     可是問題來囉
     因為市場別要分別選上市或上櫃,且選擇上市又要存取多個CSV檔案;選擇上櫃又要存取多個CSV檔案,才能自行併入一個excel表格當中
     所以想請教
     如何"一次"將上市及上櫃的CSV一次匯入一個excel表格當中呢?
     謝謝

RE: 網路CSV下載問題

回復 1# spermbank
這原始檔案中找不到CSV檔案的網址可下載!!
試試看 (可試著修改下載上市,上櫃的資料)
  1. Option Explicit
  2. Sub 公開資訊觀測站()
  3.     Dim Ie As Object, xx, k, j, i, AA As Variant
  4.     Dim T As Date
  5.     ActiveSheet.Cells.Clear
  6.      Application.DisplayStatusBar = True
  7.     On Error GoTo ie_err
  8.     Set Ie = CreateObject("InternetExplorer.Application")
  9.     Ie.Navigate "http://mops.twse.com.tw/mops/web/t51sb08"
  10.     Ie.Visible = True
  11.     Do While Ie.Busy Or Ie.ReadyState <> 4: DoEvents: Loop
  12.     '**********  修改這裡 的選項
  13.     Ie.Document.ALL(632).Value = "sii"   '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
  14.     Ie.Document.ALL(643).Value = "101"   '年度
  15.     Ie.Document.ALL(650).Value = "04"    '第一季 = 01,第二季 = 02,第三季 = 03,第四季 = 04
  16.     Ie.Document.ALL(667).Click
  17.    
  18.     Ie.Visible = False
  19.     網頁整理
  20.     Set AA = Ie.Document.getelementsbytagname("table")   '資料區
  21.    ' Ie.Quit
  22.     T = Time
  23.     Application.ScreenUpdating = False
  24.     With ActiveSheet
  25.         On Error Resume Next
  26.         For xx = 13 To AA.Length - 1
  27.             For i = 0 To AA(xx).Rows.Length - 1      '寫入資料
  28.                 k = k + 1
  29.                 For j = 0 To 19
  30.                     .Cells(k, 1).Select
  31.                     Application.StatusBar = "下載資料中 ..." & k - 1
  32.                     .Cells(k, j + 1) = AA(xx).Rows(i).Cells(j).innertext
  33.                 Next
  34.             Next
  35.         Next
  36.         Set AA = .Range("S2:S" & .[S2].End(xlDown).Row)
  37.         AA.Replace "基本每股盈餘", "", xlWhole
  38.         AA.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
  39.         .Cells(.Rows.Count, 1).End(xlUp).EntireRow.Delete
  40.          ActiveWindow.ScrollRow = .Cells(.Rows.Count, 1).End(xlUp).Row - 20
  41.         .Cells(.Rows.Count, 1).End(xlUp).Select
  42.     End With
  43.     Application.ScreenUpdating = True
  44.     'Ie.Quit
  45.     Application.StatusBar = "下載資料時間 : " & Format(Time - T, ["S秒"])
  46.     End
  47. ie_err:
  48.     MsgBox "網頁有問題,請重新執行..."
  49.     Set Ie = Nothing
  50. End Sub
  51. Private Sub 網頁整理()   '等待網頁下載資料完畢的時間
  52.     Dim Tt(1 To 3) As Date
  53.     Tt(1) = Time
  54.     Tt(2) = Time
  55.     Tt(3) = #12:00:10 AM#     '10秒 調整這裡
  56.     Do
  57.         If Time > Tt(2) Then
  58.             Application.StatusBar = "網頁下載中 剩餘秒數.. " & Second(Tt(1) + Tt(3) - Time)
  59.             Tt(2) = Time
  60.         End If
  61.         DoEvents
  62.     Loop Until Time > Tt(1) + Tt(3)
  63.     Application.StatusBar = "資料下載中...."
  64. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 spermbank 於 2013-3-30 00:58 編輯

回復 2# GBKEE


    損益表上市及上櫃可以耶,十分感謝大大
    另外我把網址改成http://mops.twse.com.tw/mops/web/t51sb13 讀取合併損益表  
    我發現卻又不行囉,不知道要如何修該?
    若網路資料會陸續增加筆數,是否需要自行更新判斷筆數呢?
    謝謝

TOP

本帖最後由 GBKEE 於 2013-3-30 16:06 編輯

回復 3# spermbank
  1. 這網頁有修改控制項,2# 這些程式碼不適用, 4#的程式碼已修改為正確
  2. Ie.Document.ALL(632).Value = "sii"   '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
  3. Ie.Document.ALL(643).Value = "101"   '年度
  4. Ie.Document.ALL(650).Value = "04"    '第一季 = 01,第二季 = 02,第三季 = 03,第四季 = 04
  5. Ie.Document.ALL(667).Click
複製代碼
每一網頁的表單建置不一樣,需一一去尋找
  1. Option Explicit
  2. Sub 公開資訊觀測站()
  3.     Dim ie As Object, xx, k, j, i, AA As Variant
  4.     Dim T As Date, 資訊 As String
  5.     Do
  6.         資訊 = InputBox("1: 損益表" & vbLf & "2: 合併損益表")   '選擇公開資訊觀測站的表格
  7.        '資訊 = InputBox("1: 損益表" & vbLf & "2: 合併損益表"& vbLf & "3: ???表"...............)
  8.         If 資訊 = "" Then Exit Sub                              '不選擇結束程式
  9.     Loop Until Val(資訊) > 0 And Val(資訊) <= 2 '                Val(資訊)<=???  結束選擇表單
  10.     ActiveSheet.Cells.Clear
  11.     Application.DisplayStatusBar = True
  12.     Application.StatusBar = "....... 網頁開啟中.......... "
  13.    
  14.   '  On Error GoTo ie_err
  15.     Set ie = CreateObject("InternetExplorer.Application")
  16.     ie.Navigate 下載網址(資訊)
  17.     Do While ie.Busy Or ie.ReadyState <> 4
  18.             DoEvents
  19.     Loop
  20.     With ie.Document
  21.         T = Time
  22.         Do While ie.Busy Or ie.ReadyState <> 4
  23.             If Time = T + #12:01:00 AM# Then GoTo ie_err                '等候網頁異常:結束程式
  24.             DoEvents
  25.         Loop
  26.         '**********  修改這裡 的選項
  27.         .getelementbyID("TYPEK").Value = "sii"  '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
  28.         .getelementbyID("year").Value = "101"    '年度
  29.         .getelementbyID("season").Value = "02"    '第一季 = 01,第二季 = 02,第三季 = 03,第四季 = 04
  30.         For i = 0 To .getelementsbytagname("input").Length - 1
  31.             If .getelementsbytagname("input")(i).Type = "button" And .getelementsbytagname("input")(i).Value = " 搜尋 " Then
  32.                 .getelementsbytagname("input")(i).Click
  33.             End If
  34.         Next
  35.         等待網頁
  36.         Set AA = .getelementsbytagname("table")   '資料區
  37.     End With
  38.     T = Time
  39.     With ActiveSheet
  40.         .Cells(1, "A") = IIf(資訊 = 1, "損益表", "合併損益表")
  41.         .Cells(1, "B") = 市場別(ie.Document.getelementbyID("TYPEK").Value)
  42.         .Cells(1, "C") = ie.Document.getelementbyID("year").Value & "年度"
  43.         .Cells(1, "D") = ie.Document.getelementbyID("season").Value & "季"
  44.         .Cells(1).Select
  45.         Application.ScreenUpdating = False
  46.         k = 1
  47.         On Error Resume Next
  48.         For xx = 網頁表格(資訊) To AA.Length - 1
  49.             For i = 0 To AA(xx).Rows.Length - 1      '寫入資料
  50.                 k = k + 1
  51.                 For j = 0 To 19
  52.                     Application.StatusBar = "下載資料中 ..." & k - 1
  53.                     .Cells(k, j + 1) = AA(xx).Rows(i).Cells(j).innertext
  54.                 Next
  55.             Next
  56.         Next
  57.         Set AA = .Range("S3:S" & .[S3].End(xlDown).Row)
  58.         AA.Replace "基本每股盈餘", "", xlWhole
  59.         AA.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
  60.         .Cells(.Rows.Count, 1).End(xlUp).EntireRow.Delete
  61.         .Cells.EntireColumn.AutoFit
  62.         .[A1].Select
  63.     End With
  64.     Application.ScreenUpdating = True
  65.     ie.Quit
  66.     Application.StatusBar = "下載資料時間 : " & Format(Time - T, ["S秒"])
  67.     End
  68. ie_err:
  69.     ie.Quit
  70.     MsgBox "網頁有問題,請重新執行..."
  71.     End
  72. 資訊_Err:
  73. End Sub
  74. Private Sub 等待網頁()    '等待網頁下載資料完畢的時間
  75.     Dim Tt(1 To 3) As Date
  76.     Tt(1) = Time
  77.     Tt(2) = Time
  78.     Tt(3) = #12:00:10 AM#     '10秒 調整這裡
  79.     Do
  80.         If Time > Tt(2) Then
  81.             Application.StatusBar = "網頁下載中 剩餘秒數.. " & Second(Tt(1) + Tt(3) - Time)
  82.             Tt(2) = Time
  83.         End If
  84.         DoEvents
  85.     Loop Until Time > Tt(1) + Tt(3)
  86.     Application.StatusBar = "資料下載中...."
  87. End Sub
  88. Private Function 下載網址(xWord As String) As String      '傳回選擇的網址
  89.     Select Case xWord
  90.         Case "1"
  91.             下載網址 = "http://mops.twse.com.tw/mops/web/t51sb08" '損益表
  92.         Case "2"
  93.             下載網址 = "http://mops.twse.com.tw/mops/web/t51sb13" '合併損益表
  94.         ''Case "3"     新網頁的網址
  95.         ''
  96.         ''
  97.     End Select
  98. End Function
  99. Private Function 市場別(xWord As String) As String
  100.        '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
  101.     Select Case xWord
  102.         Case "sii"
  103.             市場別 = "上市"
  104.         Case "otc"
  105.             市場別 = "上櫃"
  106.         Case "rotc"
  107.             市場別 = "興櫃"
  108.         Case "pub"
  109.             市場別 = "公開發行"
  110.     End Select
  111. End Function
  112. Private Function 網頁表格(xWord As String) As Integer
  113.     Select Case xWord
  114.         Case "1"
  115.             網頁表格 = 13  '損益表
  116.         Case "2"
  117.             網頁表格 = 12  '合併損益表
  118.         
  119.         ''每一網頁的表單建置不一樣,需一一去尋找
  120.         '' 自行查看新增 Case "3"......
  121.         ''
  122.     End Select
  123. End Function
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 4# GBKEE
            網頁表格 = 13  '損益表
            網頁表格 = 12  '合併損益表

請問13與12數據由來
若換成不同表格我該要如何判斷這數值?!
例如:http://mops.twse.com.tw/mops/web/t56sb21_q3

TOP

不設表格名稱(抬頭),以下是修改部分資料應用
望請修正錯誤,謝謝..^___^..
  1. Option Explicit
  2. Sub 申報轉讓()
  3. Dim ie As Object, xx, k, j, i, AA As Variant
  4. Dim T As Date, 資訊 As String
  5.     Do
  6.         資訊 = InputBox("1: 歷史持股轉讓" & vbLf & "2: 合併損益表")   '選擇公開資訊觀測站的表格
  7.         If 資訊 = "" Then Exit Sub                              '不選擇結束程式
  8.     Loop Until Val(資訊) > 0 And Val(資訊) <= 2 '                Val(資訊)<=???  結束選擇表單
  9.    
  10.     ActiveSheet.Cells.Clear
  11.     Application.DisplayStatusBar = True
  12.     Application.StatusBar = "....... 網頁開啟中.......... "
  13.    
  14. 'On Error GoTo ie_err
  15. Set ie = CreateObject("InternetExplorer.Application")
  16. ie.Navigate 下載網址(資訊)
  17.     Do While ie.Busy Or ie.ReadyState <> 4
  18.             DoEvents
  19.     Loop
  20.     With ie.Document
  21.         T = Time
  22.         Do While ie.Busy Or ie.ReadyState <> 4
  23.             If Time = T + #12:01:00 AM# Then GoTo ie_err                '等候網頁異常:結束程式
  24.             DoEvents
  25.         Loop
  26.     '**********  修改這裡 的選項
  27.     'http://mops.twse.com.tw/mops/web/t56sb21_q3?&step=0&firstin=1&off=1&TYPEK=sii&year=91&smonth=07&emonth=09
  28.    
  29.     .getelementbyID("TYPEK").Value = "sii"  '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
  30.     .getelementbyID("year").Value = "91"    '年度
  31.     .getelementbyID("smonth").Value = "07"  '起月份
  32.     .getelementbyID("emonth").Value = "09"  '訖月份
  33.         For i = 0 To .getelementsbytagname("input").Length - 1
  34.             If .getelementsbytagname("input")(i).Type = "button" And .getelementsbytagname("input")(i).Value = " 搜尋 " Then
  35.                 .getelementsbytagname("input")(i).Click
  36.             End If
  37.         Next
  38.         等待網頁
  39.         Set AA = .getelementsbytagname("table")   '資料區
  40.     End With
  41.     T = Time
  42.     With ActiveSheet

  43.         .Cells(1).Select
  44.         Application.ScreenUpdating = False
  45.         k = 1
  46.         On Error Resume Next
  47.         For xx = 網頁表格(資訊) To AA.Length - 1
  48.             For i = 0 To AA(xx).Rows.Length - 1      '寫入資料
  49.                 k = k + 1
  50.                 For j = 0 To 19
  51.                     Application.StatusBar = "下載資料中 ..." & k - 1
  52.                     .Cells(k, j + 1) = AA(xx).Rows(i).Cells(j).innertext
  53.                 Next
  54.             Next
  55.         Next
  56.         Set AA = .Range("R3:R" & .[R3].End(xlDown).Row)
  57.         AA.Replace "是否申報持", "", xlWhole
  58.         AA.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
  59.         .Cells(.Rows.Count, 1).End(xlUp).EntireRow.Delete
  60.         .Cells.EntireColumn.AutoFit
  61.         .[A1].Select
  62.     End With
  63.     Application.ScreenUpdating = True
  64.     ie.Quit
  65.     Application.StatusBar = "下載資料時間 : " & Format(Time - T, ["S秒"])
  66.     End
  67. ie_err:
  68.     ie.Quit
  69.     MsgBox "網頁有問題,請重新執行..."
  70.     End
  71. 資訊_Err:
  72. End Sub
  73. Private Sub 等待網頁()    '等待網頁下載資料完畢的時間
  74.     Dim Tt(1 To 3) As Date
  75.     Tt(1) = Time
  76.     Tt(2) = Time
  77.     Tt(3) = #12:00:10 AM#     '10秒 調整這裡
  78.     Do
  79.         If Time > Tt(2) Then
  80.             Application.StatusBar = "網頁下載中 剩餘秒數.. " & Second(Tt(1) + Tt(3) - Time)
  81.             Tt(2) = Time
  82.         End If
  83.         DoEvents
  84.     Loop Until Time > Tt(1) + Tt(3)
  85.     Application.StatusBar = "資料下載中...."
  86. End Sub
  87. Private Function 下載網址(xWord As String) As String      '傳回選擇的網址
  88.     Select Case xWord
  89.         Case "1"
  90.             下載網址 = "http://mops.twse.com.tw/mops/web/t56sb21_q3" '歷史持股轉讓
  91.         Case "2"
  92.             下載網址 = "http://mops.twse.com.tw/mops/web/t51sb13" '合併損益表
  93.         ''Case "3"     新網頁的網址
  94.         ''
  95.         ''
  96.     End Select
  97. End Function
  98. Private Function 市場別(xWord As String) As String
  99.        '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
  100.     Select Case xWord
  101.         Case "sii"
  102.             市場別 = "上市"
  103.         Case "otc"
  104.             市場別 = "上櫃"
  105.         Case "rotc"
  106.             市場別 = "興櫃"
  107.         Case "pub"
  108.             市場別 = "公開發行"
  109.     End Select
  110. End Function
  111. Private Function 網頁表格(xWord As String) As Integer
  112.     Select Case xWord
  113.         Case "1"
  114.             網頁表格 = 11
  115.         Case "2"
  116.             網頁表格 = 12  '合併損益表
  117.         
  118.         ''每一網頁的表單建置不一樣,需一一去尋找
  119.         '' 自行查看新增 Case "3"......
  120.         ''
  121.     End Select
  122. End Function
複製代碼

TOP

回復 1# spermbank

建議從解析原始資料網址著手,若該網頁版面設計變更,程式碼不需修改,比較不容易受到影響。程式碼用錄的(WEB查詢-Querytable)就可以取得.....就不寫了....

實施IFRS之前[101年第4季(含)以前]

個別損益表
http://mops.twse.com.tw/mops/web/ajax_t51sb08?encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=101&season=04

個別資產負債表
http://mops.twse.com.tw/mops/web/ajax_t51sb07?encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=101&season=04

合併損益表
http://mops.twse.com.tw/mops/web/ajax_t51sb13?encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=101&season=04

合併資產負債表
http://mops.twse.com.tw/mops/web/ajax_t51sb12?encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=101&season=04

上市 TYPEK=sii
上櫃 TYPEK=otc
year = 民國年, 例 102
season = 季度, 例 01, 02, 03, 04
diabo

TOP

回復 5# HSIEN6001

同上一篇回覆,簡化問題從源頭開始....

http://mops.twse.com.tw/mops/web/ajax_t56sb21?encodeURIComponent=1&run=Y&step=1&TYPEK=sii&year=102&smonth=01&emonth=03&sstep=1&firstin=true
diabo

TOP

回復 1# spermbank
  1. Sub 抓財報(財報別, 市場別, 年, 季)
  2.    
  3.     Select Case 財報別
  4.         Case "損益":     程式 = "ajax_t51sb08"
  5.         Case "資產":     程式 = "ajax_t51sb07"
  6.         Case "合併損益": 程式 = "ajax_t51sb13"
  7.         Case "合併資產": 程式 = "ajax_t51sb12"
  8.     End Select
  9.    
  10.     Select Case 市場別
  11.         Case "上市": 市場 = "sii"
  12.         Case "上櫃": 市場 = "otc"
  13.         Case "興櫃": 市場 = "rotc"
  14.         Case "公開": 市場 = "pub"
  15.     End Select
  16.    
  17.    '原始網址 http://mops.twse.com.tw/mops/web/ajax_t51sb07?encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=101&season=04
  18.     theURL = "http://mops.twse.com.tw/mops/web/" & 程式 & "?encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=" & 市場 & "&year=" & 年 & "&season=" & 季
  19.    
  20.     With ActiveSheet.QueryTables.Add(Connection:="URL;" & theURL, Destination:=Range("A1"))
  21.         .Name = "抓財報"
  22.         .BackgroundQuery = True
  23.         .RefreshStyle = xlOverwriteCells
  24.         .RefreshPeriod = 0
  25.         .WebSelectionType = xlEntirePage
  26.         .WebFormatting = xlWebFormattingNone
  27.         .WebDisableDateRecognition = False
  28.         .WebDisableRedirections = False
  29.         .Refresh BackgroundQuery:=False
  30.         .Delete
  31.     End With
  32.    
  33. End Sub
複製代碼
1. 以上程式碼僅抓資料,並未處理金融保險證券...類股會計科目不同的問題
2. 使用範例  call 抓財報( "損益","上櫃",101,"04")
diabo

TOP

回復 4# GBKEE


    G大您好:
            
            十分感謝大大的指教,萬分感恩,如果沒有大大的幫忙,我的程式真的不知道如何能前進
            從去年以來,我陸續我有很多問題,都是G大的熱心幫忙,我的想法,才能藉由程式慢慢兜出想要的東西
            真的十分感激

            不過還是有幾個問題想問 ><"
            網頁表格 = 11
            網頁表格 = 12  '合併損益表
            ''每一網頁的表單建置不一樣,需一一去尋找
            '' 自行查看新增 Case "3"......
           請問數字11與12要如何尋找?

          另外兩個網頁我也想讀入
          http://mops.twse.com.tw/mops/web/t21sc04  '每月營業收入統計彙總表, "此網頁會跳出另一網頁"
          http://mops.twse.com.tw/mops/web/t21sb06 '每月合併營業收入統計彙總表
          我又要如何匯入呢? 謝謝。

TOP

        靜思自在 : 真正的愛心,是照顧好自己的這顆心。
返回列表 上一主題