- PR -

Excel.ApplicationのActivePrinterによるプリンタの変更に関して

1
投稿者投稿内容
豊樹
会議室デビュー日: 2005/06/01
投稿数: 6
投稿日時: 2005-11-25 14:26
はじめまして。吉田と申します。
windowsXP + VisualStudio2003(VB)で開発を行っています。
処理としては

1.エクセルファイル読み込み
2.プリンタの変更
3.印刷

としたいのですがプリンタの変更のところでエラーが出てしまいます。

ロジック
Dim ExcelObj As Excel.Application
ExcelObj = CType(CreateObject("Excel.Application"), Excel.Application)
Dim MyDoc = "D:\test.xls" ' PDF化したいファイル
ExcelObj.Workbooks.Open(MyDoc)
ExcelObj.Visible = False

Dim s As String = ExcelObj.ActivePrinter 'デフォルトプリンタ
ExcelObj.ActivePrinter = s

エラーメッセージ
'System.Runtime.InteropServices.COMException' のハンドルされて
いない例外が databind.exe で発生しました。
追加情報 : HRESULT からの例外です : 0x800A03EC。

また同じようなロジックですが

ロジック
Dim ExcelObj As Object
ExcelObj = CreateObject("Excel.Application")
Dim MyDoc = "D:\test.xls" ' PDF化したいファイル
ExcelObj.Workbooks.Open(MyDoc)
ExcelObj.Visible = False

Dim s As String = ExcelObj.ActivePrinter 'デフォルトプリンタ
ExcelObj.ActivePrinter = s

エラーメッセージ
'System.Runtime.InteropServices.COMException' のハンドルされていない
 例外が microsoft.visualbasic.dll で発生しました。
追加情報 : Application クラスの ActivePrinter プロパティを設定できません。

となってしまいます。
何か原因は考えられないでしょうか?

申し訳ありませんがよろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-25 14:34
引用:

豊樹さんの書き込み (2005-11-25 14:26) より:

Dim ExcelObj As Excel.Application
ExcelObj = CType(CreateObject("Excel.Application"), Excel.Application)
Dim MyDoc = "D:\test.xls" ' PDF化したいファイル
ExcelObj.Workbooks.Open(MyDoc)
ExcelObj.Visible = False

  1. New でインスタンス化し、コンパイル解決しましょう。
  2. MyDoc は System.String 型にすべきですよね。
  3. Workbooks の参照を取っていないので解放するタイミングがありません。
以下のリンクを参考にしてください。

  COM オブジェクトを解放する

引用:

Dim s As String = ExcelObj.ActivePrinter 'デフォルトプリンタ
ExcelObj.ActivePrinter = s


ところで、例外は 1 行目で起きるのでしょうか?

引用:

また同じようなロジックですが

Dim ExcelObj As Object
ExcelObj = CreateObject("Excel.Application")


やっていることは同じで、遅延バインディングになっているだけですね。
事前バインディングの方が望ましいでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
豊樹
会議室デビュー日: 2005/06/01
投稿数: 6
投稿日時: 2005-11-25 14:50
お返事ありがとうございます。

コーディングの仕方も注意したいと思います。
参考になりました。ありがとうございます。

ちなみにエラーは

ExcelObj.ActivePrinter = s

のところで発生しています。

以上です。よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-25 15:02
引用:

豊樹さんの書き込み (2005-11-25 14:50) より:

コーディングの仕方も注意したいと思います。
参考になりました。ありがとうございます。


ちょっと言い方が柔らかすぎましたが、
しっかりと解放しておかないと、Excel のプロセスが居座り続けます。
(メモリ リークを起こします)

引用:

ちなみにエラーは

ExcelObj.ActivePrinter = s

のところで発生しています。


Excel.Application.ActivePrinter だけでなく、
Printout メソッドの ActivePrinter 引数でも例外が発生しますか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-11-25 15:24
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13815&forum=7&3
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-25 15:36
引用:

todoさんの書き込み (2005-11-25 15:24) より:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13815&forum=7&3


こっちでも良いですね。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25519&forum=7

コード:

    Private Shared Sub OneMethod()
        Dim xlApp As Excel.Application

        Try
            xlApp = New Excel.Application()
            xlApp.DisplayAlerts = False
            xlApp.Visible = True

            Dim xlBooks As Excel.Workbooks = xlApp.Workbooks

            Try
                Dim xlBook As Excel.Workbook = xlBooks.Open("C:\Hoge.xls")

                Try
                    Dim xlSheets As Excel.Sheets = xlBook.Sheets

                    Try
                        Dim xlSheet As Excel.Worksheet = DirectCast(xlSheets(1), Excel.Worksheet)

                        Try
                            xlSheet.PrintOut(ActivePrinter:="ココにプリンタ名")
                        Finally
                            If Not xlSheet Is Nothing Then
                                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
                            End If
                        End Try
                    Finally
                        If Not xlSheets Is Nothing Then
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
                        End If
                    End Try
                Finally
                    If Not xlBook Is Nothing Then
                        Try
                            xlBook.Close()
                        Finally
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
                        End Try
                    End If
                End Try
            Finally
                If Not xlBooks Is Nothing Then
                    Try
                        xlBooks.Close()
                    Finally
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
                    End Try
                End If
            End Try
        Finally
            If Not xlApp Is Nothing Then
                Try
                    xlApp.Quit()
                Finally
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
                End Try
            End If
        End Try
    End Sub


本来、プリンタ名は直接指定せず、

 System.Drawing.Printing.PrinterSettings.InstalledPrinters

から取得した方が良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
豊樹
会議室デビュー日: 2005/06/01
投稿数: 6
投稿日時: 2005-11-25 15:55
>しっかりと解放しておかないと、Excel のプロセスが居座り続けます。

確かに居続けていました^^;

Printout メソッドの ActivePrinter 引数で試してみたところ解決する
ことができました。

本当にありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)