- 日時: 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
|