標題:
[發問]
跑到一半會卡住~~
[打印本頁]
作者:
power82843
時間:
2016-12-1 23:06
標題:
跑到一半會卡住~~
本帖最後由 power82843 於 2016-12-1 23:09 編輯
[attach]25990[/attach]各位先進小弟這個程式跑到一半就會卡住,可否幫我看看問題出在哪,感謝!
作者:
GBKEE
時間:
2016-12-2 07:18
本帖最後由 GBKEE 於 2016-12-2 07:19 編輯
回復
1#
power82843
是這裡卡住嗎?
Option Explicit
Sub 股利股息()
Dim Sh As Worksheet, i As Integer
On Error Resume Next '不理會程式上的錯誤,程式繼續執行下去
Set Sh = Sheets("股利股息") '沒有 Sheets("股利股息")時有程式上的錯誤]
On Error GoTo 0 '程式停止處理錯誤,程式執行上有錯誤發生會終止.
If Sh Is Nothing Then '沒有 Sheets("股利股息")時 Sh Is Nothing
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "股利股息"
Set Sh = Sheets("股利股息")
End If
With Sh ' Worksheets("股利股息").Select
.UsedRange.Clear
.Range("A1").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
.Range("B1").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
.Range("B2").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
End With
For i = 10 To Sheets("個股資料").Range("B10").End(xlDown).Row
Sh.Cells(Rows.Count, 2).End(xlUp).Offset(1, -1).Resize(11) = Worksheets("個股資料").Range("C" & i).Value ' '將A欄位填入股票名稱,連續填寫11列
With Sh.QueryTables.Add(Connection:= _
"URL;https://tw.stock.yahoo.com/d/s/dividend_" & Sheets("個股資料").Range("B" & i) & ".html", Destination:=Sh.Cells(Rows.Count, 2).End(xlUp).Offset(1))
.Name = "0000000"
複製代碼
作者:
power82843
時間:
2016-12-2 08:28
GBKEE 大大 抱歉沒有說清楚,是下面這一段程式,一開始可以跑得蠻順的,可是跑個80~200筆後就會卡住不跑,指標呈現等待的圖案。
Sub ROE()
For i = 10 To Sheets("個股資料").Range("B281").End(xlDown).Row
Worksheets("ROE總表").Range("B1").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
Worksheets("ROE").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://stockchannelnew.sinotrade.com.tw/z/zc/zcr/zcra/zcra_" & Sheets("個股資料").Range("B" & i) & ".djhtm", Destination:=Range("B1"))
.Name = "0000000"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "1"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
Range("C1:C500").Find("股東權益報酬率").Select
Range(Selection, Selection.End(xlToRight)).Copy
Worksheets("ROE總表").Select
Worksheets("ROE總表").Range("B1").Select
ActiveCell.End(xlDown).Select
lastrow = ActiveCell.Row
ActiveSheet.Paste Destination:=Worksheets("ROE總表").Range("b" & lastrow + 1)
Worksheets("ROE總表").Range("A" & lastrow + 1).Value = Worksheets("個股資料").Range("C" & i).Value
Worksheets("ROE").Select
Worksheets("ROE").Range("B1").Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Delete
Next
End Sub
複製代碼
作者:
GBKEE
時間:
2016-12-3 09:44
回復
3#
power82843
卡在那裡?
For i = 10 To Sheets("個股資料").Range("B281").End(xlDown).Row
Worksheets("ROE總表").Range("B1").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
Worksheets("ROE總表").Range("B2:J2") = Array("期別", "104", "103", "102", "101", "100", "99", "98", "97")
'是少了這裡嗎?
複製代碼
作者:
准提部林
時間:
2016-12-3 11:23
本帖最後由 准提部林 於 2016-12-3 11:26 編輯
Sub ROE_1()
[ROE總表!B1].Value = String(52, "+")
For i = 10 To [個股資料!B281].End(xlDown).Row
With Sheets("ROE").QueryTables.Add(Connection:= _
"URL;http://stockchannelnew.sinotrade.com.tw/z/zc/zcr/zcra/zcra_" & _
[個股資料!B1].Cells(i, 1) & ".djhtm", Destination:=[ROE!B1])
.Name = ""
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "1"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
.Delete
End With
Dim xF As Range, xE As Range
Set xF = [ROE!C1:C500].Find("股東權益報酬率")
If Not xF Is Nothing Then
Set xE = [ROE總表!B1].End(xlDown)(2)
xE.Select
Range(xF, xF.End(xlToRight)).Copy xE
xE(1, 0) = Sheets("個股資料").Range("C" & i)
End If
Sheets("ROE").UsedRange.Clear
Next
End Sub
複製代碼
作者:
power82843
時間:
2016-12-3 12:16
GBKEE 您好!
就像下方畫面,跑了100多筆之後就一直卡在這個畫面。
[attach]26011[/attach]
作者:
power82843
時間:
2016-12-3 12:18
回復
5#
准提部林
准提部林 大大
您的程式跑起來快很多,但是還是會卡住,如下畫面,可以再幫忙看是什麼問題嗎?感謝!
[attach]26012[/attach]
作者:
power82843
時間:
2016-12-3 12:19
回復
4#
GBKEE
GBKEE 您好!
就像下方畫面,跑了100多筆之後就一直卡在這個畫面。
[attach]26013[/attach]
作者:
jackyq
時間:
2016-12-3 13:28
your ip is locked ..........
作者:
准提部林
時間:
2016-12-3 14:09
回復
7#
power82843
有無跳出錯誤視窗, 及錯誤行的位置,
大部份網頁為防止短時間多次的存取, 會鎖住您的ip, 所以無法完成全部匯入!
作者:
GBKEE
時間:
2016-12-3 16:56
本帖最後由 GBKEE 於 2016-12-3 17:02 編輯
回復
8#
power82843
3708 上緯投控 沒有資料
Range("C1:C500").Find("股東權益報酬率").Select
複製代碼
卡在這裡是嗎?
試試看
Option Explicit
Sub Ex_ROE()
Dim Sh(1 To 3) As Worksheet, Rng As Range, i As Integer
Set Sh(1) = Sheets("個股資料")
Set Sh(2) = Worksheets("ROE總表")
Set Sh(3) = Worksheets("ROE")
'***執行本程式碼一次後,可刪除掉兩行星號間的程式碼**
'*************************************
'刪除 ROE 頁上QueryTables及 QueryTables.Add所新增的名稱
'QueryTable過多,名稱過多也是檔案膨大的原因之ㄧ
With Sh(3)
For i = .Names.Count To 1 Step -1
.Names(i).Delete
Next
.UsedRange.Clear
For i = .QueryTables.Count To 1 Step -1
.QueryTables(i).Delete
Next
End With
'******************************
With Sh(2)
.UsedRange.Clear
.Range("B1") = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
.Range("B2:J2") = Array("期別", "104", "103", "102", "101", "100", "99", "98", "97")
.Activate
End With
For i = 10 To Sh(1).Range("B281").End(xlDown).Row
If Sh(1).Range("B" & i) <> "" Then '非空白儲存格
With Sh(3).QueryTables.Add(Connection:= _
"URL;http://stockchannelnew.sinotrade.com.tw/z/zc/zcr/zcra/zcra_" & Sh(1).Range("B" & i) & ".djhtm", Destination:=Sh(3).Range("B1"))
'.Name = "0000000" '名稱以數字開頭,會自動加上"_" 為 "_0000000"
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "1"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
With Sh(3).QueryTables(1)
Application.StatusBar = i - 9 & " - " & .ResultRange.Range("b2") & " 股東權益報酬率 完成"
If .ResultRange.Rows.Count > 5 Then
Sh(2).Range("b1").End(xlDown).Offset(1, -1).Resize(, .ResultRange.Columns.Count) = .ResultRange.Rows(16).Value
Sh(2).Range("b1").End(xlDown).Offset(, -1) = Sh(1).Range("C" & i)
Sh(2).Range("b1").End(xlDown).Offset(, -1).Activate
Else
Sh(2).Range("b1").End(xlDown).Offset(1) = "查無 " & .ResultRange.Range("b2") & " 財務比率表資料(合併年表)"
End If
.ResultRange.Clear '清除匯入外部的資料
Sh(3).Names(.Name).Delete '刪除自動新增的名稱
.Delete '刪除 QueryTable 物件
End With
End If
Next
End Sub
複製代碼
作者:
准提部林
時間:
2016-12-3 18:39
執行了三次, 都可以順利跑完:
[attach]26018[/attach]
作者:
jackyq
時間:
2016-12-3 18:45
本帖最後由 jackyq 於 2016-12-3 18:55 編輯
發現是 QueryTables 積累太多的關係
加上這個就好了
For Each QQ In Worksheets("ROE").QueryTables
QQ.Delete
Next
我看准提部林已經幫你加上 delete
結果還會卡
才會以為是不是被鎖IP
結果加上 delay 後就可以跑完
才會以為真的被鎖 IP
結論: 不砍 QueryTables 用 delay 後就可以跑, 當然比較慢
作者:
power82843
時間:
2016-12-3 19:36
回復
10#
准提部林
請問遇到這樣的情況要如何避免?
作者:
准提部林
時間:
2016-12-3 21:34
回復
14#
power82843
被鎖住ip, 應會出現錯誤視窗, 而且也應無法再執行, 除非清除所有的瀏覽歷程及cookie(依以前抓奇摩知識+經驗),
如果是沒有跑完到工作表的最後一筆資料, 應是 End(xlDown)的問題, 遇到空白格就停頓, 改用End(xlUp)即可,
以目前的資枓, End(xlDown) , 第368列[2301 光寶科]就是最後一筆!
For i = 10 To
[個股資料!B1].Cells(Rows.Count, 1).End(xlUp).Row
則可以跑到第890列!!!
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)