此例是
HyTV電視節目綜合查詢,這個查詢的特性是只能查單日節目,而且查詢結果可能有多頁。尤其是多頁的問題:一般Web查詢參數是直接寫在網址即可,但在這個案例卻怎麼試也抓不到第一頁以後的查詢結果。
曾經在網上請教這個問題 (詳見
ExcelHelp主題),有幸得到沙拉油兄的指導,初步結論是:像這種特殊案例要用查詢表物件 QueryTable 的
PostText 屬性傳送查詢參數才能解決。為何說是初步結論? 因為只知道解決方法,不知其原因,也沒有理論基礎。
以下範例有幾個重點:
1. 工作表中的查詢表已存在。
2. 日期批次查詢 - 系統日期至最近的禮拜天(Sunday)。
3. 時段批次查詢 - 只查0000~0300、1900~2400的資料。
4. 頁次批次查詢 - 依網頁特性判斷有多頁時的處理。
5. 該網頁允許在查詢參數中指定多個頻道(可由網頁原始碼中得知頻道代碼)。
Sub hytv_query_week()
With ActiveSheet.QueryTables(1)
.Connection = "URL;
http://www.hytv.com.tw/cgi/tvsearch.cgi"
.WebTables = "9"
': On Error GoTo 1 Set dt = Range("B2")
'起始日來自 B2 的日期 end_date = dt - Weekday(dt) + 8
'終止日為最近的禮拜天 While dt <= end_date
For Each tm In Array("0000&end=0300", "1900&end=2400")
For pg = 1 To IIf(tm Like "00*", 1, 2)
'1900-2400時段需查第2頁 .
PostText = "search_option=1&CH=hbo1&CH=star4&CH=star5&CH=tvbs5" & _
"&start=" & tm & "&DATE=" & Format(dt, "yyyymmdd") & "&page=" & pg
.Refresh 0
'BackgroundQuery:=False '查到資料後呼叫另一程序(to_data)做進一步處理 If Not .ResultRange.Cells(1) Like "查無資料*" Then to_data
Next pg
Next
dt = dt + 1
Wend
End With
End Sub
當然這只是範例。你在處理其他案例之前,必須充分了解該網頁的特性、詳細的查詢方式,才能找出最適合的寫法。
關於應用實例,這個查詢方式預計將納入下一版的
TV Program Manager,再次感謝沙拉油兄指點。