VB.NET 側からエクセルの印刷プレビュー画面を表示するには?

解決


  2006-06-30 21:58:18  No: 132116

こんにちは良です。
本当にいつもお世話になっております。

環境はVB.NET2003  WinXP です。

エクセルの画面を起動してエクセルのプレビューを表示してから始めて
Visible  をTrueにしたいのですがVB.NET側からのエクセルプレビュー画面の
操作がわかりません。「マクロの記録」で

ActiveWindow.SelectedSheets.PrintOut(Copies:=1, Preview:=True, Collate:=True)

というのが出てきたんですがこれを貼り付けたら「ActiveWindowが宣言
されていません」と変数扱いになってしまったんですよ。

すいませんがご教授のほうよろしくお願いいたします。


特攻隊長まるるう  2006-06-30 22:45:03  No: 132117

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200606/06060055.txt
↑同じ方と考えて良いですか?(IPが違う。)
基本的な操作とCOMオブジェクトの解放は分かっていると解釈します。
[VB.NET]
        Dim xlWindow As Excel.Window
        xlWindow = xlApplication.ActiveWindow


  2006-06-30 23:10:21  No: 132118

お返事ありがとうございます!

>特攻隊長まるるうさん

そうです。同じ人です。すみません家と会社で両方でアクセスしていますのでIPアドレスが二つあるんですよ。
混同させてしまってすみません。

   Dim xlWindow As Excel.Window
        xlWindow = xlApplication.ActiveWindow

        '印刷プレビュー画面を表示する
        xlWindow.SelectedSheets.PrintOut(Preview:=True)

という風に変えてみましたがエクセル画面は起動しますが
プレビュー画面にならなかったです。
もしかしてシートに何もない場合はプレビュー画面に行かないんですか?


  2006-06-30 23:11:49  No: 132119

すみません。会社内でもパソコン変えたので
IPアドレス変わっています。なのでたぶん良の名前のIPアドレスは
三つ(会社で二つ、家で一つ)あると思います。

混同させてしまってすみません。


  2006-06-30 23:31:58  No: 132120

