標題:
[發問]
網路CSV下載問題
[打印本頁]
作者:
spermbank
時間:
2013-3-29 11:35
標題:
網路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表格當中呢?
謝謝
作者:
GBKEE
時間:
2013-3-29 20:14
標題:
RE: 網路CSV下載問題
回復
1#
spermbank
這原始檔案中找不到CSV檔案的網址可下載!!
試試看 (可試著修改下載上市,上櫃的資料)
Option Explicit
Sub 公開資訊觀測站()
Dim Ie As Object, xx, k, j, i, AA As Variant
Dim T As Date
ActiveSheet.Cells.Clear
Application.DisplayStatusBar = True
On Error GoTo ie_err
Set Ie = CreateObject("InternetExplorer.Application")
Ie.Navigate "http://mops.twse.com.tw/mops/web/t51sb08"
Ie.Visible = True
Do While Ie.Busy Or Ie.ReadyState <> 4: DoEvents: Loop
'********** 修改這裡 的選項
Ie.Document.ALL(632).Value = "sii" '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
Ie.Document.ALL(643).Value = "101" '年度
Ie.Document.ALL(650).Value = "04" '第一季 = 01,第二季 = 02,第三季 = 03,第四季 = 04
Ie.Document.ALL(667).Click
Ie.Visible = False
網頁整理
Set AA = Ie.Document.getelementsbytagname("table") '資料區
' Ie.Quit
T = Time
Application.ScreenUpdating = False
With ActiveSheet
On Error Resume Next
For xx = 13 To AA.Length - 1
For i = 0 To AA(xx).Rows.Length - 1 '寫入資料
k = k + 1
For j = 0 To 19
.Cells(k, 1).Select
Application.StatusBar = "下載資料中 ..." & k - 1
.Cells(k, j + 1) = AA(xx).Rows(i).Cells(j).innertext
Next
Next
Next
Set AA = .Range("S2:S" & .[S2].End(xlDown).Row)
AA.Replace "基本每股盈餘", "", xlWhole
AA.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
.Cells(.Rows.Count, 1).End(xlUp).EntireRow.Delete
ActiveWindow.ScrollRow = .Cells(.Rows.Count, 1).End(xlUp).Row - 20
.Cells(.Rows.Count, 1).End(xlUp).Select
End With
Application.ScreenUpdating = True
'Ie.Quit
Application.StatusBar = "下載資料時間 : " & Format(Time - T, ["S秒"])
End
ie_err:
MsgBox "網頁有問題,請重新執行..."
Set Ie = Nothing
End Sub
Private Sub 網頁整理() '等待網頁下載資料完畢的時間
Dim Tt(1 To 3) As Date
Tt(1) = Time
Tt(2) = Time
Tt(3) = #12:00:10 AM# '10秒 調整這裡
Do
If Time > Tt(2) Then
Application.StatusBar = "網頁下載中 剩餘秒數.. " & Second(Tt(1) + Tt(3) - Time)
Tt(2) = Time
End If
DoEvents
Loop Until Time > Tt(1) + Tt(3)
Application.StatusBar = "資料下載中...."
End Sub
複製代碼
作者:
spermbank
時間:
2013-3-30 00:56
本帖最後由 spermbank 於 2013-3-30 00:58 編輯
回復
2#
GBKEE
損益表上市及上櫃可以耶,十分感謝大大
另外我把網址改成http://mops.twse.com.tw/mops/web/t51sb13 讀取合併損益表
我發現卻又不行囉,不知道要如何修該?
若網路資料會陸續增加筆數,是否需要自行更新判斷筆數呢?
謝謝
作者:
GBKEE
時間:
2013-3-30 09:03
本帖最後由 GBKEE 於 2013-3-30 16:06 編輯
回復
3#
spermbank
這網頁有修改控制項,2# 這些程式碼不適用, 4#的程式碼已修改為正確
Ie.Document.ALL(632).Value = "sii" '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
Ie.Document.ALL(643).Value = "101" '年度
Ie.Document.ALL(650).Value = "04" '第一季 = 01,第二季 = 02,第三季 = 03,第四季 = 04
Ie.Document.ALL(667).Click
複製代碼
每一網頁的表單建置不一樣,需一一去尋找
Option Explicit
Sub 公開資訊觀測站()
Dim ie As Object, xx, k, j, i, AA As Variant
Dim T As Date, 資訊 As String
Do
資訊 = InputBox("1: 損益表" & vbLf & "2: 合併損益表") '選擇公開資訊觀測站的表格
'資訊 = InputBox("1: 損益表" & vbLf & "2: 合併損益表"& vbLf & "3: ???表"...............)
If 資訊 = "" Then Exit Sub '不選擇結束程式
Loop Until Val(資訊) > 0 And Val(資訊) <= 2 ' Val(資訊)<=??? 結束選擇表單
ActiveSheet.Cells.Clear
Application.DisplayStatusBar = True
Application.StatusBar = "....... 網頁開啟中.......... "
' On Error GoTo ie_err
Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate 下載網址(資訊)
Do While ie.Busy Or ie.ReadyState <> 4
DoEvents
Loop
With ie.Document
T = Time
Do While ie.Busy Or ie.ReadyState <> 4
If Time = T + #12:01:00 AM# Then GoTo ie_err '等候網頁異常:結束程式
DoEvents
Loop
'********** 修改這裡 的選項
.getelementbyID("TYPEK").Value = "sii" '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
.getelementbyID("year").Value = "101" '年度
.getelementbyID("season").Value = "02" '第一季 = 01,第二季 = 02,第三季 = 03,第四季 = 04
For i = 0 To .getelementsbytagname("input").Length - 1
If .getelementsbytagname("input")(i).Type = "button" And .getelementsbytagname("input")(i).Value = " 搜尋 " Then
.getelementsbytagname("input")(i).Click
End If
Next
等待網頁
Set AA = .getelementsbytagname("table") '資料區
End With
T = Time
With ActiveSheet
.Cells(1, "A") = IIf(資訊 = 1, "損益表", "合併損益表")
.Cells(1, "B") = 市場別(ie.Document.getelementbyID("TYPEK").Value)
.Cells(1, "C") = ie.Document.getelementbyID("year").Value & "年度"
.Cells(1, "D") = ie.Document.getelementbyID("season").Value & "季"
.Cells(1).Select
Application.ScreenUpdating = False
k = 1
On Error Resume Next
For xx = 網頁表格(資訊) To AA.Length - 1
For i = 0 To AA(xx).Rows.Length - 1 '寫入資料
k = k + 1
For j = 0 To 19
Application.StatusBar = "下載資料中 ..." & k - 1
.Cells(k, j + 1) = AA(xx).Rows(i).Cells(j).innertext
Next
Next
Next
Set AA = .Range("S3:S" & .[S3].End(xlDown).Row)
AA.Replace "基本每股盈餘", "", xlWhole
AA.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
.Cells(.Rows.Count, 1).End(xlUp).EntireRow.Delete
.Cells.EntireColumn.AutoFit
.[A1].Select
End With
Application.ScreenUpdating = True
ie.Quit
Application.StatusBar = "下載資料時間 : " & Format(Time - T, ["S秒"])
End
ie_err:
ie.Quit
MsgBox "網頁有問題,請重新執行..."
End
資訊_Err:
End Sub
Private Sub 等待網頁() '等待網頁下載資料完畢的時間
Dim Tt(1 To 3) As Date
Tt(1) = Time
Tt(2) = Time
Tt(3) = #12:00:10 AM# '10秒 調整這裡
Do
If Time > Tt(2) Then
Application.StatusBar = "網頁下載中 剩餘秒數.. " & Second(Tt(1) + Tt(3) - Time)
Tt(2) = Time
End If
DoEvents
Loop Until Time > Tt(1) + Tt(3)
Application.StatusBar = "資料下載中...."
End Sub
Private Function 下載網址(xWord As String) As String '傳回選擇的網址
Select Case xWord
Case "1"
下載網址 = "http://mops.twse.com.tw/mops/web/t51sb08" '損益表
Case "2"
下載網址 = "http://mops.twse.com.tw/mops/web/t51sb13" '合併損益表
''Case "3" 新網頁的網址
''
''
End Select
End Function
Private Function 市場別(xWord As String) As String
'上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
Select Case xWord
Case "sii"
市場別 = "上市"
Case "otc"
市場別 = "上櫃"
Case "rotc"
市場別 = "興櫃"
Case "pub"
市場別 = "公開發行"
End Select
End Function
Private Function 網頁表格(xWord As String) As Integer
Select Case xWord
Case "1"
網頁表格 = 13 '損益表
Case "2"
網頁表格 = 12 '合併損益表
''每一網頁的表單建置不一樣,需一一去尋找
'' 自行查看新增 Case "3"......
''
End Select
End Function
複製代碼
作者:
HSIEN6001
時間:
2013-3-30 22:45
回復
4#
GBKEE
網頁表格 = 13 '損益表
網頁表格 = 12 '合併損益表
請問13與12數據由來
若換成不同表格我該要如何判斷這數值?!
例如:http://mops.twse.com.tw/mops/web/t56sb21_q3
作者:
HSIEN6001
時間:
2013-3-30 23:04
不設表格名稱(抬頭),以下是修改部分資料應用
望請修正錯誤,謝謝..^___^..
Option Explicit
Sub 申報轉讓()
Dim ie As Object, xx, k, j, i, AA As Variant
Dim T As Date, 資訊 As String
Do
資訊 = InputBox("1: 歷史持股轉讓" & vbLf & "2: 合併損益表") '選擇公開資訊觀測站的表格
If 資訊 = "" Then Exit Sub '不選擇結束程式
Loop Until Val(資訊) > 0 And Val(資訊) <= 2 ' Val(資訊)<=??? 結束選擇表單
ActiveSheet.Cells.Clear
Application.DisplayStatusBar = True
Application.StatusBar = "....... 網頁開啟中.......... "
'On Error GoTo ie_err
Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate 下載網址(資訊)
Do While ie.Busy Or ie.ReadyState <> 4
DoEvents
Loop
With ie.Document
T = Time
Do While ie.Busy Or ie.ReadyState <> 4
If Time = T + #12:01:00 AM# Then GoTo ie_err '等候網頁異常:結束程式
DoEvents
Loop
'********** 修改這裡 的選項
'http://mops.twse.com.tw/mops/web/t56sb21_q3?&step=0&firstin=1&off=1&TYPEK=sii&year=91&smonth=07&emonth=09
.getelementbyID("TYPEK").Value = "sii" '上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
.getelementbyID("year").Value = "91" '年度
.getelementbyID("smonth").Value = "07" '起月份
.getelementbyID("emonth").Value = "09" '訖月份
For i = 0 To .getelementsbytagname("input").Length - 1
If .getelementsbytagname("input")(i).Type = "button" And .getelementsbytagname("input")(i).Value = " 搜尋 " Then
.getelementsbytagname("input")(i).Click
End If
Next
等待網頁
Set AA = .getelementsbytagname("table") '資料區
End With
T = Time
With ActiveSheet
.Cells(1).Select
Application.ScreenUpdating = False
k = 1
On Error Resume Next
For xx = 網頁表格(資訊) To AA.Length - 1
For i = 0 To AA(xx).Rows.Length - 1 '寫入資料
k = k + 1
For j = 0 To 19
Application.StatusBar = "下載資料中 ..." & k - 1
.Cells(k, j + 1) = AA(xx).Rows(i).Cells(j).innertext
Next
Next
Next
Set AA = .Range("R3:R" & .[R3].End(xlDown).Row)
AA.Replace "是否申報持", "", xlWhole
AA.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
.Cells(.Rows.Count, 1).End(xlUp).EntireRow.Delete
.Cells.EntireColumn.AutoFit
.[A1].Select
End With
Application.ScreenUpdating = True
ie.Quit
Application.StatusBar = "下載資料時間 : " & Format(Time - T, ["S秒"])
End
ie_err:
ie.Quit
MsgBox "網頁有問題,請重新執行..."
End
資訊_Err:
End Sub
Private Sub 等待網頁() '等待網頁下載資料完畢的時間
Dim Tt(1 To 3) As Date
Tt(1) = Time
Tt(2) = Time
Tt(3) = #12:00:10 AM# '10秒 調整這裡
Do
If Time > Tt(2) Then
Application.StatusBar = "網頁下載中 剩餘秒數.. " & Second(Tt(1) + Tt(3) - Time)
Tt(2) = Time
End If
DoEvents
Loop Until Time > Tt(1) + Tt(3)
Application.StatusBar = "資料下載中...."
End Sub
Private Function 下載網址(xWord As String) As String '傳回選擇的網址
Select Case xWord
Case "1"
下載網址 = "http://mops.twse.com.tw/mops/web/t56sb21_q3" '歷史持股轉讓
Case "2"
下載網址 = "http://mops.twse.com.tw/mops/web/t51sb13" '合併損益表
''Case "3" 新網頁的網址
''
''
End Select
End Function
Private Function 市場別(xWord As String) As String
'上市 = sii,上櫃 = otc,興櫃 = rotc,公開發行 = pub
Select Case xWord
Case "sii"
市場別 = "上市"
Case "otc"
市場別 = "上櫃"
Case "rotc"
市場別 = "興櫃"
Case "pub"
市場別 = "公開發行"
End Select
End Function
Private Function 網頁表格(xWord As String) As Integer
Select Case xWord
Case "1"
網頁表格 = 11
Case "2"
網頁表格 = 12 '合併損益表
''每一網頁的表單建置不一樣,需一一去尋找
'' 自行查看新增 Case "3"......
''
End Select
End Function
複製代碼
作者:
diabo
時間:
2013-3-30 23:19
回復
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
時間:
2013-3-30 23:21
回復
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
時間:
2013-3-31 00:09
回復
1#
spermbank
Sub 抓財報(財報別, 市場別, 年, 季)
Select Case 財報別
Case "損益": 程式 = "ajax_t51sb08"
Case "資產": 程式 = "ajax_t51sb07"
Case "合併損益": 程式 = "ajax_t51sb13"
Case "合併資產": 程式 = "ajax_t51sb12"
End Select
Select Case 市場別
Case "上市": 市場 = "sii"
Case "上櫃": 市場 = "otc"
Case "興櫃": 市場 = "rotc"
Case "公開": 市場 = "pub"
End Select
'原始網址 http://mops.twse.com.tw/mops/web/ajax_t51sb07?encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year=101&season=04
theURL = "http://mops.twse.com.tw/mops/web/" & 程式 & "?encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=" & 市場 & "&year=" & 年 & "&season=" & 季
With ActiveSheet.QueryTables.Add(Connection:="URL;" & theURL, Destination:=Range("A1"))
.Name = "抓財報"
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
.Delete
End With
End Sub
複製代碼
1. 以上程式碼僅抓資料,並未處理金融保險證券...類股會計科目不同的問題
2. 使用範例 call 抓財報( "損益","上櫃",101,"04")
作者:
spermbank
時間:
2013-3-31 01:50
回復
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 '每月合併營業收入統計彙總表
我又要如何匯入呢? 謝謝。
作者:
HSIEN6001
時間:
2013-3-31 08:36
回復
8#
diabo
謝謝,這UR試過了,可惜抓下來文字是亂碼
G大的測試OK,但還有許多不懂,等待指點 ^__^
作者:
diabo
時間:
2013-3-31 09:56
回復
11#
HSIEN6001
檢視IE的編碼,是否選擇「自動編碼」......
作者:
HSIEN6001
時間:
2013-3-31 16:47
回復
12#
diabo
不懂耶!
因為該UR直接顯示亂碼,所以我下載也是亂碼
請問您說的是將程式碼寫在VBA�媕Y排除亂碼問題?!
可否示範?!
作者:
HSIEN6001
時間:
2013-3-31 16:56
回復
4#
GBKEE
G大,同#5 及 #10之問題
網頁表格 = 13 '損益表
網頁表格 = 12 '合併損益表
可否請問13與12數據應該如何判斷這數值?!
例如:http://mops.twse.com.tw/mops/web/t56sb21_q3
作者:
GBKEE
時間:
2013-3-31 17:09
本帖最後由 GBKEE 於 2013-3-31 18:38 編輯
回復
13#
HSIEN6001
刪掉 encodeURIComponent=1
回復
14#
HSIEN6001
有
diabo
提供的網址好辦些
Option Explicit
Sub Ex()
Dim ie As Object, aa As Object, k As Integer, xx As Integer, i As Integer, j As Integer
ActiveSheet.Cells.Clear
Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "http://mops.twse.com.tw/mops/web/ajax_t51sb13?step=1&firstin=1&off=1&TYPEK=sii&year=100&season=04"
Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop
On Error Resume Next
Set aa = ie.Document.getelementsbytagname("table") '表格資料區
k = 1
On Error Resume Next
For xx = 0 To aa.Length - 1
'找到後修改 For xx = ??? To aa.Length - 1
For i = 0 To aa(xx).Rows.Length - 1 '寫入資料
Cells(k, 1) = "Table" & xx
k = k + 1 '列數
For j = 0 To 19
Application.StatusBar = "下載資料中 ..." & k - 1
Cells(k, j + 2) = aa(xx).Rows(i).Cells(j).innertext
Next
Next
Next
ie.Quit
End Sub
複製代碼
作者:
HSIEN6001
時間:
2013-3-31 19:44
回復
15#
GBKEE
以102年1~3月為例,上市sii及上櫃otc:
網址是:
http://mops.twse.com.tw/mops/web/ajax_t56sb21?&run=&step=1&TYPEK=sii&year=102&smonth=01&emonth=03&sstep=1&firstin=true ‘上市 sii 上櫃 otc
因為下載之後呈現亂碼,所以才用G大#4的方式
套用UR : http://mops.twse.com.tw/mops/web/t56sb21_q3?&step=0&firstin=1&off=1&TYPEK=sii&year=102&smonth=01&emonth=03 ‘上市 sii 上櫃 otc
測試完整代碼於#6 ,測試OK 的 (沒亂碼)
只是沒法理解----->網頁表格 13 or 12
遇到不同網頁,判別方式?!
PS:剛剛試 #15 的代碼,下載也呈現亂碼。
作者:
HSIEN6001
時間:
2013-3-31 19:57
不好意思,補充說明一下
#16 兩個URL 都是指同一份表格
作者:
diabo
時間:
2013-3-31 21:54
回復
13#
HSIEN6001
1. EXCEL的WEB查詢,也是透過IE,因此IE的設定會影響到下載的結果。
2. IE 檢視→編碼→自動選取
[attach]14500[/attach]
作者:
GBKEE
時間:
2013-4-1 15:18
回復
16#
HSIEN6001
只是沒法理解----->網頁表格 13 or 12 遇到不同網頁,判別方式?!
4# 這段程式碼
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
複製代碼
改成15#這段程式碼
10. k = 1
11. On Error Resume Next
12. For xx = 0 To aa.Length - 1
13. '不同網頁,判別方式 '找到後修改 For xx = ??? To aa.Length - 1
14. For i = 0 To aa(xx).Rows.Length - 1 '寫入資料
15. Cells(k, 1) = "Table" & xx
16. k = k + 1 '列數
17. For j = 0 To 19
18. Application.StatusBar = "下載資料中 ..." & k - 1
19. Cells(k, j + 2) = aa(xx).Rows(i).Cells(j).innertext
20. Next
21. Next
22. Next
複製代碼
作者:
HSIEN6001
時間:
2013-4-2 00:11
本帖最後由 HSIEN6001 於 2013-4-2 00:13 編輯
回復
19#
GBKEE
回復
18#
diabo
謝謝兩位幫忙解惑
你們都好棒喔!
感恩 ^__^
作者:
tsuneng
時間:
2013-4-21 18:06
感恩大大分享.
作者:
randomwalk
時間:
2013-5-17 11:18
回復
8#
diabo
請教diabo兄
如何檢視原始網址?
新版的公開資訊站並無法檢視,
望不吝指導,謝謝
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)