想順便問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
本來想重寫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 來避免出錯
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
關閉廣告