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

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

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

Re[7]: プリントダイアログでプリンター設定しても変わらない


(過去ログ 15 を表示中)

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

■5087 / inTopicNo.1)  プリントダイアログでプリンター設定しても変わらない
  
□投稿者/ わかば (1回)-(2007/07/04(Wed) 10:22:19)

分類:[VB.NET (Windows)] 

はじめて質問させていただきます。

今、エクセルファイルを印刷するにあたって、プリントダイアログを
表示して、プリントダイアログの手動設定に従って、印刷したいと
思っています。

しかし、現状は、プリントダイアログでプリンターを変更しても
デフォルトプリンタで印刷されてしまいます。

プリントダイアログの手動設定に従って、印刷するにはどのように
すれば良いのでしょうか?

また、プリントダイアログを表示するとき、プリントダイアログを
画面の最前面に出すにはどのようにすれば良いのでしょうか?

以下は、素人ながら自分なりに記述したものです。

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook 
Dim xlSheet As Excel.Worksheet
Dim FilePass As String = "C:表.xls"

xlApp = CreateObject("Excel.Application")
xlBook = xlApp.Workbooks.Open(FilePass, 0)
xlSheet = xlBook.Worksheets(1)
xlApp.Visible = True

Dim PrintDialog1 As New PrintDialog

PrintDialog1.PrinterSettings = New System.Drawing.Printing.PrinterSettings

If PrintDialog1.ShowDialog() = DialogResult.OK Then
   xlSheet.PrintOut() 
End If

以上、お助けいただければ幸いです。


引用返信 編集キー/
■5091 / inTopicNo.2)  Re[1]: プリントダイアログでプリンター設定しても変わらない
□投稿者/ 魔界の仮面弁士 (326回)-(2007/07/04(Wed) 10:53:45)
No5087 (わかば さん) に返信
> しかし、現状は、プリントダイアログでプリンターを変更しても
> デフォルトプリンタで印刷されてしまいます。
.NET の PrintDialog ではなく、Excel 側の xlApp.ActivePrinter を使いましょう。
直接印刷なら、PrintOut メソッドの ActivePrinter 引数で。

> xlApp = CreateObject("Excel.Application")
> xlBook = xlApp.Workbooks.Open(FilePass, 0)
VB.NET で、このようなコードを書いてしまってはマズイかと。オブジェクト解放漏れの原因となりますよ。
引用返信 編集キー/
■5094 / inTopicNo.3)  Re[2]: プリントダイアログでプリンター設定しても変わらない
□投稿者/ わかば (2回)-(2007/07/04(Wed) 11:55:13)
No5091 (魔界の仮面弁士 さん) に返信
> ■No5087 (わかば さん) に返信

早々としたご回答、感謝いたします。

> .NET の PrintDialog ではなく、Excel 側の xlApp.ActivePrinter を使いましょう。
> 直接印刷なら、PrintOut メソッドの ActivePrinter 引数で。

xlApp.ActivePrinter = "プリンタ名"
でデフォルトプリンタから任意のプリンタにプリンタの設定を変更することができました。

しかし、今、思い描いているのは、ソースにプリンタを直接記述するのではなく、
あくまで印刷する人が任意(複数プリンタから選択)に設定したいのですが、やはり
ダイアログを利用するのは不可能なのでしょうか?


>>xlApp = CreateObject("Excel.Application")
>>xlBook = xlApp.Workbooks.Open(FilePass, 0)
> VB.NET で、このようなコードを書いてしまってはマズイかと。オブジェクト解放漏れの原因となりますよ。

前回の記述が中途半端でしたが、前述のソースコードの後に、

(前回の記述略)
xlApp.DisplayAlerts = False
xlSheet.SaveAs(FilePass)

xlApp.Quit()

'オブジェクトを解放します
xlSheet = Nothing
xlBook = Nothing 
xlApp = Nothing

と記述しております。これでも、やはり問題となってくるのでしょうか?

