Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
GetObjectでExcelの起動が確認できない時があります。
投稿日時: 24/05/29 11:08:11
投稿者: hareru

GetObjectでExcelが起動しているか判定していますが、
EXCELが起動していない時にErr.NUmber=0が返却されてしまい、起動済みと判断されてします。
(この時、Windowsタスクマネージャで起動済みアプリを確認してもExcelは起動していません)
以下の点で再現性を確認してみました。
@PC起動直後、Accessより当該実行フォームよりBookを2回連続で出力(正常に出力)、その後2つのBookを閉じて再度、フォームより実行すると出力しない。(Err.Number=0)
APC起動直後、登録済みExcelファイルを2本開いて、Accessより当該実行フォームよりBookを2回連続で出力(正常に出力)、その後すべてのBookを閉じて再度、フォームより実行すると出力しない。(Err.Number=0)
なお、出力しない時にコードはそのまま最後まで正常に実行されてしまい、特にエラーにはなりません。
(M365に切り替えてから頻繁に発生してるかも知れません、その前のバージョンは2016を利用していましたが現在はそのバージョンが無い為に確認できません。)
ネットで検索しても同じ現象が発生している内容は見つけられませんでした。
どなたか対応方法等のアドバイスを頂けないでしょうか?
コードは以下です。
    Set Rst1 = New ADODB.Recordset
    Rst1.Open pStrSql, YojCn, adOpenForwardOnly, adLockReadOnly
    If Rst1.EOF = False Then
 
        'Dim xlApp As Excel.Application
        Dim xlApp As Object
        Dim wkb As Excel.Workbook
        Dim wks As Excel.Worksheet
 
        On Error Resume Next
        Set xlApp = GetObject(, "Excel.application")
        If Err.Number <> 0 Then 'Excelが起動していない時
            Err.Clear
             
            '起動済Excelが無い時新規作成
            Set xlApp = CreateObject("Excel.Application")
             
        End If
    ・
    ・
    ・

回答
投稿日時: 24/05/29 14:20:35
投稿者: Suzu

引用:
EXCELが起動していない

 
これはどうやって確認しましたか?
タスクマネージャーで確認しましたか?
 
 
 
 
引用:
出力しない時にコードはそのまま最後まで正常に実行されてしまい、特にエラーにはなりません。

On Error Resume Next は 有効にしてあるのでは?
であれば、エラーになっても、そのまま 最後まで継続されて当然です。
 
今回の様に、エラー発生有無により分岐を行う場合
エラー判定分岐 の後には、
 
On Error GoTo 0 で、 Resume Next を解除します。
 
 
原因と思われる事。
記載していない コード内に不適切な記述があり
 
操作している Excel Appplication の他に
新たに別の非表示の Excel Application を生成してしまい
GetObject で その新たな Application を 参照している 事が考えられます。

回答
投稿日時: 24/05/29 15:38:09
投稿者: sk

引用:
Err.Number

上記の式をウォッチ式として追加し、
 
引用:
If Err.Number <> 0 Then

更に上記のステートメントをブレークポイントに設定した状態で
そのプロシージャを実行されたのだとして、実行ステップが
ブレークポイントに到達してコードの実行が一時停止された時点での
Err.Number プロパティの値が 0 になっていることを
ウォッチウィンドウから確認し、
 
引用:
この時、Windowsタスクマネージャで起動済みアプリを確認してもExcelは起動していません

コードの実行が停止されたままの状態でタスクマネージャーを開いてみたが、
Excel のアプリもバックグラウンドプロセスも見つからない、
という意味でおっしゃっているのでしょうか。

投稿日時: 24/05/29 17:00:40
投稿者: hareru

これはどうやって確認しましたか?
タスクマネージャーで確認しましたか?
 
→タスクマネージャで確認しましたが、バックグラウンドは確認しませんでした。
 バックグラウンドではExcelが起動されていました。
 
 
On Error Resume Next は 有効にしてあるのでは?
であれば、エラーになっても、そのまま 最後まで継続されて当然です。
 
今回の様に、エラー発生有無により分岐を行う場合
エラー判定分岐 の後には、
 
On Error GoTo 0 で、 Resume Next を解除します。
 
 
原因と思われる事。
記載していない コード内に不適切な記述があり
 
操作している Excel Appplication の他に
新たに別の非表示の Excel Application を生成してしまい
GetObject で その新たな Application を 参照している 事が考えられます。[/quote]
→まさに、ご指摘の通りでした。
 Resume Nextを解除したらエラー個所が分かり解決いたしました。
  具体的にはRecordsetを2回Closeしていました。
 
ありがとうございました。

投稿日時: 24/05/29 17:02:56
投稿者: hareru

sk さんの引用:
引用:
Err.Number

上記の式をウォッチ式として追加し、
 
引用:
If Err.Number <> 0 Then

更に上記のステートメントをブレークポイントに設定した状態で
そのプロシージャを実行されたのだとして、実行ステップが
ブレークポイントに到達してコードの実行が一時停止された時点での
Err.Number プロパティの値が 0 になっていることを
ウォッチウィンドウから確認し、
 
引用:
この時、Windowsタスクマネージャで起動済みアプリを確認してもExcelは起動していません

コードの実行が停止されたままの状態でタスクマネージャーを開いてみたが、
Excel のアプリもバックグラウンドプロセスも見つからない、
という意味でおっしゃっているのでしょうか。

 
→バックグラウンドは未確認でした。
 確認したら起動していました。
 原因は、Resume Nextを解除後、エラー個所を修正することによって解決いたしました。
 
ありがとうございました。