2017-01-11 48 views
-1

編輯:我真正的問題是如何測試是否設置了實例化的對象。我並不是真的想要「糾正」我的代碼。它只是一個例子。VBA:測試工作簿是否爲

我有一個返回工作簿的功能:

編輯:添加代碼

Sub GetWb() as Workbook 

Application.DisplayAlerts = False 
Application.EnableEvents = False 
On Error Resume Next 
Set wM = Application.Workbooks.Open("Z:\somepath.xlsm", ReadOnly:=True) 
Application.EnableEvents = True 
Application.DisplayAlerts = True 
On Error GoTo 0 

end sub 

在另一個子我要檢查,如果該對象是由功能正確設置。我通常不喜歡這樣使用對象一般爲:

dim w as Workbook 
set w = GetWb 
if w is nothing then 
debug.print "no workbook" 
else 
debug.print "workbook" 
end if 

然而,is nothing測試不工作,因爲對象實例化,但沒有設置所以它是什麼,不是什麼。

我已經使出這個醜陋的解決方案,工作正常:

dim w as Workbook 
set w = GetWb 
on error goto someerrorhandling 
if w.name = "" then 
end if 
on error goto 0 
'other code here 


someerrorhandling: 
msgbox "no workbook" 

換句話說,我檢查對象的屬性,迫使一個錯誤,還是不行。必須有更好/更清潔的方式。

我檢查這個環節說我這樣做的方式是最好的方法: VBA: Conditional - Is Nothing

+1

你能發表實際的代碼嗎? 'Sub GetWb()as Workbook'至少是一個語法錯誤,而''在這裏設置合適的工作簿的代碼'可能是問題所在。 – Comintern

+0

我認爲你的解決方案很接近 - 可能有更好的方法來編寫它,但這個想法是一樣的 - 在訪問「Workbook」對象時發現錯誤。只需將其包裝到一個返回「布爾」的「Function」中 - 並且您已經完成設置。 –

+0

我添加了代碼的功能。 – mountainclimber

回答

0

改變你的錯誤處理GetWB所以它沒有返回櫃面錯誤的,也可以使用函數而不是子。

Function GetWb() As Workbook 

    Application.DisplayAlerts = False 
    Application.EnableEvents = False 

    On Error GoTo errHandler: 

    Set GetWb = Application.Workbooks.Open("Z:\somepath.xlsm", ReadOnly:=True) 
    Application.EnableEvents = True 
    Application.DisplayAlerts = True 

errHandler: 
     If Err.Number <> 0 Then 
      Set GetWb = Nothing 
      Application.EnableEvents = True 
      Application.DisplayAlerts = True 
     End If 

End Function 
+0

雖然這將解決問題,但我真正的問題是如何測試是否設置了實例化的對象。我並不是真的想要「糾正」我的代碼。它只是一個例子。我收集到的是沒有更好的方法,我應該按照自己的方式去做,或者像你在這裏陳述的那樣沒有回報。 – mountainclimber

+1

嗯,但與工作簿,它不會發生,如果你做'Dim x As Workbook',並沒有檢查它。只有創建實例並且不設置值的方法是「Dim x As New Workbook」,但這種情況是無用的,因爲每次嘗試使用它時都會開始spraion err:429而不設置任何工作簿。矯枉過正是用New關鍵字和陷阱錯誤429來聲明。 – cyboashu

+1

@mountainclimber我也注意到,當您使用「Workbook」和「Worksheets」集合等「系統」對象與自己創建的對象相比時,會有不同。無法使用'Is Nothing'檢查就是一個例子。另一個是 - 我有泛型函數來檢查項目是否存在於集合中,並且它不適用於「工作表」,儘管理論上它是一個「集合」(文檔說明)。你可以用應用程序對象做的所有事情都是試錯,看看有什麼作用。 :-( –

相關問題