(不定期更新)使用VBA解決 excel web 查詢無法匯入、匯入太慢的股市資料

snare wrote:
(編輯中… 編輯中…...(恕刪)



這邊真的苦死我這新手...
光這個地方就弄整天

因為從上寫下來,順序流程的問題
不把那個print跟定義物件弄好搞懂
沒辦法到下面寫迴圈(強迫症)

希望能慢慢學習set物件...
還有什麼getelementbyid
getelementbytagname的

這邊是有範例all.tags("table")
還有好多網頁規格都不太一樣
沒name的,沒id的....(倒下)

從抄抄中找範例練習,印象也深刻多了
名師出高徒

感謝師傅給答案

bioleon69 wrote:
還有什麼getelementbyid
getelementbytagname的
這邊是有範例all.tags("table")...(恕刪)


如果您有注意看的話,getelementbyid ,我範例中有用到
除了table之外還用了
all.tags("image")
.href

getelementbytagname 沒用到,因為股市資料,大部份都是表格
用all.tags()這種物件集合會比較方便處理
當然反過來用getelementbytagname代替all.tags()也可以

想深入了解xmlhttp winhttp htmlfile 的話,也可以找 javascript 的範例來看
javascript的範例多到您看不完


建議您先搞懂陣列,陣列懂的話,物件集合大概也沒問題了
xmlhttp winhttp htmlfile 這些物件想上手也會比較容易

HOW TO:宣告陣列變數
https://msdn.microsoft.com/zh-tw/library/x397t1yt(v=vs.90).aspx
網頁內還有以下的說明、範例,記得要點開來看

HOW TO:建立陣列
HOW TO:建立具有一個以上維度的陣列
HOW TO:建立陣列的陣列
HOW TO:初始化陣列變數
Visual Basic 中的陣列概觀
Visual Basic 中的多維陣列
Visual Basic 中的不規則陣列
Visual Basic 中的陣列
(因網頁改版,此範例失效,套用到別的網站尚無問題,證交所csv下載請參考200樓)

範例網站:
增加臺灣證券交易所三大法人買賣超日報csv下載範例

這個範例和107樓是相同功能的,因為臺灣證券交易所有提供2種下載方式(html、csv)
所以又做了一個csv範例,各位可比較看看有什麼不同

csv匯入方式我有簡化了,不需使用for next迴圈,不需另外定義陣列
雖然用Workbooks.Open,只要一行程式碼就能解決

但穩定性、速度,卻是遙遙領先 Workbooks.Open

'====程式碼請放在“模組”裡===========
Sub getstock()

Cells.Clear

Dim Url, XMLget, csvrow
Set XMLget = CreateObject("msxml2.xmlhttp")
daytext = InputBox("日期(7碼數字)", , Format(Date, "yyyymmdd") - 19110000) + 19110000

Url = "http://www.twse.com.tw/fund/T86?response=csv&date=" & daytext & "&selectType=ALLBUT0999"

ttt = Timer

With XMLget
.Open "GET", Url, False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
Do Until .readyState = 4: DoEvents: Loop

If Len(.responsetext) = 2 Then
Cells(1, 1) = "很抱歉,沒有符合條件的資料!"
Exit Sub
End If

csvrow = Split(Replace(.responsetext, "=", ""), vbNewLine)

End With

ttt = Timer - ttt

Sheets("sheet1").Range(Cells(1, 1), Cells(UBound(csvrow), 1)) = Application.Transpose(csvrow)
Sheets("sheet1").Columns("A:A").TextToColumns DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
MsgBox Sheets("sheet1").Cells(1, 1) & vbNewLine & "資料筆數" & UBound(csvrow) - 10 & "筆" & vbNewLine & "使用時間" & Round(ttt, 2) & "秒", vbOKOnly, "下載完成"

Set XMLget = Nothing

End Sub


'================================



其它日報代號、修改方式,同107樓

附加壓縮檔: 201705/mobile01-747fdf9b5a140401fe5c76be0be43b38.zip
snare wrote:
範例網站:增加臺灣證...(恕刪)


不只三大
這次改版很多頁面都有html/csv下載 兩種
最近應該不少人都在code


師傅,以您來看
會比較建議
應該說,您自己會使用哪一種?
bioleon69 wrote:
這次改版很多頁面都有html/csv下載 兩種
最近應該不少人都在code
...(恕刪)
...(恕刪)
應該說,您自己會使用哪一種?...(恕刪)


2種速度基本上是一樣的…
不過還是要看網頁的設計

網頁傳回值是html,另外提供csv下載的,csv快很多
因為html包含很多網頁元素,表格、線條、網址、標籤…等等一大堆
以資料量來說,csv就小非常多,所以快

網頁傳回值是json,另外提供csv下載的,2個一樣快
因為json的資料量幾乎跟csv一樣

真要說的話,我會選可以減少後續工作的那一種
有的html下載後還要特別去移動合併儲存格,位置不對的問題
如果改用csv的話,裡面格子會先分好,不用再移一次
只要稍微處理一下欄寬、列高、顏色…,就很完美了

code ??? copy? 如果網頁改版後有提供csv下載,我會建議csv優先
因為程式碼不重新改寫,還是用.QueryTables 、ie object的話
改下載csv可提高程式速度、穩定性

我個人是沒差,我只用到yahoo收盤股價查詢而己,其它都是寫好玩的

snare wrote:
如果您有注意看的話...(恕刪)


在下看了 snare大大 的這些建議,
其實也是深有所感...^^"
在下是感覺,寫這類的網頁資料查詢程式,以目前對在下的認知程度來說,
真正難的地方還是在網頁架構的識別,像如何取用所需的關鍵資料這類的...
和 VBA 中物件的應用,如 CreateObject("msxml2.xmlhttp") 這些物件的原理和應用方法
因為這二方面都是在下之前未曾接觸過的領域...^^"
所以,要真正能從大大所分享的這些難得的範例中來學到精髓,
估計還尚有一段歷練的路要走吧...^^"
如果不是因緣際會剛好碰上 Snare大大 有分享這些範例,
大概可能不太會這麼快知道原來 Excel 還有這些有趣的東西可以來弄...哈哈^^"
snare wrote:
如果您有注意看的話...(恕刪)


先謝謝 snare大大 分享的這個範例,
在下先收下來了,待會再來測試看看^^


這次又學到一個新的用法
Sheets("sheet1").Columns("A:A").TextToColumns DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True

這次所採用的這個csv文件的抓取方式,雖然很快,
但似乎在貼上儲存格時會自然的讓 欄寬 和 列高 變得有點太大,
最後,還是要做事後美化處理...



yuehmao wrote:
這次又學到一個新的用法
Sheets("sheet1").Columns("A:A").TextToColumns DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
...(恕刪)

這不是什麼新用法啦,就是excel資料剖析
我偷懶用錄巨集,稍微改一下而已,所以看起來比較不一樣
錄完是這樣


 


Sub Macro1()


   


        Columns("A:A").Select


        Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _


        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _


        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _


        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _


        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _


        ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1)), TrailingMinusNumbers:= _


        True


 


