はじめに
この実行時エラーは、OutlookやAccessなどの外部のソフトをExcelで利用しようとする時などに発生する事が多いようです。
特徴として1回目はエラーが出ず、2回目にプログラムを実行した際に発生します。
オブジェクトの参照を解除していないのが原因かと思いきや、
Set myObject = Nothing
などと参照を解除してもエラーは一向に改善されませんでした。
結果としてプロシージャの最後に End 関数を実行する事でエラーはでなくなりました。
エラーの再現
以下のプログラムは、Outlookの受信トレイにある最初のメールアイテムを表示してくれます。
最後の End が無いと、1回目はエラーが出ませんが、2回目に「リモートサーバがないか、使用できる状況ではありません」というエラーが発生します。
Sub メールアイテムを表示()
Dim myNamespace As Outlook.Namespace
Set myNamespace = Outlook.Application.GetNamespace("MAPI")
Dim myFolder As Outlook.Folder
Set myFolder = myNamespace.GetDefaultFolder(olFolderInbox)
Dim olItem As Outlook.MailItem
Set olItem = myNamespace.GetItemFromID(myFolder.Items(1).EntryID)
olItem.Display
Set myNamespace = Nothing
End
End Sub
エラーは、以下の所で発生しています。
Set myNamespace = Outlook.Application.GetNamespace(“MAPI”)
ただ、オブジェクトの参照を解除しても状況は変わりませんでした。
Set myNamespace = Nothing 残念ながら効果なし
結果的に最後に End 関数を実行することで、オブジェクトが全てクリアされエラーは発生しなくなりました。
End関数
あるプロシージャを実行し最後まで行くと、呼び出し元に戻ります。以下の testCode() では、testEnd() を呼び出しています。通常なら、testEnd() を終えたあと、testCodeに戻ってきますが End があるため、そこで処理が終了し testCode に戻ることはなく、Debug.Print “testCode” は実行されません。
Sub testCode()
Call testCode()
Debug.Print "testCode"
End Sub
Sub testEnd()
Debug.Print "testEnd"
End
End Sub
まとめ
今回のエラーに関して詳しい理由を突き止める事ができませんでしたが、結果的に End 関数で対処できました。
End関数は、プログラムの実行を終了させますが普段このような関数を実行する事はありません。
プログラムを終了させるために Exit Sub を使用する事は多いと思いますが、プロシージャの最後の End Sub は最後に呼び出された所に戻ります。
外部のソフトウエアを扱うような処理では、相手先がどのように動作しているのかを見つけるのは困難になります。