以上、重ね重ねの質問、大変恐縮ですが、よろしくお願いいたします。

引用返信 編集キー/
■5095 / inTopicNo.4)  Re[3]: プリントダイアログでプリンター設定しても変わらない
□投稿者/ ぽぴ王子 (235回)-(2007/07/04(Wed) 11:59:35)
ぽぴ王子 さんの Web サイト
No5094 (わかば さん) に返信

いつものコレを貼っておきますね。
http://jeanne.wankuma.com/tips/programing/releasecom.html

> 'オブジェクトを解放します
> xlSheet = Nothing
> xlBook = Nothing
> xlApp = Nothing

オブジェクトに Nothing を代入しても解放したことにはなりません。
(GC に対して明示的に使用していない旨を告知する効果はあると思いますが)

引用返信 編集キー/
■5096 / inTopicNo.5)  Re[3]: プリントダイアログでプリンター設定しても変わらない
□投稿者/ 魔界の仮面弁士 (327回)-(2007/07/04(Wed) 12:07:08)
No5094 (わかば さん) に返信
> しかし、今、思い描いているのは、ソースにプリンタを直接記述するのではなく、
> あくまで印刷する人が任意(複数プリンタから選択)に設定したいのですが、やはり
> ダイアログを利用するのは不可能なのでしょうか?
xlApp.Dialogs プロパティから、xlDialogPrinterSetup のダイアログを Show するとか。

> xlSheet = Nothing
> xlBook = Nothing
> xlApp = Nothing
> と記述しております。これでも、やはり問題となってくるのでしょうか?
問題となります。.NET のメモリ管理と、COM のメモリ管理は別物ですから。

Nothing 代入だけで解放されるのは、VB6 や VBScript などといった ActiveX ベースの言語の場合です。
VB.NET から ActiveX (COM) オブジェクトを解放するのであれば、Marshal.ReleaseComObject の呼び出しが必要です。
引用返信 編集キー/
■5111 / inTopicNo.6)  Re[4]: プリントダイアログでプリンター設定しても変わらない
□投稿者/ わかば (3回)-(2007/07/04(Wed) 17:03:11)
No5095 (ぽぴ王子 さん) に返信
■No5096 (魔界の仮面弁士 さん) に返信
> 
> いつものコレを貼っておきますね。
> http://jeanne.wankuma.com/tips/programing/releasecom.html
> 
ぽぴ王子 さん、魔界の仮面弁士 さん、ご回答ありがとうございます。

上記のURLを参考に記述しました。

Dim xlApp As Excel.Application

xlApp = CreateObject("Excel.Application")
  Try
    xlApp = New Excel.Application
    xlApp.DisplayAlerts = False
    Dim xlBooks As Excel.Workbooks = xlApp.Workbooks

    Try
     Dim xlBook As Excel.Workbook = xlBooks.Open(FilePass, 0)

      Try
        Dim xlSheets As Excel.Sheets = xlBook.Worksheets

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

          Try
            Dim xlCells As Excel.Range = xlSheet.Cells

            Try
              Dim xlRange As Excel.Range = DirectCast(xlCells(6, 4), Excel.Range)

              Try
                xlApp.Visible = True
                System.Threading.Thread.Sleep(1000)
                
                Dim PrintDialog1 As New PrintDialog
                PrintDialog1.PrinterSettings = New System.Drawing.Printing.PrinterSettings
                If PrintDialog1.ShowDialog() = DialogResult.OK Then
                  xlApp.ActivePrinter = "プリンタ名"
                  xlSheet.PrintOut()
                End If
                System.Threading.Thread.Sleep(1000)

              Finally
                If Not xlRange Is Nothing Then
                  System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
                End If
              End Try

            Finally
              If Not xlCells Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)
              End If
            End Try

          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
         System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
       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

> xlApp.Dialogs プロパティから、xlDialogPrinterSetup のダイアログを Show するとか。

