Board logo

標題: [發問] 跑到一半會卡住~~ [打印本頁]

作者: 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

是這裡卡住嗎?
  1. Option Explicit
  2. Sub 股利股息()
  3.     Dim Sh As Worksheet, i As Integer
  4.     On Error Resume Next                  '不理會程式上的錯誤,程式繼續執行下去
  5.     Set Sh = Sheets("股利股息")        '沒有 Sheets("股利股息")時有程式上的錯誤]
  6.     On Error GoTo 0                           '程式停止處理錯誤,程式執行上有錯誤發生會終止.
  7.     If Sh Is Nothing Then                   '沒有 Sheets("股利股息")時 Sh Is Nothing
  8.         Sheets.Add after:=Sheets(Sheets.Count)
  9.         Sheets(Sheets.Count).Name = "股利股息"
  10.         Set Sh = Sheets("股利股息")
  11.     End If
  12.     With Sh ' Worksheets("股利股息").Select
  13.         .UsedRange.Clear
  14.         .Range("A1").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
  15.         .Range("B1").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
  16.         .Range("B2").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
  17.     End With
  18. For i = 10 To Sheets("個股資料").Range("B10").End(xlDown).Row
  19.      Sh.Cells(Rows.Count, 2).End(xlUp).Offset(1, -1).Resize(11) = Worksheets("個股資料").Range("C" & i).Value ' '將A欄位填入股票名稱,連續填寫11列
  20.     With Sh.QueryTables.Add(Connection:= _
  21.         "URL;https://tw.stock.yahoo.com/d/s/dividend_" & Sheets("個股資料").Range("B" & i) & ".html", Destination:=Sh.Cells(Rows.Count, 2).End(xlUp).Offset(1))
  22.         .Name = "0000000"
複製代碼

作者: power82843    時間: 2016-12-2 08:28

GBKEE 大大 抱歉沒有說清楚,是下面這一段程式,一開始可以跑得蠻順的,可是跑個80~200筆後就會卡住不跑,指標呈現等待的圖案。
  1. Sub ROE()

  2. For i = 10 To Sheets("個股資料").Range("B281").End(xlDown).Row
  3. Worksheets("ROE總表").Range("B1").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
  4. Worksheets("ROE").Select
  5.     With ActiveSheet.QueryTables.Add(Connection:= _
  6.         "URL;http://stockchannelnew.sinotrade.com.tw/z/zc/zcr/zcra/zcra_" & Sheets("個股資料").Range("B" & i) & ".djhtm", Destination:=Range("B1"))
  7.         .Name = "0000000"
  8.         .FieldNames = True
  9.         .RowNumbers = False
  10.         .FillAdjacentFormulas = False
  11.         .PreserveFormatting = True
  12.         .RefreshOnFileOpen = False
  13.         .BackgroundQuery = True
  14.         .RefreshStyle = xlInsertDeleteCells
  15.         .SavePassword = False
  16.         .SaveData = True
  17.         .AdjustColumnWidth = True
  18.         .RefreshPeriod = 0
  19.         .WebSelectionType = xlSpecifiedTables
  20.         .WebFormatting = xlWebFormattingNone
  21.         .WebTables = "1"
  22.         .WebPreFormattedTextToColumns = True
  23.         .WebConsecutiveDelimitersAsOne = True
  24.         .WebSingleBlockTextImport = False
  25.         .WebDisableDateRecognition = False
  26.         .WebDisableRedirections = False
  27.         .Refresh BackgroundQuery:=False
  28.     End With
  29.    
  30.     Range("C1:C500").Find("股東權益報酬率").Select
  31.     Range(Selection, Selection.End(xlToRight)).Copy
  32.     Worksheets("ROE總表").Select
  33.     Worksheets("ROE總表").Range("B1").Select
  34.     ActiveCell.End(xlDown).Select
  35.     lastrow = ActiveCell.Row
  36.     ActiveSheet.Paste Destination:=Worksheets("ROE總表").Range("b" & lastrow + 1)
  37.     Worksheets("ROE總表").Range("A" & lastrow + 1).Value = Worksheets("個股資料").Range("C" & i).Value
  38.     Worksheets("ROE").Select
  39.     Worksheets("ROE").Range("B1").Select
  40.     Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Delete

  41. Next

  42. End Sub
複製代碼

作者: GBKEE    時間: 2016-12-3 09:44

回復 3# power82843

卡在那裡?
  1. For i = 10 To Sheets("個股資料").Range("B281").End(xlDown).Row
  2.     Worksheets("ROE總表").Range("B1").Value = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
  3.     Worksheets("ROE總表").Range("B2:J2") = Array("期別", "104", "103", "102", "101", "100", "99", "98", "97")
  4.     '是少了這裡嗎?   
複製代碼

作者: 准提部林    時間: 2016-12-3 11:23

本帖最後由 准提部林 於 2016-12-3 11:26 編輯
  1. Sub ROE_1()
  2. [ROE總表!B1].Value = String(52, "+")
  3. For i = 10 To [個股資料!B281].End(xlDown).Row
  4.     With Sheets("ROE").QueryTables.Add(Connection:= _
  5.         "URL;http://stockchannelnew.sinotrade.com.tw/z/zc/zcr/zcra/zcra_" & _
  6.         [個股資料!B1].Cells(i, 1) & ".djhtm", Destination:=[ROE!B1])
  7.         .Name = ""
  8.         .FieldNames = True
  9.         .RowNumbers = False
  10.         .FillAdjacentFormulas = False
  11.         .PreserveFormatting = True
  12.         .RefreshOnFileOpen = False
  13.         .BackgroundQuery = True
  14.         .RefreshStyle = xlInsertDeleteCells
  15.         .SavePassword = False
  16.         .SaveData = True
  17.         .AdjustColumnWidth = True
  18.         .RefreshPeriod = 0
  19.         .WebSelectionType = xlSpecifiedTables
  20.         .WebFormatting = xlWebFormattingNone
  21.         .WebTables = "1"
  22.         .WebPreFormattedTextToColumns = True
  23.         .WebConsecutiveDelimitersAsOne = True
  24.         .WebSingleBlockTextImport = False
  25.         .WebDisableDateRecognition = False
  26.         .WebDisableRedirections = False
  27.         .Refresh BackgroundQuery:=False
  28.         .Delete
  29.     End With
  30.    
  31.     Dim xF As Range, xE As Range
  32.     Set xF = [ROE!C1:C500].Find("股東權益報酬率")
  33.     If Not xF Is Nothing Then
  34.        Set xE = [ROE總表!B1].End(xlDown)(2)
  35.        xE.Select
  36.        Range(xF, xF.End(xlToRight)).Copy xE
  37.        xE(1, 0) = Sheets("個股資料").Range("C" & i)
  38.     End If
  39.     Sheets("ROE").UsedRange.Clear
  40. Next
  41. 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 上緯投控  沒有資料
  1. Range("C1:C500").Find("股東權益報酬率").Select
複製代碼
卡在這裡是嗎?
試試看
  1. Option Explicit
  2. Sub Ex_ROE()
  3.     Dim Sh(1 To 3) As Worksheet, Rng As Range, i As Integer
  4.     Set Sh(1) = Sheets("個股資料")
  5.     Set Sh(2) = Worksheets("ROE總表")
  6.     Set Sh(3) = Worksheets("ROE")
  7.    
  8.     '***執行本程式碼一次後,可刪除掉兩行星號間的程式碼**
  9.     '*************************************
  10.     '刪除 ROE 頁上QueryTables及 QueryTables.Add所新增的名稱
  11.     'QueryTable過多,名稱過多也是檔案膨大的原因之ㄧ
  12.     With Sh(3)
  13.         For i = .Names.Count To 1 Step -1
  14.             .Names(i).Delete
  15.         Next
  16.         .UsedRange.Clear
  17.         For i = .QueryTables.Count To 1 Step -1
  18.           .QueryTables(i).Delete
  19.        Next
  20.     End With
  21.     '******************************
  22.     With Sh(2)
  23.         .UsedRange.Clear
  24.         .Range("B1") = "++++++++++++++++++++++++++++++++++++++++++++++++++++"
  25.         .Range("B2:J2") = Array("期別", "104", "103", "102", "101", "100", "99", "98", "97")
  26.         .Activate
  27.     End With
  28.     For i = 10 To Sh(1).Range("B281").End(xlDown).Row
  29.         If Sh(1).Range("B" & i) <> "" Then   '非空白儲存格
  30.             With Sh(3).QueryTables.Add(Connection:= _
  31.                 "URL;http://stockchannelnew.sinotrade.com.tw/z/zc/zcr/zcra/zcra_" & Sh(1).Range("B" & i) & ".djhtm", Destination:=Sh(3).Range("B1"))
  32.                 '.Name = "0000000"  '名稱以數字開頭,會自動加上"_" 為 "_0000000"
  33.                 .WebSelectionType = xlSpecifiedTables
  34.                 .WebFormatting = xlWebFormattingNone
  35.                 .WebTables = "1"
  36.                 .WebPreFormattedTextToColumns = True
  37.                 .WebConsecutiveDelimitersAsOne = True
  38.                 .WebSingleBlockTextImport = False
  39.                 .WebDisableDateRecognition = False
  40.                 .WebDisableRedirections = False
  41.                 .Refresh BackgroundQuery:=False
  42.             End With
  43.             With Sh(3).QueryTables(1)
  44.                 Application.StatusBar = i - 9 & " - " & .ResultRange.Range("b2") & "   股東權益報酬率 完成"
  45.                 If .ResultRange.Rows.Count > 5 Then
  46.                     Sh(2).Range("b1").End(xlDown).Offset(1, -1).Resize(, .ResultRange.Columns.Count) = .ResultRange.Rows(16).Value
  47.                     Sh(2).Range("b1").End(xlDown).Offset(, -1) = Sh(1).Range("C" & i)
  48.                     Sh(2).Range("b1").End(xlDown).Offset(, -1).Activate
  49.                 Else
  50.                     Sh(2).Range("b1").End(xlDown).Offset(1) = "查無 " & .ResultRange.Range("b2") & " 財務比率表資料(合併年表)"
  51.                 End If
  52.                 .ResultRange.Clear                 '清除匯入外部的資料
  53.                 Sh(3).Names(.Name).Delete   '刪除自動新增的名稱
  54.                 .Delete                                    '刪除 QueryTable 物件
  55.             End With
  56.         End If
  57.     Next
  58. 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/)