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

謝謝snare 大大教學
我來試試看
謝謝Activer 大的資料。

想順便問Sanre 大,

在A ctiver 大的資料裡,
有三組程式,其中getxml_clip 與 getxml_tbl ,
當我同時多開了一個excel 檔案,
此時,getxml_clip 依舊可以正常執行抓取資料(0.2秒內),
但getxml_tbl 則會受到干擾(6 ~ 1x 秒),
而我將我的excel 檔案關閉後,則兩者均可在0.2秒內抓完資料。
初步判斷是因為我的excel 檔案裡面的儲存格有交叉的運算,
例如 : e30 = (A1:A30)/30 ,F......之類
當把彼此交叉的運算儲存格移除,則getxml_tbl可正常使用(抓完掉回0.2秒內)。
當採用getxml_tbl 的方式,不曉得要如何避免這類問題。

Thank.

cji3cj6xu6 wrote:
初步判斷是因為我的excel 檔案裡面的儲存格有交叉的運算,
例如 : e30 = (A1:A30)/30 ,F......之類
當把彼此交叉的運算儲存格移除,則getxml_tbl可正常使用(抓完掉回0.2秒內)。
當採用getxml_tbl 的方式,不曉得要如何避免這類問題。...(恕刪)


那個是逐格寫入的方式

一、先關閉自動重算,再跑程式
Application.Calculation = xlManual
程式碼
Application.Calculation = xlAutomatic

二、換計算方式

三、抓下來先放陣列,vba計算後再放入儲存格,不要用函數計算
可參考 1樓、45樓、71樓、107樓……等等很多樓


以下這3篇微軟的文章可以看一下,內有很多範例,對改善速度的方式,有詳細的介紹
您會發現有些用不同的方式計算速度可以差到500倍

Excel 效能:改善計算效能
https://docs.microsoft.com/zh-tw/office/vba/excel/concepts/excel-performance/excel-improving-calcuation-performance

Excel 效能: 最佳化效能阻礙的秘訣
https://docs.microsoft.com/zh-tw/office/vba/excel/concepts/excel-performance/excel-tips-for-optimizing-performance-obstructions

Excel 效能:效能與限制改善
https://docs.microsoft.com/zh-tw/office/vba/excel/concepts/excel-performance/excel-performance-and-limit-improvements
謝謝Snare大的說明,消化去囉~~
這是示範如何用vba點選308樓main.html中的圖表選單




本來想重寫308樓的範例把iframe加上名稱,不過想想還是算了,主要是我懶,用編號比較快
main.html這個vba產生網頁中,是用iframe(html語法)插入另外10個網頁(範例中5個股票、10個圖表)



其中5個圖表有下拉式選單,預設是日線、成交量
但是main.html只是整合網頁用的,資料並沒有下載,圖表還是線上的,只是在同一個畫面
所以要改變選單,需使用ie object


'=============================
'使用方法,選一個副程式,代替308樓打開網頁的那一行程式
'=============================


'方法1
'=============================
Sub test()

Dim ie As Object, i As Integer

Set ie = CreateObject("InternetExplorer.Application")

With ie
.Visible = True
.navigate ThisWorkbook.Path & "\main.html"

Do Until .readyState = 4: DoEvents: Loop
Do While .Busy: DoEvents: Loop
'如果activex有設定好,msgbox可以取消不使用
' MsgBox "注意:請先設定activex控制項的安全等級" & vbNewLine & _
"或手動點選允許被封鎖的內容"


For i = 0 To .document.frames.Length - 1 Step 2

.document.frames.Item(i).document.all("TAChartPeriod").Value = "30m"
'5m、10m、30m、d、w、m
.document.frames.Item(i).document.all("TAChartIndex").Value = "KD"
'VOL、KD、MACD、RSI、BIAS、WR、BS、CDP、DMI

Next i



.Refresh

End With


'ie.Quit
Set ie = Nothing

End Sub

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

'方法2
'=============================
Sub test1()

Dim ie As Object, DOM_event As Object, i As Integer

Set ie = CreateObject("InternetExplorer.Application")

With ie
.Visible = True
.navigate ThisWorkbook.Path & "\main.html"

Do Until .readyState = 4: DoEvents: Loop
Do While .Busy: DoEvents: Loop

Set DOM_event = .document.createEvent("HTMLEvents")
DOM_event.initEvent "change", True, False