すみません。自分なりに調べてみたんですが、情けない話し分かりません。
参考になるURL等があれば紹介いただければ幸いです。


引用返信 編集キー/
■5127 / inTopicNo.7)  Re[4]: プリントダイアログでプリンター設定しても変わらない
□投稿者/ わかば (4回)-(2007/07/05(Thu) 10:48:57)
No5096 (魔界の仮面弁士 さん) に返信
> ■No5094 (わかば さん) に返信
>>しかし、今、思い描いているのは、ソースにプリンタを直接記述するのではなく、
>>あくまで印刷する人が任意(複数プリンタから選択)に設定したいのですが、やはり
>>ダイアログを利用するのは不可能なのでしょうか?
> xlApp.Dialogs プロパティから、xlDialogPrinterSetup のダイアログを Show するとか。
> 
「わかば」です。いまだ、解決に至りません。

xlDialogPrinterSetup の扱い方がわからない現状です。

xlApp.Dialogs(xlDialogPrinterSetup).Show()

と記述すると"xlDialogPrinterSetup"に波線がでてしまいます。

xlDialogPrinterSetupに対する何らかの処理が足りないと素人ながら
考えているのですが、悪戦苦闘です。お恥ずかしい・・・。

ちなみに、本件とは関係ありませんが、「名前を付けて保存」ダイアログの
showは、以下の記述でできました。

xlApp.Dialogs(1).Show()

どうか、お助けください。



引用返信 編集キー/
■5175 / inTopicNo.8)  Re[5]: プリントダイアログでプリンター設定しても変わらない
□投稿者/ わかば (5回)-(2007/07/06(Fri) 09:34:08)
「わかば」です。現時点、お恥ずかしながら私のスキルでは、
壁にぶちあたってます。

> xlDialogPrinterSetup の扱い方がわからない現状です。
> xlApp.Dialogs(xlDialogPrinterSetup).Show()
> と記述すると"xlDialogPrinterSetup"に波線がでてしまいます。
>

レスがない状況が続いておりますが、
私自身のコメントの書き方に問題があるのでょうか?
それとも、不可能な事柄なのでしょうか?(実現可能と思いきかせ
ながらもくじけています)

どうか、お知恵を拝借できないでしょうか?
引用返信 編集キー/
■5178 / inTopicNo.9)  Re[6]: プリントダイアログでプリンター設定しても変わらない
□投稿者/ 魔界の仮面弁士 (329回)-(2007/07/06(Fri) 10:16:12)
No5175 (わかば さん) に返信
> レスがない状況が続いておりますが、
読んでいませんでした。というか見落としてました。(^^;


>>xlApp.Dialogs(xlDialogPrinterSetup).Show()
その記述は、ReleaseComObject 時に問題があるので、COM オブジェクトを変数に受ける必要があります。
……という点はとりあえず横に置いといて。

>>と記述すると"xlDialogPrinterSetup"に波線がでてしまいます。
xlDialogPrinterSetup は、XlBuiltInDialog のメンバですよね。
ゆえに、XlBuiltInDialog.xlDialogPrinterSetup のように記述します。

それでも駄目なら、列挙型の名前空間まで含めて、フルネームで記述してみましょう。
引用返信 編集キー/
■5302 / inTopicNo.10)  Re[7]: プリントダイアログでプリンター設定しても変わらない
□投稿者/ わかば (6回)-(2007/07/10(Tue) 11:17:48)
No5178 (魔界の仮面弁士 さん) に返信

ご回答が遅れて申し訳ありませんでした。
魔界の仮面弁士 さんのコメントをキーワードに
調べてみて、「Microsoft Office Excel の定数」
ということを発見しました。

その結果、下記の記述で意図する結果が得られました。

(前略)

If xlApp.Dialogs(8).Show() = True Then
  MsgBox("印刷をしました。")
Else
  MsgBox("印刷をキャンセルしました。")
End If

(後略)

長々とおつきあいいただき、有り難うございました。
今後とも宜しくお願い致します。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -