O001 オブジェクト変数が設定されていません

LotusScript® のクラスまたは製品のクラスのインスタンスにアクセスしようとしましたが、次のいずれかの原因でエラーが起こりました。

通常、問題を引き起こす変数は、「.」に先行する変数です。例えば、このエラーが次の行で発生したとします。

Set doc = view.GetDocumentByKey(keys(0))

この場合の問題は、view 変数の値が Nothing になることです。問題の原因であるコーディングエラーは、おそらくこの行にはありません。エラーは、この行に到達する前に、変数の割り当てに失敗したか、または変数の値を確認できなかったことにあります。 その理由としては、変数の割り当てが行われていないこと、名前にミススペルがあること、あるいは変数に値 Nothing が割り当てられたことが考えられます。例えば、次のステートメントで変数が前もって割り当てられるとします。

Set view = db.GetView("lkByDocID")

lkByDocID という名前のビューが存在しない場合、この時点ではエラーは発生しませんが、view 変数には値 Nothing が割り当てられます。これが理由で、後で式 view.anything を使用するときに、エラーが発生することになります。

この問題を回避するには、以下のようにします。

すべてのスクリプトで、Option Declare を使用します。 これにより、コンパイル時に変数名のミススペルがキャッチされるため、大幅な時間の節約になります。

オブジェクト変数を使用する前に、Is Nothing を使用してオブジェクト変数が有効な値を持つかどうかをテストします。

または、On Error を使用してエラーをトラップし、修正操作を行います (あるいは、少なくとも詳細なエラーメッセージを出力します)。

オブジェクト変数が削除される箇所に留意して、削除されるオブジェクト変数に依存する可能性のあるオブジェクトについて考慮してください。

意外なことに、サブルーチンによって返されるオブジェクトが、サブルーチンの終了時にスコープ外になる別の変数に依存している場合にも、このエラーが発生する可能性があります。以下の例を検討してください。

Function GetKeywordView( ) As NotesView
	Dim db As New NotesDatabase("Annie", "bigdeal¥keywords.nsf")
	Set GetLookupView = db.GetView("AllKeywords")
	If GetLookupView Is Nothing Then
		Error ERR_KW_VIEWMISSING, "View AllKeywords was not found!"
	End If
End Function

一見したところ、このルーチンはビューが見つかったかどうかをテストし、見つからない場合はエラーをスローするため、安全なように見えます。 けれども、この関数を呼び出して関数の値を使用しようとすると、関数が Nothing を返すことが分かります。

Set keyView = GetKeywordView()
Set keyDoc = keyView.GetDocumentByKey("Departments") ' Object variable not set error here.

この時点で keyView の値が Nothing になる理由が分かりますか? その答えは、NotesView オブジェクトは親 NotesDatabase オブジェクトがなければ存在できないためです。GetKeywordView 関数の終了時に、スタックが解放されることから変数 db は自動的に削除されます。db が削除されると、db から作成されたすべてのオブジェクト (NotesView、NotesDocument、NotesACLEntry など) も同じく削除されます。

これを防ぐには、呼び出し側で db を宣言するか、db をグローバル変数または静的変数にします。

関連項目:

ランタイムエラーメッセージ

Option Declare ステートメント

Is 演算子

On Error ステートメント

Delete ステートメント