返回列表 上一主題 發帖

使用VBA抓取網頁資料,大約不到200頁就會當掉,求解

使用VBA抓取網頁資料,大約不到200頁就會當掉,求解

各位大大,小弟我目前遇到一個自己能力無法解出的問題,還望各位大大知道怎麼解決的告知小弟,感謝您。
目前要抓取某家公司放在網路上的零件資料,大約4萬多頁,只要跑大約200左右就會當機,不知道是什麼問題,小弟有放上程式,還請各位大大協助,感謝您。

抓網頁資料程式_W.zip (101.26 KB)

程式檔案

clio

回復 1# clio

Sub 巨集1()
    Cells.Clear
SURL = "URL;http://www.passivecomponent.com/asp/search_chip.aspx?page2"
Set myQT = ActiveSheet.QueryTables.Add(Connection:=SURL, Destination:=Range("$A$1"))
    With myQT
        .WebFormatting = xlWebFormattingNone
        .Refresh BackgroundQuery:=False
        .Delete
    End With

SET MYQT=NOTHING
End Sub

頁數自己換

TOP

回復 2# joey0415
HI Joey0415,
測試過,這樣更早就當掉了說…
clio

TOP

回復 3# clio
沒有別的網址可下載嗎?
測到1500頁跑近10分鐘, 40377 頁要跑很久請自己測試
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Sh(1 To 2) As Worksheet, q As QueryTable, i  As Long, Rng As Range
  4.     Dim xTime As Date
  5.     With ThisWorkbook
  6.         Set Sh(1) = .Sheets(1)
  7.         Set Sh(2) = .Sheets(2)  '**.Sheets("工作表3")
  8.     End With
  9.     With Sh(1)
  10.        '****這段是要刪除工作表1上有太多的 QueryTable  (會當可能是在這)****   
  11.         For Each q In .QueryTables
  12.             q.Delete
  13.         Next
  14.         '****這段是要刪除工作表1上QueryTable的名稱
  15.         For i = .Names.Count To 1 Step -1
  16.             .Names.Item(i).Delete
  17.         Next
  18.         '**設定你的外部查詢在固定的QueryTable上
  19.         If .QueryTables.Count > 0 Then
  20.             Set q = .QueryTables(1)
  21.         Else
  22.             Set q = .QueryTables.Add(Connection:="URL;http://www.passivecomponent.com/asp/search_chip.aspx?page=1" _
  23.                         , Destination:=.[A1])
  24.         End If
  25.     End With
  26.     xTime = Time
  27.     Application.ScreenUpdating = False
  28.     For i = 1 To 40377
  29.         With q
  30.             .Connection = "URL;http://www.passivecomponent.com/asp/search_chip.aspx?page=" & i
  31.             .WebFormatting = xlNone
  32.             .RefreshStyle = xlInsertDeleteCells
  33.             .AdjustColumnWidth = True
  34.             .Refresh BackgroundQuery:=False
  35.             DoEvents
  36.             Set Rng = .ResultRange '**外部查詢的資料區
  37.             If i = 1 Then
  38.                 Sh(2).UsedRange.Clear
  39.                 Sh(2).Range("A1").Resize(Rng.Rows.Count, Rng.Columns.Count) = Rng.Value
  40.             Else
  41.                 Sh(2).Range("A" & Sh(2).Cells(Rows.Count, 1).End(xlUp).Row + 1).Resize(Rng.Rows.Count, Rng.Columns.Count) = Rng.Offset(1).Value
  42.             End If
  43.         End With
  44.         Application.StatusBar = "下載開始: " & xTime & " 共 " & i & " 頁 ok " & Application.Text(Time - xTime, ["m分s秒"])
  45.     Next
  46.     Application.ScreenUpdating = True
  47.     MsgBox Application.Text(Time - xTime, ["m分s秒"]) & "   Finish"
  48. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 3# clio

我也測試過哦!三分鐘下載300頁沒有問題
很順

TOP

回復 5# joey0415
Hi Joey0415,
能否也把您的完整程式,讓我來研究一下,看是差別在那邊,為什麼我的會當掉,若是方便的話,感謝您。
clio

TOP

回復 4# GBKEE
感謝GBKEE,
拜讀了您的程式,我大約知道我卡在那個地方了,而且妳的撰寫方式,讓我受用很多,太感謝您了
我大約知道該該表單的QueryTables太多了,有五百多個,難怪會卡住,所以我了解要把QueryTales砍掉的原因了
但是為什麼會有這樣多的Names,而且把這些Names砍掉的好處是,什麼,這點我不太清楚,能否請GBKEE幫我解說一下呢?
感謝您
clio

TOP

本帖最後由 GBKEE 於 2018-10-9 12:56 編輯

回復 7# clio
檔案瘦身
QueryTable ,Name太多檔案會虛胖,你一直的存檔動作,會喘死.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 8# GBKEE
了解了,感謝GBKEE,所以把所有的QueryTable刪掉,只留下一個,並利用迴圈改變q的connection值,就不會讓QueryTable的數量一直增加,這樣也不會像我原來的程式一樣,因為QueryTable超過一定的數量,造成當掉,這樣我就全理解了,感謝您的耐心解說
clio

TOP

        靜思自在 : 【生命在呼吸間】佛陀說:「生命在呼吸間。」人無法管住自己的生命,更無法擋住死期,讓自己永住人間。既然生命去來這麼無常,我們更應該好好地愛惜它、利用它、充實它,讓這無常、寶貴的生命,散發它真善美的光輝,映照出生命真正的價值。
返回列表 上一主題