C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

COMオブジェクトで起動したExcelの印刷を行うと例外発生

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■100893 / inTopicNo.1)  COMオブジェクトで起動したExcelの印刷を行うと例外発生
  
□投稿者/ ジェイド (11回)-(2022/11/17(Thu) 14:40:06)

分類:[VB.NET/VB2005 以降] 

VisualStudio2019で開発しております。

以下のようなコードで、Excelを起動して終了するまで待っている処理を組んでおります。
----------------------------------------------------------------------------------------------
        Dim excelApp As New Excel.Application()
        Dim excelBook As Excel.Workbook

        'Excelを表示
        excelApp.Visible = True
        'Excelを開く
        excelBook = excelApp.Workbooks.Open("※ファイルのパス")

        '終了するまで繰り返す
        Do

            System.Threading.Thread.Sleep(250)

        Loop While excelApp.Visible = True

        '作成したCOMオブジェクトの開放
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excelBook)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
----------------------------------------------------------------------------------------------

この処理で、起動したExcelから印刷を行うと、
「呼び出し先が呼び出しを拒否しました。
 (HRESULT からの例外:0x80010001 (RPC_E_CALL_REJECTED))」
という例外メッセージが必ず出ます。

なお、印刷自体は行われるようです。

原因、対策をご存じの方はおられますでしょうか。
宜しくお願い致します。

引用返信 編集キー/
■100895 / inTopicNo.2)  Re[1]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ KOZ (355回)-(2022/11/18(Fri) 13:33:07)
No100893 (ジェイド さん) に返信
> 以下のようなコードで、Excelを起動して終了するまで待っている処理を組んでおります。

こんな感じでどうでしょう?

Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function GetWindowThreadProcessId(ByVal hwnd As IntPtr, _
                        ByRef lpdwProcessId As Integer) As Integer
    End Function


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim app As New Excel.Application
        Dim books As Excel.Workbooks = app.Workbooks
        Dim book As Excel.Workbook = books.Open("E:\TEST\test.xlsx")
        app.Visible = True

        Dim hwnd As IntPtr = New IntPtr(app.Hwnd)
        Dim pid As Integer
        Dim threadId As Integer = GetWindowThreadProcessId(hwnd, pid)
        Marshal.ReleaseComObject(book)
        Marshal.ReleaseComObject(books)
        Marshal.ReleaseComObject(app)

        Using p = Process.GetProcessById(pid)
            p.WaitForExit()
        End Using
        MessageBox.Show("EXCEL 終了!")
    End Sub

End Class


引用返信 編集キー/
■100896 / inTopicNo.3)  Re[1]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ kiku (308回)-(2022/11/18(Fri) 16:11:54)
No100893 (ジェイド さん) に返信

COMオブジェクトまったく使わなくなりますが
こちらではダメなのかなー。
※KOZさんの回答見て思いつきました。

        private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("開始");
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = @"C:\test.xlsx";
            p.Start();
            p.WaitForExit();
            Console.WriteLine("終了");
        }

引用返信 編集キー/
■100897 / inTopicNo.4)  Re[2]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ kiku (309回)-(2022/11/18(Fri) 16:17:01)
No100896 (kiku さん) に返信
> ■No100893 (ジェイド さん) に返信
>
> COMオブジェクトまったく使わなくなりますが
> こちらではダメなのかなー。
> ※KOZさんの回答見て思いつきました。

たぶん、COMオブジェクトにて、印刷開始とかの処理があるのかな。
却下で(笑

引用返信 編集キー/
■100898 / inTopicNo.5)  Re[3]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (12回)-(2022/11/18(Fri) 19:55:15)
KOZさん
kikuさん

すみません、遅くなりました。
今、検証中なのですがKOZさんの改修案で大丈夫そうに見えます!
もう少しテストを進めてみます。
ありがとうございました。

単純にプロセス起動にしていないのは
BOOKの共有をしている時に、Excelが起動直後、一旦落ちて新しいプロセスIDで起動し直すので
プロセスIDが取得出来ないという問題があり、COMオブジェクト起動に切り替えたという
経緯がありました。
引用返信 編集キー/
■100899 / inTopicNo.6)  Re[4]: COMオブジェクトで起動したExcelの印刷を行うと例外発生
□投稿者/ ジェイド (13回)-(2022/11/18(Fri) 20:12:13)
ありがとうございます!
大丈夫そうです。
助かりました!
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