標題:
[發問]
請問如何抓取氣象局opendata xml 問題
[打印本頁]
作者:
yehmengfeng
時間:
2016-1-7 10:09
標題:
請問如何抓取氣象局opendata xml 問題
小弟近來在找論文資料:
請問各位程式高手,如何抓取「觀測資料查詢系統」的內資料:http://e-service.cwb.gov.tw/HistoryDataQuery/index.jsp
因論文寫作上資料分析每個月的氣候資料,請問如何使用excel VBA的方式把資料抓取到excel
請問如何取得觀測資料查詢系統的月報表:http://e-service.cwb.gov.tw/HistoryDataQuery/MonthDataController.do?command=viewMain&station=467410&datepicker=2015-01
作者:
stillfish00
時間:
2016-1-7 13:48
回復
1#
yehmengfeng
參考看看
Sub GetWeatherInfo()
Dim oXmlhttp As Object: Set oXmlhttp = CreateObject("msxml2.xmlhttp")
Dim oHtmldoc As Object: Set oHtmldoc = CreateObject("htmlfile")
Dim oClip As Object: Set oClip = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") 'DataObject
Dim sURL As String
sURL = "http://e-service.cwb.gov.tw/HistoryDataQuery/MonthDataController.do?command=viewMain&station=467410&datepicker=2016-01"
With oXmlhttp
.Open "Get", sURL, False
.Send
oHtmldoc.write .responseText
End With
Dim oTable As Object
Set oTable = oHtmldoc.GetElementById("MyTable")
If oTable Is Nothing Then MsgBox "擷取Table失敗...": Exit Sub
'remove top header row (press/temperature...)
oTable.FirstChild.RemoveChild oTable.FirstChild.ChildNodes(0)
'copy to clip board
With oClip
.SetText Replace(oTable.outerhtml, " ", "")
.PutInClipboard
End With
Sheets.Add().PasteSpecial NoHTMLFormatting:=True '不要含格式
End Sub
複製代碼
作者:
joey0415
時間:
2016-1-7 19:23
回復
1#
yehmengfeng
變數自己改改看!
Sub 巨集1()
'
Cells.Delete
surl = "URL;" & "http://e-service.cwb.gov.tw/HistoryDataQuery/MonthDataController.do?command=viewMain&station=467410&datepicker=2015-01"
Set QT = ActiveSheet.QueryTables.Add(Connection:=surl, Destination:=Range("$A$1"))
With QT
.WebFormatting = xlWebFormattingNone
.Refresh BackgroundQuery:=False
.Delete
End With
Set QT = Nothing
End Sub
複製代碼
作者:
GBKEE
時間:
2016-1-9 15:31
本帖最後由 GBKEE 於 2016-1-9 15:36 編輯
回復
2#
stillfish00
回復
3#
joey0415
綜合2位,使用表單呈現,可選擇地區,資料格式,時間. 匯入所要的氣象資料.
新增 UserForm(表單) 中加入ComboBox1, ComboBox2, ComboBox3 ,CommandButton1
Option Explicit
Dim xObject()
Private Sub UserForm_Initialize()
xObject = Array(ComboBox1, ComboBox2, ComboBox3)
觀測查詢_設定
Com
ComboBox1.Value = ComboBox1.List(0)
ComboBox2.Value = ComboBox2.List(0)
End Sub
Private Sub ComboBox1_Change() '測 站
Com
End Sub
Private Sub ComboBox2_Change() '資料格式
Dim i As Double
With ComboBox3
.Clear
Select Case ComboBox2.ListIndex
Case 0 '
For i = Date - 1 To DateAdd("Q", -1, Date) Step -1
.AddItem
.List(.ListCount - 1) = Format(i, "YYYY-MM-DD")
Next
Case 1
i = Date
Do
.AddItem
.List(.ListCount - 1) = Format(i, "YYYY-MM")
i = DateAdd("M", -1, i)
Loop Until Year(i) < Year(Date) - 1
Case 2
For i = Year(Date) To Year(Date) - 1 Step -1
.AddItem
.List(.ListCount - 1) = i
Next
End Select
If ComboBox2.ListIndex > -1 Then .Value = .List(0)
End With
Com
End Sub
Private Sub ComboBox3_Change() '時 間
Com
End Sub
Private Sub Com() '
Dim E As Variant
With CommandButton1
.Enabled = True
For Each E In xObject
If E.ListIndex = -1 Then .Enabled = False '按紐(觀測資料查詢):不可用
Next
End With
End Sub
Private Sub CommandButton1_Click() '按紐(觀測資料查詢)
Dim surl As String, QT As QueryTable
'http://e-service.cwb.gov.tw/HistoryDataQuery/YearDataController.do?command=viewMain&station=467410&datepicker=2016
'http://e-service.cwb.gov.tw/HistoryDataQuery/MonthDataController.do?"
'http://e-service.cwb.gov.tw/HistoryDataQuery/DayDataController.do?
surl = "URL; http://e-service.cwb.gov.tw/HistoryDataQuery/"
Select Case ComboBox2.ListIndex
Case 0
surl = surl & "DayDataController.do?"
Case 1
surl = surl & "MonthDataController.do?"
Case 2
surl = surl & "YearDataController.do?"
End Select
surl = surl & "command=viewMain&station=" & ComboBox1.List(ComboBox1.ListIndex, 1)
surl = surl & "&datepicker=" & ComboBox3
With ActiveSheet
.Cells.Delete
Set QT = .QueryTables.Add(Connection:=surl, Destination:=.Range("$A$1"))
With QT
.WebFormatting = xlWebFormattingNone
.Refresh BackgroundQuery:=False
.Delete
End With
End With
Set QT = Nothing
End Sub
Private Sub 觀測查詢_設定()
Dim i As Double, E As Object, op As Object
Dim oXmlhttp As Object, oHtmldoc As Object, Url As String
Set oXmlhttp = CreateObject("msxml2.xmlhttp")
Set oHtmldoc = CreateObject("htmlfile")
Url = "http://e-service.cwb.gov.tw/HistoryDataQuery/QueryDataController.do?command=viewMain" '
With oXmlhttp
.Open "Get", Url, False
.Send
oHtmldoc.write .responseText
End With
With oHtmldoc
Set E = .all.tags("SELECT")(0)
Set op = .all.tags("option")
End With
For i = 0 To op.Length - 1
If i <= E.Length - 1 Then
With ComboBox1
.AddItem
.List(.ListCount - 1, 0) = op(i).innertext '測站:名稱
.List(.ListCount - 1, 1) = op(i).Value '測站:數值
End With
Else
With ComboBox2
.AddItem
.List(.ListCount - 1, 0) = op(i).innertext '資料格式:名稱
End With
End If
Next
End Sub
複製代碼
作者:
c_c_lai
時間:
2016-1-9 18:23
本帖最後由 c_c_lai 於 2016-1-9 18:34 編輯
回復
4#
GBKEE
經測試發現:
「Private Sub CommandButton1_Click() ' 按紐(觀測資料查詢)」
surl = "URL;
http://e-service.cwb.gov.tw/HistoryDataQuery/
"
要修正為:
surl = "URL;
http://e-service.cwb.gov.tw/HistoryDataQuery/
"
"URL;" 與 "http://" 間不能存在空格 (Space),否則執行時,會產生如下的錯誤訊息:
「無法開啟 "URL;
http://e-service.cwb.gov.tw/Hist ... tepicker=2016-01-08
"
。無法連接網際網路伺服器。」
您模組的組合,其彈性與選擇性充分地表達出來,謝謝您!
[attach]23070[/attach]
作者:
GBKEE
時間:
2016-1-9 19:55
回復
5#
c_c_lai
謝謝你的測試,2003可空一格。
作者:
c_c_lai
時間:
2016-1-10 05:43
回復
6#
GBKEE
所以說嘛,這也是微軟版本之不一致的詬病,
難怪有常說在 2003 能夠執行的,換了版本
卻又不能。譬如常發生: Automation 之類。
作者:
yehmengfeng
時間:
2016-1-10 17:48
感謝各位的協助,原來excel vba有這麼多樣的方法,讓我更寬廣的思考空間
近日還有不斷的學習vba程式,還有努力消化中, 但....還沒完全理解 ><
請問,如果要把地區(ex:台南、台東)放在活頁本上區格開,可以自行選擇時間區間(ex:2015-01-01 至 2015-12-31),把每日的資料格式全部放在一起,用時間作區格. 匯入到excel
作者:
yehmengfeng
時間:
2016-2-22 21:19
標題:
求救....花了很多的時間去研習excel vba,但還是做不出來
各位老師們好:
之前有發問一個問題,有關如何抓取「觀測資料查詢系統」的內資料:http://e-service.cwb.gov.tw/HistoryDataQuery/index.jsp
之前帖子:
http://forum.twbts.com/thread-16114-1-1.html
後來依據裡面的資料去修改程式碼,也花了很多的時間去找方法,但還是做不出來,請問.....可以教教我如何做嗎? 快瘋了。
ps....我不是小白啦, 我真的很感謝各位老師的協助,心想......原來~~~vba的程式可以這樣寫~~太神奇了
請問,如果要把地區(ex:台南、台東)放在活頁本上區格開,可以自行選擇時間區間(ex:2015-01-01 至 2015-12-31),把每日的資料格式全部放在一起,用時間作區格. 匯入到excel
作者:
stillfish00
時間:
2016-2-25 16:20
回復
9#
yehmengfeng
參考看看
[attach]23331[/attach]
作者:
GBKEE
時間:
2016-2-26 14:54
本帖最後由 GBKEE 於 2016-3-4 14:19 編輯
回復
9#
yehmengfeng
試試看
UserForm 模組的程式碼
UserForm 需制定控制項
CommandButton1,ComboBox1,ComboBox2
Option Explicit
Dim Sh(1 To 2) As Worksheet
Private Sub UserForm_Initialize()
Set Sh(1) = Sheets.Add '設定新增工作表
Sh(1).Visible = False '隱藏工作表
觀測查詢_設定
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.DisplayAlerts = False
Sh(1).Delete
Application.DisplayAlerts = True
End Sub
Private Sub 觀測查詢_設定()
Dim Url As String, i As Double, op As Object, xDate As Date
Dim oHtmldoc As Object
Set oHtmldoc = CreateObject("htmlfile")
Url = "http://e-service.cwb.gov.tw/HistoryDataQuery/QueryDataController.do?command=viewMain" '
With CreateObject("msxml2.xmlhttp")
.Open "Get", Url, False
.Send
oHtmldoc.write .responseText
End With
With ComboBox1
For Each op In oHtmldoc.all.tags("SELECT")(0)
.AddItem
.List(.ListCount - 1, 0) = op.innertext '測站:名稱
.List(.ListCount - 1, 1) = op.Value '測站:數值
Next
.ListIndex = 0
End With
With ComboBox2
For i = 0 To -59 Step -1 '60個月份
xDate = DateAdd("M", i, Date)
.AddItem
.List(.ListCount - 1, 0) = Format(xDate, "EE年MM月")
.List(.ListCount - 1, 1) = DateSerial(Year(xDate), Month(xDate), 1)
Next
.ListIndex = 0
End With
End Sub
Private Sub CommandButton1_Click() '按紐(資料查詢)
Dim surl As String, QT As Range, Qdate As Date, Station As String, Msg As Boolean
'http://e-service.cwb.gov.tw/HistoryDataQuery/DayDataController.do?
surl = "URL;http://e-service.cwb.gov.tw/HistoryDataQuery/DayDataController.do?"
surl = surl & "command=viewMain&station=" & ComboBox1.List(ComboBox1.ListIndex, 1)
Station = ComboBox1.List(ComboBox1.ListIndex, 0) & "(" & ComboBox1.List(ComboBox1.ListIndex, 1) & ")" '工作表名稱
On Error GoTo Make_station: '處裡錯誤: 測站不存在
Set Sh(2) = Sheets(Station) '指定工作表(測站)
On Error GoTo 0 '有錯誤不處理了
Application.ScreenUpdating = False
For Qdate = ComboBox2.List(ComboBox2.ListIndex, 1) To DateAdd("m", 1, ComboBox2.List(ComboBox2.ListIndex, 1)) - 1
surl = "URL;http://e-service.cwb.gov.tw/HistoryDataQuery/DayDataController.do?command=viewMain&station=" & ComboBox1.List(ComboBox1.ListIndex, 1) & "&datepicker=" & Format(Qdate, "yyyy-m-dd")
If Qdate > Date Then Exit For '日期大於當日
If Not Sh(2).Range("A:A").Find(Qdate, LookIn:=xlFormulas) Is Nothing Then GoTo Ne '日期資料已存在,下一日期迴圈
Application.StatusBar = "匯入 " & Qdate & " 資料..." '狀態列的文字
With Sh(1)
.UsedRange.Delete
With .QueryTables.Add(Connection:=surl, Destination:=.Range("$A$1"))
.WebTables = "MyTable"
.WebFormatting = xlWebFormattingNone
.Refresh BackgroundQuery:=False
If .ResultRange.Rows.Count > 5 Then '有資料
Set QT = .ResultRange '含表頭的資料範圍
With Sh(2)
If .UsedRange.Count = 1 Then '工作表(測站)為空白
.Range("A1") = "觀測時間"
.Range("A1").Resize(5).Merge
Else
Set QT = QT.Rows("6:" & QT.Rows.Count) '不含表頭的資料
End If
With .Cells(Rows.Count, "b").End(xlUp)
If .Row = 1 Then '工作表(測站)為空白
QT.Copy .Cells
Else '.Row = 4 ->沒有資料但有表頭
QT.Copy .Cells(IIf(.Row = 4, 3, 2))
End If
End With
With .Range(.Cells(Rows.Count, "A").End(xlUp).Offset(1).Address & ":A" & Sh(2).Cells(Rows.Count, "B").End(xlUp).Row)
.Cells = Qdate 'A欄寫上日期
.NumberFormatLocal = "yyyy-mm-dd" '給予格式
End With
End With
End If
.Delete
End With
End With
Ne:
Next
Application.StatusBar = False
Application.ScreenUpdating = True
'排序
With Sh(2).UsedRange.Offset(5)
.Sort Key1:=.Range("A1"), Order1:=xlAscending, Key2:=.Range("B1"), Order2:=xlAscending, Header:=xlNo
End With
Exit Sub
Make_station:
Sheets.Add(Sheet1).Name = Station '新增工作表(測站)
Resume '回到錯誤的程式碼繼續程式
End Sub
複製代碼
作者:
yehmengfeng
時間:
2016-3-2 21:06
謝謝stillfish00的協助,因為權限不足,所以無法查看,請見諒。
最近因為升級組長,所以工作量變大很多,還得多多的調適。
但有空還是在試做,希望能做的出來。
目前是把上面板主寫的 試著自已修改看看....,但還是串不起來。
作者:
yehmengfeng
時間:
2016-3-2 21:29
GBKEE板主您好:
請問 我使用您po的程式試做,發現會一直出現 編輯錯誤:變數未定義
請問這要如何解決,一直找不出來那有問題點。
我查到的資料解釋:「在模組開頭寫了 Option Explicit,程式裡的變數就一定要先宣告才能使用,否則程式要執行的時候,VBA 解譯器會指出 "變數未定義"。
沒加 Option Explicit,VBA解譯器就不管程式裡的變數有沒有宣告, 好處是自由,壞處是若不小心打錯字就會被當成另一個變數, 例如: 有一變數名稱為 Customer,程式裡有一處誤打成 Custmoer,VBA 解譯器不會指出錯誤,它會認為 Customer和Custmoer是兩個不同的變數,因此這個程式執行的結果就不會正確。」
作者:
GBKEE
時間:
2016-3-4 14:33
回復
13#
yehmengfeng
我使用2003 正常
你試試修正看看
Private Sub CommandButton1_Click() '按紐(資料查詢)
Dim surl As String, QT As Range, Qdate As Date, Station As String, Msg As Boolean
surl = "URL;http://e-service.cwb.gov.tw/HistoryDataQuery/DayDataController.do?"
Stop
MsgBox ComboBox1
MsgBox ComboBox1.List(Me.ComboBox1.ListIndex, 1) '加上ME是否可修正錯誤
MsgBox ComboBox1.List(ComboBox1.ListIndex, 1)
複製代碼
作者:
yehmengfeng
時間:
2016-3-4 15:40
謝謝GBKEE板主 我試試看,謝謝您。
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)