2017-01-11 6 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」オブジェクトにアクセスするには、tyringのエラーをキャッチします。 'Boolean'を返す' 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

hmmですが、ワークブックでは、「Dim x As Workbook」を実行して何もチェックしないと、決して実行されません。インスタンスを作成して値を設定しない方法は「Dim x As New Workbook」ですが、ブックを設定せずに使用しようとするたびに、spraion err:429が開始されるため、この場合は無意味です。 OverkillはNewキーワードとトラップエラー429で宣言することになります。 – cyboashu

+1

@mountainclimber私は、自分で作成したオブジェクトと比較して、 'Workbook'や' Worksheets'コレクションのような "system"オブジェクトを扱うときには、 'Is Nothing'チェックを使用できないことがその一例です。もう一つは、コレクションにアイテムが存在するかどうかをチェックするジェネリック関数を持っていて、理論的には 'コレクション'であるにもかかわらず、 'Worksheets'では動作しません。アプリケーションオブジェクトで行うことができるのは、試行錯誤で何が機能するかを確認することです。 :-( –

関連する問題