End Sub






因為.TextToColumns,參數都非必要,又有預設值,所以可省略很多(請參考下面網址)
https://msdn.microsoft.com/zh-tw/library/office/ff193593.aspx

改完變這樣
Columns("A:A").TextToColumns DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
2種寫法功能一樣,很單純就是不喜歡又臭又長的程式碼
Sheets("sheet1")是另外加上去的

yuehmao wrote:
這次所採用的這個csv文件的抓取方式,雖然很快,
但似乎在貼上儲存格時會自然的讓 欄寬 和 列高 變得有點太大,
最後,還是要做事後美化處理...
...(恕刪)

資料量比起網原始碼,小太多了,所以快

html=>可以換行有排版、csv=>純文字檔
所以同網站、同資料,匯入excel結果會不一樣

最麻煩的主程式我處理好了,剩下的美觀、排版,大概不會太為難他們
希望那些copy的,不要太恨我阻止您修改範例

您71樓、75樓改好的,我有空再看看
會在不改變您的排版、輸入判斷方式的前提下,修改程式碼
重新上傳一份範例,讓您參考一下我的寫法






師傅
我用你的WINHTTP的檔案測試了後
我之前說的,EXCEL無法關閉的問題
看起來似乎不是IE
WINHTTP居然也是一樣
檔案一寫入之後就不能關閉,必須再點選其他工作表

INPUTBOX的方法正常
因為我新增一個表單,一個工作表
加了這兩個東西
就會有這種寫入後無法關閉的問題
不知道是哪裡錯誤...
希望師傅有空過目指點,謝謝師傅



附加壓縮檔: 201705/mobile01-cf29ce0e7344f0b543828e81f3d05a39.zip
bioleon69 wrote:
INPUTBOX的方法正常
因為我新增一個表單,一個工作表...(恕刪)


我試不出問題…excel 2007
看了一下也許是表單active deactive 的問題
或是excel 版本的問題

請您把100%會出錯的“所有”執行步驟,照順序一步一步列出來
1.按了什麼
2.輸了了什麼
3.
4.
……

我再試看看您的檔案
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 157)

今日熱門文章 網友點擊推薦!