あと
 Dim xlWindow As Excel.Window
        xlWindow = xlApplication.ActiveWindow

        '''印刷プレビュー画面を表示する
        xlWindow.PrintPreview()
も試してみたんですが、

「System.Runtime.InteropServices.COMException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : Window クラスの PrintPreview メソッドが失敗しました。」
と出てしまいました。

これはまずいでしょうか?


  2006-06-30 23:45:05  No: 132121

もしかしてシートの中身が空だから失敗したのでしょうか?


特攻隊長まるるう  2006-06-30 23:53:15  No: 132122

SelectedSheets も Sheets を返すので解放処理が必要な気がしますが。。。
まぁ、本題から外れるので省略します。

>もしかしてシートに何もない場合はプレビュー画面に行かないんですか?
思い当たることがあるなら質問の前に自分で実行してください。
セルに何か書き込んで、プレビュー画面に行くなら、それが原因と考えて
いいのでは?
回答者も実行結果から類推して回答しています。公式な文章が存在する
場合もありますが、エクセルの内部処理がどうなっているかはマイクロソフト
でないと分からないことですよね?質問掲示板で質問しても意味が無いと
言うか。。。マイクロソフトに聞けば?ってなります。

VBからエクセルを操作する時(というか参照設定するものは普通そうですが)は、
エクセルに用意されている既存の関数を呼び出すだけなので、エクセル側で
出来ないことは、VBからも出来ないことが多いです。
手作業で新規Bookを印刷プレビューしようとすると、
    『印刷できるものはありません』
のメッセージが出て実行できないようです。その可能性は高いでしょう。


  2006-07-01 00:18:06  No: 132123

>特攻隊長まるるうさん

お返事ありがとうございます。
確かにそのとおりです。

わざわざ回答していただいてるのに
余計な手間をかけさせてしまって申し訳ございません。

質問してから自分で実行していました。
確かにエクセルで何もない状態で
プレビューを表示するを設定すると
印刷できるものはありません。
って出ました。

もう少し考えてみます。
ありがとうございました。


特攻隊長まるるう  2006-07-01 00:44:07  No: 132124

>もう少し考えてみます。
いや、考える必要ないって(^^;)
>セルに何か書き込んで、プレビュー画面に行くなら、それが原因と考えて
>いいのでは?
質問のプログラムを作っている人なら、デバッグする環境になってるんだから、
30秒くらいでテスト実行できるのでは???
その程度の事をやってくれないのを怒ってるだけであって、質問は
どんどんすればいいと思うよ。


  2006-07-01 01:06:20  No: 132125

Dim xlApplication As New Excel.Application
        Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
        '新規のファイルを開く場合
        Dim xlBook As Excel.Workbook = xlBooks.Add
        Dim xlSheets As Excel.Sheets = xlBook.Worksheets
        Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)

        'xlApplication から WorkBooks を取得する
        xlBooks = xlApplication.Workbooks

        Dim xlRange As Excel.Range
        Dim strData(3, 0) As Object
        xlRange = xlSheet.Range("A8:A10")    'データの入力セル範囲
        strData(0, 0) = "1000"                 'データの作成
        strData(1, 0) = "20000"
        strData(2, 0) = "205"
        strData(3, 0) = "=Sum(A8:A10)"             '計算式
        xlRange.Value = strData              'セルへデータの入力

       ☆ Dim xlWindow As Excel.Window
       ☆xlWindow = xlApplication.ActiveWindow

        '印刷プレビュー画面を表示する
      ☆xlWindow.PrintPreview()

        ' Excel を表示する
        xlApplication.Visible = True

        ' COM オブジェクトを解放する (正しくは COM オブジェクトを解放する を参照)
        ComObjectRelease(xlSheet)            'xlSheet の解放
        ComObjectRelease(xlSheets)
        ComObjectRelease(xlBook)
        ComObjectRelease(xlBooks)

   Private Sub ComObjectRelease(ByRef objCom As Object)
        明示的に COM オブジェクトへの参照を解放
        Try
                 If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _
                                                      Marshal.IsComObject(objCom) Then
                Dim I As Integer
                Do
                    I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
                Loop Until I <= 0
            End If
        Catch
        Finally
            '参照を解除する
            objCom = Nothing
        End Try
    End Sub

>特攻隊長まるるうさんへ

お返事ありがとうございます。
たくさん質問させていただきます!(もちろん自分で調べるだけ調べて
どうしてもわからないときに限りますが)

今おこなっているソースを乗せます。
☆のところをコメントアウトしたらちゃんとエクセルが起動して
セルに値が入っているんですが☆を解除すると

「System.Runtime.InteropServices.COMException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : Window クラスの PrintPreview メソッドが失敗しました。」
がまた出てしまいました。

PrintPreviewは使えないのでしょうか?
それとも引数が必要なのでしょうか?
試しに
PrintPreview(xlsheet)
PrintPreview(xlsheets)
PrintPreview(xlbook)
とやってみましたが全部上記と同じエラーが出てしまいました。


  2006-07-01 02:16:48  No: 132126

こんばんは良です。

’エクセルを表示する   
xlApplication.Visible = True

        'エクセルウィンドウの生成
        Dim xlWindow As Excel.Window
        xlWindow = xlApplication.ActiveWindow
        xlSheet.PrintOut(From:=1, Preview:=True)

にしたらできました。
でも一瞬エクセルの画面が
立ち上がってからプレビュー画面に
移動したんですがエクセル画面を一瞬立ち上がるのを
なくすことは出来ますか?


  2006-07-03 20:20:19  No: 132127

とりあえずプレビュー画面は出ましたので解決といたします。


特攻隊長まるるう  2006-07-03 21:49:04  No: 132128

>        Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
>          〜
>        'xlApplication から WorkBooks を取得する
>        xlBooks = xlApplication.Workbooks
  Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks

  Dim xlBooks As Excel.Workbooks
  xlBooks = xlApplication.Workbooks
のことだから
  Dim xlBooks As Excel.Workbooks
  xlBooks = xlApplication.Workbooks
  xlBooks = xlApplication.Workbooks
ってやってる。。。(^^;)1個目の xlBooks が解放漏れとかになるかも。。。

>        ComObjectRelease(xlSheet)            'xlSheet の解放
>        ComObjectRelease(xlSheets)
>        ComObjectRelease(xlBook)
>        ComObjectRelease(xlBooks)
xlRange と xlWindow の解放をしていない。解放漏れ。

>        'エクセルウィンドウの生成
>        Dim xlWindow As Excel.Window
>        xlWindow = xlApplication.ActiveWindow
>        xlSheet.PrintOut(From:=1, Preview:=True)
>にしたらできました。
xlWindow 必要なくなっちゃったね。削除していいんじゃない?

    上にあげた所が気にならないと、[VB.NET]でエクセルは扱えません。

>        '印刷プレビュー画面を表示する
>      ☆xlWindow.PrintPreview()
>PrintPreviewは使えないのでしょうか?
同じ現象を確認しました…が、引数は関係なさそうです。
ヘルプに解説が無かったので、引数名の EnableChanges でWEB検索すると
>    プレビューの[設定]と[余白]ボタンのみを使用不可にする場合は引数EnableChangesが利用出来ます。
という記述に行き当たりました。Boolean 型を指定するだけのようです。

エラーの原因は分かりませんでした。良さんが引数で試されているように、
確かに印刷する対象が分からないのかとも思いましたが、xlWindow で
指定できるのが本来の処理です。
http://homepage.mac.com/hideo_ito/maclib/ExcelNoCompatible.html
とか見ると、結構不明瞭なバージョン更新が行われてて、使えない関数が
あるのかも?ここはマイクロソフトに聞かないと分からないですね。

>エクセル画面を一瞬立ち上がるのをなくすことは出来ますか?
多分、できない…かなぁ。プレビューって、単独での起動は出来なくって、
エクセルブックのダイアログみたいな動きをしてるようです。手作業でプレビュー
見てる時にシート(またはブック)の編集ってできないですよね?

プログラムからの操作も似たような感じで、エクセル画面を非表示にするには
  xlApplication.Visible = False
だけど、それでプレビューすると、今度は表示する処理が実行できなくなります。
…難しいと思います。


  2006-07-03 22:40:51  No: 132129

>特攻隊長まるるうさん

いつもご返事ありがとうございます!m(__)m
確かに上記のソースだと二回xlbooksを生成して
しまっていて解放作業は一回だけしか行っていないので
解放していない一回分(画面には何も表示されていないですが)
が残ってしまってパソコンを終了するときに
「エクセルを終了できません」というエラーに
なってしまったんだと思います。

xlRangeは解放作業忘れていましたので解放しました。
xlWindowは使っていないので削除しました。

プレビューを表示する作業
 xlSheet.PrintOut(From:=1, Preview:=True)

の後にVisibleをtrueにしたら

やはりエラーが生じてしまいました。

いつもご回答していただきありがとうございます!


旅芸人  2006-07-03 23:06:53  No: 132130

>エクセル画面を一瞬立ち上がるのをなくすことは出来ますか?

私もつい最近まったく同じことでハマリました。(VB6ですが・・・)

私の場合は、以下の手順で対応?しました。

  Excel.Visible = False
  〜処理〜
  Excel.WindowState = 最小化  ←ポイント
  Excel.Visible = True
  Excel.PrintPreview

↑の手順でプレビューを行うと、Excel画面が立ち上がっていることには
変わりは無いのですが、最小化しているため、「Visible = True」でも
ユーザからは見えなくなります。(ユーザから見えないのでOKもらいました
最小化されたExcelは、PrintPreview時に最大化されます。

以上。お役に立てれば幸いです。


  2006-07-04 00:14:32  No: 132131

こんにちは良です。

>旅芸人さん

ありがとうございます!
なるほど!そういう手がありましたね。
まだ試していないのですが試しにやってみます。
ありがとうございましたm(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加