標題: [發問] 程式執行速度越來越慢 [打印本頁]
作者: bulletin 時間: 2014-2-5 19:12 標題: 程式執行速度越來越慢
本帖最後由 bulletin 於 2014-2-5 19:14 編輯
各位前輩好
小弟初學,還不知道要怎麼處理資料庫
因此寫了一個程式抓取券商已整理好的財報
程式可以執行
但是發現幾個問題
1. 若沒有另存新檔,資料可抓取,但是隨著時間過去,excel會越變越慢, 從每筆約1秒慢慢變成1分鐘....
請問這有什麼好方法可以改善嗎?
先把財報抓下來之後再做資料篩選並另存是否是較好的選擇?
註:沒存新檔就是程式最下方的這幾行刪除
Sheets(Array("CFSQ", "ISQ", "BSQ")).Copy
ActiveWorkbook.SaveAs Filename:= _
"C:\Users\user\Documents\KT\投資理財\Excel分析模組\" & stockid & "季報.xlsx", FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False
Application.DisplayAlerts = True
Windows(stockid & "季報.xlsx").Close
2. 有另存新檔的程式如下, 平均每筆都需花費1~2分鐘才能完成
請問程式碼有什麼地方可以改善嗎?
還是這樣抓取資料天生就註定速度會隨著記憶體空間佔據而逐漸變慢?
有請各位前輩協助
作者: GBKEE 時間: 2014-2-5 20:11
回復 1# bulletin
工作表一直的 QueryTables.Add 新增Web查詢,檔案越來越龐大,拖慢程式的速度- Option Explicit
- Sub DELETE_QueryTables() '僅須執行一次清除所有QueryTable
- Dim SH As Worksheet, Q As QueryTable
- For Each SH In Sheets '活頁簿的工作表集合物件
- For Each Q In SH.QueryTables
- Names(Q.Name).Delete '刪除 定義名稱
- Q.Delete '刪除 QueryTable
- Next
- Next
- End Sub
- Sub Ex()
- Dim stockid
- stockid = 2303
- With Sheets("CFSQ")
- .Rows("1:64").ClearContents
- If .QueryTables.Count > 1 Then
- .QueryTables(1).Connection = "URL;http://dj.mybank.com.tw/z/zc/zc3/zc3_" & stockid & ".djhtm"
- Else '沒有QueryTable時新增
- .QueryTables.Add Connection:="URL;http://dj.mybank.com.tw/z/zc/zc3/zc3_" & stockid & ".djhtm", Destination:=.Range("$A$1")
- End If
- With .QueryTables(1) '不再新增
- .AdjustColumnWidth = True
- .RefreshPeriod = 0
- .WebSelectionType = xlSpecifiedTables
- .WebFormatting = xlWebFormattingNone
- .WebTables = "3"
- .WebPreFormattedTextToColumns = True
- .WebConsecutiveDelimitersAsOne = True
- .Refresh BackgroundQuery:=False
- End With
- End With
- End Sub
複製代碼
作者: bulletin 時間: 2014-2-5 22:57
回復 2# GBKEE
多謝GBKEE版主回復
我的程式放在附件中
請問您回覆的內容該怎麼使用...
我還不會使用module
直接放到一個新的檔案中執行也發生問題
不知道該如何使用它
很抱歉造成您的困擾~
作者: GBKEE 時間: 2014-2-6 06:36
本帖最後由 GBKEE 於 2014-2-6 06:43 編輯
回復 3# bulletin
Sub DELETE_QueryTables() 複製在何模組上,執行一次可清除所有工作表上QueryTable- Option Explicit
- Private Sub CommandButton1_Click()
- Dim StartTime, LastRow
- StartTime = Timer
- Application.ScreenUpdating = False
- LastRow = Sheets("sheet1").Range("A2").End(xlDown).Row '找出最後一筆資料
- For i = 1 To LastRow
- Dim stockid
- stockid = Range("A" & i).Value
- Application.Wait Now + TimeValue("00:00:01")
- With Sheets("CFSQ")
- .Rows("1:64").ClearContents
- '******************************
- If .QueryTables.Count > 1 Then
- .QueryTables(1).Connection = "URL;http://dj.mybank.com.tw/z/zc/zc3/zc3_" & stockid & ".djhtm"
- Else '沒有QueryTable時新增
- .QueryTables.Add Connection:="URL;http://dj.mybank.com.tw/z/zc/zc3/zc3_" & stockid & ".djhtm", Destination:=.Range("$A$1")
- End If
- With .QueryTables(1) '不再新增
- .AdjustColumnWidth = True
- .RefreshPeriod = 0
- .WebSelectionType = xlSpecifiedTables
- .WebFormatting = xlWebFormattingNone
- .WebTables = "3"
- .WebPreFormattedTextToColumns = True
- .WebConsecutiveDelimitersAsOne = True
- .Refresh BackgroundQuery:=False
- End With
- '******************************
- End With
-
- With Sheets("ISQ")
- .Rows("1:64").ClearContents
- '套上修改 .QueryTables(1).Connection =??? .QueryTables.Add Connection=???
- End With
-
- With Sheets("BSQ")
- .Rows("1:64").ClearContents
- '套上修改 .QueryTables(1).Connection =??? .QueryTables.Add Connection=???
- '.WebTables = """oMainTable""" 須修改
- End With
- End With
- '程式碼
- '
- '
- Next
- End Sub
複製代碼
作者: bulletin 時間: 2014-2-6 11:52
回復 4# GBKEE
GBKEE版主您好
我加入您修改的程式,詳如附件
測試之後發現幾個問題
1. 尚未呼叫Delete_QueryTables前,速度差異甚大
不另存新檔:99筆資料共112秒
另存新檔:第1筆就花了121秒...
可見拖累速度是另存新檔的原因,請問有何解決之道?
2. 呼叫Delete_QueryTables,發生錯誤1004
錯誤內容如下圖
[attach]17438[/attach]
我發現錯誤內容是Q.name的地方成為"zc3_2002.djhtm_231"
不懂為何後面會多了_231這幾個字
[attach]17437[/attach]- Private Sub CommandButton1_Click()
- Dim StartTime
- StartTime = Timer
- Application.ScreenUpdating = False
- LastRow = Sheets("sheet1").Range("A2").End(xlDown).Row '找出最後一筆資料
- For i = 2 To LastRow
-
- Dim stockid
- stockid = Range("A" & i).Value
-
- Application.Wait Now + TimeValue("00:00:01")
- With Sheets("CFSQ")
- '.Rows("1:64").ClearContents
- '******************************
- If .QueryTables.Count > 1 Then
- .QueryTables(1).Connection = "URL;http://dj.mybank.com.tw/z/zc/zc3/zc3_" & stockid & ".djhtm"
- Else '沒有QueryTable時新增
- .QueryTables.Add Connection:="URL;http://dj.mybank.com.tw/z/zc/zc3/zc3_" & stockid & ".djhtm", Destination:=.Range("$A$1")
- End If
- With .QueryTables(1) '不再新增
- .AdjustColumnWidth = True
- .RefreshPeriod = 0
- .WebSelectionType = xlSpecifiedTables
- .WebFormatting = xlWebFormattingNone
- .WebTables = "3"
- .WebPreFormattedTextToColumns = True
- .WebConsecutiveDelimitersAsOne = True
- .Refresh BackgroundQuery:=False
- End With
- '******************************
- End With
-
- With Sheets("ISQ")
- '.Rows("1:64").ClearContents
- '******************************
- If .QueryTables.Count > 1 Then
- .QueryTables(1).Connection = "URL;http://dj.mybank.com.tw/z/zc/zcq/zcq_" & stockid & ".asp.htm"
- Else '沒有QueryTable時新增
- .QueryTables.Add Connection:="URL;http://dj.mybank.com.tw/z/zc/zcq/zcq_" & stockid & ".asp.htm", Destination:=.Range("$A$1")
- End If
- With .QueryTables(1) '不再新增
- .AdjustColumnWidth = True
- .RefreshPeriod = 0
- .WebSelectionType = xlSpecifiedTables
- .WebFormatting = xlWebFormattingNone
- .WebTables = "3"
- .WebPreFormattedTextToColumns = True
- .WebConsecutiveDelimitersAsOne = True
- .Refresh BackgroundQuery:=False
- End With
- '******************************
- End With
-
- With Sheets("BSQ")
- '.Rows("1:64").ClearContents
- '******************************
- If .QueryTables.Count > 1 Then
- .QueryTables(1).Connection = "URL;http://dj.mybank.com.tw/z/zc/zcp/zcpa/zcpa_" & stockid & ".asp.htm"
- Else '沒有QueryTable時新增
- .QueryTables.Add Connection:="URL;http://dj.mybank.com.tw/z/zc/zcp/zcpa/zcpa_" & stockid & ".asp.htm", Destination:=.Range("$A$1")
- End If
- With .QueryTables(1) '不再新增
- .AdjustColumnWidth = True
- .RefreshPeriod = 0
- .WebSelectionType = xlSpecifiedTables
- .WebFormatting = xlWebFormattingNone
- .WebTables = "3"
- .WebPreFormattedTextToColumns = True
- .WebConsecutiveDelimitersAsOne = True
- .Refresh BackgroundQuery:=False
- End With
- '******************************
- End With
-
- Application.DisplayAlerts = False '存檔時直接覆蓋原有檔案
-
- Sheets(Array("CFSQ", "ISQ", "BSQ")).Copy
- ActiveWorkbook.SaveAs Filename:= _
- "C:\Users\user\Desktop\Test\" & stockid & "季報.xlsx", FileFormat:= _
- xlOpenXMLWorkbook, CreateBackup:=False
- Windows(stockid & "季報.xlsx").Close
-
- Application.DisplayAlerts = True
-
- DELETE_QueryTables
-
- Next i
- Application.ScreenUpdating = True
- EndTime = Timer
- MsgBox "本次下載共花費:" & EndTime - StartTime & "秒"
-
-
- End Sub
複製代碼 3. 程式碼加入之後,BSQ這個sheet內容會變成空白
另存新檔時,有的檔案有內容,有的檔案沒內容,這是什麼原因造成的?
4. Delete_Querytables在每一次迴圈執行完畢後呼叫對嗎?
謝謝版主回覆~
作者: GBKEE 時間: 2014-2-6 13:03
本帖最後由 GBKEE 於 2014-2-6 13:17 編輯
回復 5# bulletin
另存新檔時,有的檔案有內容,有的檔案沒內容,會是網頁上那檔股票沒有資料?
你附檔存檔的速度沒有你說的慢.- Sub DELETE_QueryTables() '僅須執行一次清除所有QueryTable
- Dim SH As Worksheet, Q As Variant
- For Each Q In Names
- Q.Delete
- Next
- For Each SH In Sheets '活頁簿的工作表集合物件
- For Each Q In SH.QueryTables
- Q.Delete
- Next
- Next
- End Sub
複製代碼- Private Sub CommandButton1_Click()
- Dim StartTime
- DELETE_QueryTables '**建議先清除***
- StartTime = Timer
- Application.ScreenUpdating = False
- LastRow = Sheets("sheet1").Range("A2").End(xlDown).Row '找出最後一筆資料
複製代碼
作者: bulletin 時間: 2014-2-6 13:48
報告GBKEE版主
也許可能是我的電腦環境問題造成速度變慢....
那請教問題2, 3的問題的原因為何?
2.呼叫Delete_Querytables時,發生1004錯誤
3.BSQ工作表空白問題
謝謝您~
作者: GBKEE 時間: 2014-2-6 14:20
回復 7# bulletin
2.呼叫Delete_Querytables時,發生1004錯誤
因執行太多次的- With .QueryTables.Add(Connection:=
複製代碼 造成許多Name的位置都相同,導致第1版的Sub DELETE_QueryTables()的錯誤
所以改用 第2版的Sub DELETE_QueryTables()的程式碼
[attach]17439[/attach]
3.BSQ工作表空白問題, 可查是哪一檔股票看網頁是否也無資料
作者: bulletin 時間: 2014-2-6 18:25
回報GBKEE版主
空白資料的網頁我都有確認過,實際上都有資料
目前暫未出現 若有其他問題再跟您請教
謝謝
速度的問題我再找找看原因
上個星期一開始寫出來的時候很快,一分鐘約存10個檔,隨檔案增加而時間暴增
不知為何現在每次執行都要1~2分鐘
有可能是虛擬記憶體沒被釋放嗎
好怪
作者: bulletin 時間: 2014-2-7 10:31
報告一下結果
昨天把電腦還原到前一次備份
速度就恢復正常了
謝謝GBKEE版主~~
作者: bulletin 時間: 2014-2-7 11:27
回復 10# bulletin
請教GBKEE版主
我發現執行時
每100~200筆就會發生1004錯誤
這是因為用到大量的COPY 導致記憶體出錯嗎?
將程式改寫,將資料抓取到名為temp的工作表,依序另存到新檔
是否可以改善?
或是有可能是其他原因所造成?
作者: Hsieh 時間: 2014-2-7 14:22
回復 10# bulletin
web查詢跟你網路連線速度有關
當主機伺服器接受太多連線或是主機端有流量管制
對同一IP的流量進行管控時
可能就無法取得資料
作者: bulletin 時間: 2014-2-7 17:43
回復 12# Hsieh
我也想過是流量管制的問題
多謝說明
無論如何來改寫成temp好了
當做練習也好
到時再請各位前輩指教
作者: bulletin 時間: 2014-2-7 21:02
回復 13# bulletin
各位前輩
我又修改了一個,這次直接先開啟新的活頁簿
並將資料直接存入活頁簿中
1. 先抓資料,再複製另存新檔
100筆 --> 102秒
200筆 --> 210秒
2. 先建立新檔再抓資料存檔
100筆 --> 100秒
200筆 --> 206秒
似乎少了複製另存速度稍稍快一點
但是考量網路穩定性以及網站存取的問題
應該是沒有差
此外仍然有錯誤1004的問題, 所以沒辦法測試500筆以上或是所有上市櫃公司1400檔的速度...
錯誤會發生在複製網頁資料,存到工作表中時
不一定會在何時發生
但原則上仍留在100~200筆之間會發生
我再把延遲時間拉長,看能不能避免錯誤1004
謝謝各位前輩指教~
作者: heavenweaver 時間: 2014-3-2 15:31
回復 14# bulletin
我抓台灣50,花了約56秒。
With wbnew.Sheets(1) 'CFSQ
'.Rows("1:64").ClearContents
'******************************
If .QueryTables.Count > 1 Then
.QueryTables(1).Connection = "URL;http://dj.mybank.com.tw/z/zc/zc3/zc3_" & stockid & ".djhtm"
Else '沒有QueryTable時新增
.QueryTables.Add Connection:="URL;http://dj.mybank.com.tw/z/zc/zc3/zc3_" & stockid & ".djhtm", Destination:=.Range("$A$1")
End If
With .QueryTables(1) '不再新增
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "3"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.Refresh BackgroundQuery:=False
End With
'******************************
End With
With wbnew.Sheets(2)
'.Rows("1:64").ClearContents
'******************************
If .QueryTables.Count > 1 Then
.QueryTables(1).Connection = "URL;http://dj.mybank.com.tw/z/zc/zcq/zcq_" & stockid & ".asp.htm"
Else '沒有QueryTable時新增
.QueryTables.Add Connection:="URL;http://dj.mybank.com.tw/z/zc/zcq/zcq_" & stockid & ".asp.htm", Destination:=.Range("$A$1")
End If
With .QueryTables(1) '不再新增
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "3"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.Refresh BackgroundQuery:=False
End With
'******************************
End With
With wbnew.Sheets(3)
'.Rows("1:64").ClearContents
'******************************
If .QueryTables.Count > 1 Then
.QueryTables(1).Connection = "URL;http://dj.mybank.com.tw/z/zc/zcp/zcpa/zcpa_" & stockid & ".asp.htm"
Else '沒有QueryTable時新增
.QueryTables.Add Connection:="URL;http://dj.mybank.com.tw/z/zc/zcp/zcpa/zcpa_" & stockid & ".asp.htm", Destination:=.Range("$A$1")
End If
With .QueryTables(1) '不再新增
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "3"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.Refresh BackgroundQuery:=False
End With
'******************************
End With
作者: heavenweaver 時間: 2014-3-2 20:55
回復 14# bulletin
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/) |
|