2017-07-19 70 views
1

年底退出IE我實現了多種功能依賴於從下載一些網站的一些信息。在VBA函數

這樣的功能的最簡單的例子是:

Public Function getSomething(webAddress As String) 
    Dim html As HTMLObjectElement 
    Set html = getWebContents(webAddress) 
    Set elems = html.body.getElementsByTagName(tagName) 
    ... 
End Function 

從網站上獲取的數據的功能是:

Public Function getWebContents(webAddress As String) As HTMLObjectElement 
    Dim ie As InternetExplorer 
    Dim html As HTMLDocument 
    Set ie = New InternetExplorer 
    ie.Visible = False 
    ie.Navigate webAddress 
    Do While ie.READYSTATE <> READYSTATE_COMPLETE 
     Application.StatusBar = "Trying ..." 
     DoEvents 
    Loop 

    Set getWebContents = ie.Document 

    'close down IE and reset status bar 
    'ie.Quit 
    Set ie = Nothing 
    Application.StatusBar = "" 
End Function 

的問題是,它似乎是我所需要的線ie.Quit要取消註釋以關閉IE實例。但是,當我取消註釋ie.Quit行

Set elems = html.body.getElementsByTagName(tagName) 

生成錯誤。

看來,我不能用HTMLObjectElement通過函數返回getWebContents當IE已經辭去。如何處理?我可以實現一個try ... finally塊在getSomething函數中,並打開ie,並在finally塊中關閉。然而,我有許多類似的功能,並做出許多類似的嘗試......終於塊似乎是一個愚蠢的想法。

有什麼想法? 謝謝!

回答

1

您應該定義一個過程來處理對象的生命週期從創建到銷燬訪問。然後可以將該對象的引用傳遞給該函數。

最後,你甚至可以如果在任何STANGE發生錯誤處理的對象。

Public Sub Main() 
    On Error GoTo ErrProc 

    Dim ie As InternetExplorer 
    Set ie = New InternetExplorer 

    '.... 

    Dim obj As Object 
     obj = getWebContents(ie, "url") 

Leave: 
    ie.Quit 
    Set ie = Nothing 
    Set obj = Nothing 
    Application.StatusBar = "" 
    On Error GoTo 0 
    Exit Sub 

ErrProc: 
    MsgBox Err.Description, vbCritical 
    Resume Leave 
End Sub 


Public Function getWebContents(ie As InternetExplorer, webAddress As String) As HTMLObjectElement 
    '... 
End Function 
+0

好的,這是否意味着我需要在每個函數中初始化(和退出)getSomething我在Excel表中使用? – Gandalf

+0

是的,但在上面的例子中,爲了使函數正常工作,IE對象必須保留在內存中,因此您無法控制'ie.Quit'。 –

+0

謝謝!看來VBA並不是一個非常靈活的工具。 – Gandalf

1

你保持一個指針在html變量的DOM。如果你關閉IE,你指向的東西不存在。 簡單的答案是在getSomething結束時關閉IE。在你的情況,這意味着你必須調整你的代碼,使你的IE變量是從其他地方比getWebContents