「リモートサーバがないか、使用できる状況ではありません」の対処法

中級VBA

はじめに

 この実行時エラーは、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 は最後に呼び出された所に戻ります。
 外部のソフトウエアを扱うような処理では、相手先がどのように動作しているのかを見つけるのは困難になります。

タイトルとURLをコピーしました