' MsgBox "注意:請先設定activex控制項的安全等級" & vbNewLine & _
"或手動點選允許被封鎖的內容"


For i = 0 To .document.frames.Length - 1 Step 2


'.document.frames.Item(i).document.getElementById("TAChartPeriod").Focus
.document.frames.Item(i).document.getElementById("TAChartPeriod").selectedindex = 2
.document.frames.Item(i).document.getElementById("TAChartPeriod").dispatchEvent DOM_event

'.document.getElementById("TAChartIndex").Focus
.document.frames.Item(i).document.getElementById("TAChartIndex").selectedindex = 1
.document.frames.Item(i).document.getElementById("TAChartIndex").dispatchEvent DOM_event

Next i

'注意:使用方法2,如果activex沒有設定好,msgbox 會讓.dispatchEvent DOM_event 失效
'圖表不會更新,需啟用下面這行 .refresh
'有興趣的可以先刪掉msgbox,用f8逐行執行,測試.dispatchEvent的功能

'.Refresh
End With


'ie.Quit
Set ie = Nothing
Set DOM_event = Nothing

End Sub
'=============================


另外要注意,activex控制項的安全等級,要先設定好,不然圖表打不開,程式就會中斷
怎麼設定請google,不想設定就每次手動點選


考慮了一下,還是把設定方式貼出來,google 對少部份人來說,還是太難了




另外,如果出現以下這個畫面,代表記憶體中的ie還沒完全關掉
多等一下再執行程式就可以了
或是回頭找找以前的範例,自行加入on error 來避免出錯

感謝snare 大大的教學

又多學了些
大大您好,感謝您的說明,我的問題如下:
1. 我進入程式原始碼後,不知道要在哪邊輸入資料才能進行table查詢,不知可否請大大解惑一下><



2. 暫存資料的部分如圖,如果把註記拿掉執行就會產生錯誤,所以不理解為什麼



最後感謝大大耐心回復小弟的蠢問題><
water-仔 wrote:
1. 我進入程式原始碼後,不知道要在哪邊輸入資料才能進行table查詢
...(恕刪)


網頁原始碼,看不懂的話
就從 0 開始試,0 1 2 3 4 5 ... ...


water-仔 wrote:
2. 暫存資料的部分如圖,如果把註記拿掉執行就會產生錯誤,所以不理解為什麼...(恕刪)



21樓程式碼,只是很基本的語法,不會有相容性的問題(xp 不一定(440樓))

錯誤會停在send那一行,
可能是網站無回應、被擋ip、網址打錯 ?
裝2套以上的防毒?
xml 服務被關掉?
用優化軟體改了系統?
Microsoft XML library 壞掉?

不好意思,我也不知道為什麼,猜測是系統的問題

剛剛試的




系統正常的情況下
Msxml2.XMLHTTP
WinHttp.WinHttpRequest.5.1
這2個服務在vba不需要任何設定,一定可以用




試試下面程式碼,看看出現什麼?
'======================

Sub Test()

Dim xmlTest, xml, error
xmlTest = Array("Microsoft.XMLHTTP", "Msxml2.XMLHTTP", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.7.0", "Microsoft.XMLHTTP.6.0", "WinHttp.WinHttpRequest.5.1")


For Each xml In xmlTest
Dim check
On Error Resume Next
Set check = CreateObject(xml)
If Err.Number = 0 Then
error = TypeName(check)
Else
error = Err.Description
End If
On Error GoTo 0
Debug.Print xml & ":" & error
Next

End Sub


'======================
請問各位先進~有誰可以幫幫我,

關於三大法人日報的下載問題,

本來一直都OK,突然就不行用了..

有誰可以幫我看看下方是借用某位大大寫的程式碼,

感激不盡!

GetDate 為 108/04/24


Sub get_stock(ByVal GetDate As String, selectType As String)
Sheet3.Select
Cells.Delete

Dim url As String

url = "http://www.twse.com.tw/fund/T86?date=" & GetDate & "&response=html&selectType=" & selectType & "&_=" & Timer()

With ActiveSheet.QueryTables.Add(Connection:= _
"URL;" & url, Destination:=Range("$A$1"))
.Refresh BackgroundQuery:=False
End With


End Sub



momolittle wrote:
有誰可以幫我看看下方是借用某位大大寫的程式碼,...(恕刪)


某位大大寫的,問某位大大就好

電腦 or 網路問題,我試正常的


或參考107樓、200樓xmlhttp方式,再自行改寫
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 144)

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