請教有關ADODB.STREAM和Microsoft.XMLHTTP的用法
- 帖子
- 83
- 主題
- 17
- 精華
- 0
- 積分
- 105
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- XP
- 閱讀權限
- 20
- 註冊時間
- 2010-12-28
- 最後登錄
- 2018-8-8
|
請教有關ADODB.STREAM和Microsoft.XMLHTTP的用法
我打算將YAHOO FINANCE提供的CSV檔案下載作分析,於是在網上找到了混合用ADODB.STREAM和Microsoft.XMLHTTP來下載的方法,但我發現資料實在太多,根本不能方便使用。
所以打算把資料匯入ACCESS作整理,並根據網上的教學寫了下面的CODE:- Sub GetPrice()
- Dim wks As Workspace
- Dim dbs As Database
- Dim rs As DAO.Recordset
- Dim mySQL As String, myUrl As String
- Dim WinHttpReq As Object
- Set wks = DBEngine.Workspaces(0)
- Set dbs = wks.OpenDatabase("D:\Shares\temp.mdb")
- shareNo = Format(1, "0000")
- myUrl = "http://ichart.finance.yahoo.com/table.csv?s=" & shareNo & ".HK&a=09&b=27&c=2001&d=07&e=29&f=2012&g=d&ignore=.csv"
- T1 = "D:\Shares\temp01\" & shareNo & ".csv"
- Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
- WinHttpReq.Open "GET", myUrl, False
- WinHttpReq.Send
- If WinHttpReq.Status = 200 Then
- Set oStream = CreateObject("ADODB.Stream")
- oStream.Open
- oStream.Type = 1
- oStream.Write WinHttpReq.ResponseBody
- oStream.SaveToFile T1
- oStream.Close
- End If
-
- Set r1 = Workbooks.Open(T1)
- Set r2 = r1.Sheets(1).Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious)
-
- If Not r2 Is Nothing Then
- r = r2.Row
-
- mySQL = "insert into Price select * from (select " & shareNo & " as Share, Date, Open, High, Low, Close, Volume as Vol, [Adj Close] as AClose from [Excel 8.0;hdr=yes;imex=1;Database=" & T1 & "].[" & shareNo & "$A1:G" & r & "])"
- dbs.Execute (mySQL)
- r1.Close
- Kill T1
- End If
- End Sub
複製代碼 但這段CODE有些問題,希望各位可以多加指教:
1) 我不太明白ADODB.STREAM和Microsoft.XMLHTTP那部份的意思,網上和我手上的參考書都沒有提及,實在不了解當中的運作
2) 我這段CODE的流程應該是下載那個CSV,經過Microsoft.XMLHTTP讀取資料,再用ADODB.STREAM寫成一個CSV,然後我讀取CSV的資料,加上SHARENO,IMPORT到ACCESS,最後把CSV刪掉。
請問當中
讀取資料>儲存成CSV>讀取CSV>寫入ACCESS>刪除CSV的過程
能否改成,
讀取資料>>寫入ACCESS?
謝謝各位 |
|
|
|
|
|
|
- 帖子
- 83
- 主題
- 17
- 精華
- 0
- 積分
- 105
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- XP
- 閱讀權限
- 20
- 註冊時間
- 2010-12-28
- 最後登錄
- 2018-8-8
|
回復 2# HSIEN6001
謝謝你的指教,看起來你寫的CODE比我工整多了。
但我看到你好像把我的code分成三部份,第一個命令是當開這個EXCEL FILE時啟動
之後在"Microsoft.XMLHTTP"部份讀取CSV,先檢查檔案是否存在,如存在便先刪掉再建立一個新的(這個太好了,現時我是手動刪除的,謝謝)
然後用EXCEL VBA CALL ACCESS行MODULE,對嗎?
但當中有兩個問題,由於YAHOO提供的CSV沒有股票編號,如果不在寫入ACCESS時加上便無法確認這個RECORD是那只股票
另外,這個寫法還是需要,讀取YAHOO資料>儲存成CSV>讀取CSV>寫入ACCESS>刪除CSV
我上面的CODE,其實是可以做到的,但我希望當用"Microsoft.XMLHTTP"讀取YAHOO資料時,能夠不用儲存成CSV,直接把資料寫到ACCESS中,不用不斷重複建立和刪除CSV(因為我會抓數百間公司資料)。 |
|
|
|
|
|
|
- 帖子
- 83
- 主題
- 17
- 精華
- 0
- 積分
- 105
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- XP
- 閱讀權限
- 20
- 註冊時間
- 2010-12-28
- 最後登錄
- 2018-8-8
|
回復 3# GBKEE
謝版大,可是我權限不夠,不能下載呢
另外,可以介紹Stream的用法嗎?好像不易理解..... |
|
|
|
|
|
|
- 帖子
- 83
- 主題
- 17
- 精華
- 0
- 積分
- 105
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- XP
- 閱讀權限
- 20
- 註冊時間
- 2010-12-28
- 最後登錄
- 2018-8-8
|
回復 6# GBKEE
好的,待我先回應大家的POST再作研究,先謝了 |
|
|
|
|
|
|
- 帖子
- 83
- 主題
- 17
- 精華
- 0
- 積分
- 105
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- XP
- 閱讀權限
- 20
- 註冊時間
- 2010-12-28
- 最後登錄
- 2018-8-8
|
本帖最後由 小俠客 於 2012-8-31 11:09 編輯
回復 小俠客
[參考]
順序可改成:
下載CSV → 經過VBA整理加入代號 → 匯入Access。
至於下載後, ...
HSIEN6001 發表於 2012-8-31 10:56 
我也不懂如何在CSV加入新欄位,所以我用了一個替代方法:- mySQL = "insert into Price select * from (select " & shareNo & " as Share, Date, Open, High, Low, Close, Volume as Vol, [Adj Close] as AClose from [Excel 8.0;hdr=yes;imex=1;Database=" & T1 & "].[" & shareNo & "$A1:G" & r & "])"
複製代碼 先把CSV當成一個DATABASE的TABLE,再用SQL INSERT到我的ACCESS中,SQL COMMAND當中加上我需要的SHARE NO,這樣便不用加欄位到CSV了。
但我還是覺得我現在的做法有點蠢,花一輪功夫將資料寫成一個CSV,再用SQL把沒有的資料(SHARE NO)加上,IMPORT到ACCESS,再刪掉那個CSV,但我總覺得建立CSV的工序有點重複...... |
|
|
|
|
|
|
- 帖子
- 83
- 主題
- 17
- 精華
- 0
- 積分
- 105
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- XP
- 閱讀權限
- 20
- 註冊時間
- 2010-12-28
- 最後登錄
- 2018-8-8
|
|
|
|
|
|
|
- 帖子
- 83
- 主題
- 17
- 精華
- 0
- 積分
- 105
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- XP
- 閱讀權限
- 20
- 註冊時間
- 2010-12-28
- 最後登錄
- 2018-8-8
|
回復 小俠客
你已有積分44分 版規: 檔案附件限等級中學生(積分50)以上才能下載
加油 加油!
GBKEE 發表於 2012-8-31 10:24 
終於成為中學生了,可以載附件了
太利害了,原來可以這樣簡化的,謝謝!內容太多,要點時間消化
但可以多了解一下,用DAO 和ADODB在執行效率上有沒有分別?
因為DAO不用像ADODB要寫provider=?????,容易記住。
另外,我看到「資料導入資料庫()」中,你是用FOR LOOP+.AddNew +.UPDATE的方法寫入資料,這個和用SQL COMMAND的INSERT,在執行速度上有沒有分別?謝謝 |
|
|
|
|
|
|
- 帖子
- 83
- 主題
- 17
- 精華
- 0
- 積分
- 105
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- XP
- 閱讀權限
- 20
- 註冊時間
- 2010-12-28
- 最後登錄
- 2018-8-8
|
回復 小俠客
試試看
GBKEE 發表於 2012-8-30 16:21 
我剛剛試比較用.ADDNEW和.UPDATE和SQL INSERT 速度比較,我發現用SQL INSERT比前者快很多- Set wb = Workbooks.Open(myUrl)
- With myRS
- For Each a In ActiveSheet.Range([A2], [A2].End(xlDown))
- .AddNew '添加各個欄位的資料
- For i = 1 To .Fields.Count - 1
- .Fields(0) = shareNo
- .Fields(i) = a(1, i)
- Next i
- .Update '更新資料表
- Next
- End With
複製代碼 所以我希望用SQL作資料寫入,但請問這句如何改寫成用 wb 或activebook作DATABASE呢?- "insert into Price select * from (select " & shareNo & " as Share, Date, Open, High, Low, Close, Volume as Vol, [Adj Close] as AClose from [Excel 8.0;hdr=yes;imex=1;Database=" & wb & "].[table$A1:G" & r & "])"
複製代碼 謝謝指教 |
|
|
|
|
|
|