問題描述

這是一個爬蟲程式,開啟的網頁是一個表格,透過ExcelWB提供的API功能select all與copy,再貼到Excel的Sheet上。
不過有的時候會發生在程式碼21行的地方出現「x80040100 存取被拒」的訊息。

解決

原因

從官方的文件的錯誤訊息看來「Trying to revoke a drop target that has not been registered」,研判是VBA在呼叫
兩個IE的API間有著未被撤銷的物件導致在copy網頁時發生問題。猜測由VBA呼叫這兩個API時為獨立的,所以可能因為select all尚未執行完,
而又要執行copy的動作時拋出異常

處理

程式第41行透過VBA提供的Application.Wait API等待5秒鐘,再執行就沒有問題了

程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Sub test()

Dim IE As InternetExplorer
Dim doc As HTMLDocument
Dim URL As String

URL = "http://mops.twse.com.tw/mops/web/ajax_t51sb01?step=1&firstin=1&TYPEK=sii"

Set IE = CreateObject("InternetExplorer.Application")

Sheets(1).Cells.ClearContents

With IE
.Visible = True
.navigate URL

Do While IE.readyState <> READYSTATE_COMPLETE Or IE.Busy: DoEvents: Loop

.ExecWB 17, 2
'Application.Wait (Now + TimeValue("00:00:05"))
.ExecWB 12, 2
Sheets(1).Select
Range("A1").Activate
ActiveSheet.PasteSpecial Format:="HTML", _
link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
End With

IE.Quit

MsgBox "Job Close"

End Sub

reference