tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
Excel 2010 で印刷中のダイアログを非表示にして印刷(VB.NET) ( No.30 )  [親スレッドへ]
日時: 2012/05/29 14:06
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[エクセル][][]                                                      *
* キーワード:Excel VBA,Excel2010,印刷中のダイアログ,非表示,表示しない            *
***********************************************************************************
'===================================================================================================
'投 稿 日:2012.05.06
'投 稿 者:VBレスキュー(花ちゃん)
'タイトル:Excel 2010 で印刷中のダイアログを非表示にして印刷
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

以前のバージョン等では、下記の方法で印刷中のダイアログを非表示にして印刷できたのですが
ForegroundWindow の仕様が変更されてから(未確認)か、ダイアログの枠等が表示されたままに
なってしまい、ダイアログを閉じてみたり、色々試したが良い方法が見つかりません。
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=220
色々、思考錯誤した結果下記の方法しか見つかりませんでした。
色んな環境で試したものでもないので場合によっては、非表示ならない等の問題が発生するかも知れません。

テストされましたら、結果等を[雑談用掲示板]の方にでも書いて頂けると幸いかと。

'--------------------------------------------------------------------------------------------------
Private Sub Button28_Click(sender As System.Object, e As System.EventArgs) Handles Button28.Click
   'テスト用の適当なファイル(印刷に時間がかかるような)を用意しておいて下さい。
   '既存のファイルをオープンして、Excel を起動
   Call ExcelOpen(System.IO.Path.GetFullPath("..\..\..\data\DBTest.xls"), "Sheet1")
   '===================== 印刷中のダイアログを非表示に設定 ======================
   '表示状態でも、非表示でも同じです。
   xlApp.Visible = False
   '確認のために、2秒間表示しておく
   System.Threading.Thread.Sleep(2000)

   'バックグラウンドで、印刷中のダイアログが表示されたら閉じる
   Me.BackgroundWorker2.RunWorkerAsync()
   '印刷開始 100 部(プリンターの電源を切ってから試すと用紙が無駄になりません。)
   xlSheet.PrintOutEx(, , 20)

   '=============================================================================
   'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行
   Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False)  'False の場合保存しないで終了
   'Excel.EXE がタスクマネージャに残っていないか調査(実使用時は必要なし)
   Call ProcessCheck()
End Sub

'別途、ツールボックスから BackgroundWorker2 を貼り付けておいて下さい。
Private Sub BackgroundWorker2_DoWork(ByVal sender As Object, ByVal e As  _
            System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
   Dim counter As Integer = 0
   Dim wid As Integer = Screen.PrimaryScreen.Bounds.Width \ 2
   Dim hei As Integer = Screen.PrimaryScreen.Bounds.Height \ 2
   Do While counter < 50      '指定の回数繰り返したら終了
      '画面の中心(ダイアログが表示される位置)にカーソルを移動する。
      '(ダイアログがカーソルの裏になって再描画されなくなる)
      Cursor.Position = New Point(wid, hei)

      '印刷中のダイアログのハンドルを取得
      Dim hwnd As IntPtr = FindWindowEx(IntPtr.Zero, IntPtr.Zero, vbNullString, "印刷中")
      If hwnd <> IntPtr.Zero Then
         MoveWindow(hwnd, 0, 0, 0, 0, False)
         Exit Do
      End If
      System.Threading.Thread.Sleep(1)
      counter += 1
   Loop
End Sub



'#Region "Win32 API 関数の宣言及び変数の宣言" のところへ下記 API を追加願います。

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function MoveWindow( _
   ByVal hwnd As IntPtr, _
   ByVal x As Integer, _
   ByVal y As Integer, _
   ByVal nWidth As Integer, _
   ByVal nHeight As Integer, _
   ByVal bRepaint As Boolean) As Integer
End Function




 [スレッド一覧へ] [親スレッドへ]