• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Web画面をプリントする方法(エクセルVBA))

Web画面をプリントする方法(エクセルVBA)

このQ&Aのポイント
  • エクセル2000でVBAを使用してWeb画面を開き、入力して新しい画面を開く方法
  • 開いた画面をプリントするためのコードはどのようになりますか?
  • 解決策を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

追加レスつかなかったですね。 『多少は不便』という事なので、一応テストコードだけ全文載せておきます。 URLを入力したセル範囲を選択して実行です。 ([winXP/2000|2003/ie7][vista/2000|2007/ie8]の環境でテスト) '標準モジュール Option Explicit Private Declare Sub Sleep Lib "kernel32.dll" ( _              ByVal dwMillsecounds As Long) Private Declare Function FindWindowA Lib "user32.dll" ( _                    ByVal cnm As String, _                    ByVal cap As String) As Long Sub test()   Const READYSTATE_COMPLETE = 4   Const OLECMDID_PRINTPREVIEW = 7   Const OLECMDEXECOPT_DODEFAULT = 0   Dim r  As Range   Dim hWnd As Long      If TypeName(Selection) <> "Range" Then Exit Sub   With CreateObject("internetExplorer.application")     .Visible = True     For Each r In Selection       .navigate r.Value       While .busy Or (.readyState <> READYSTATE_COMPLETE)         DoEvents       Wend       .ExecWB OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT       While hWnd = 0         Sleep 500         DoEvents         hWnd = FindWindowA("Internet Explorer_TridentDlgFrame", "印刷プレビュー")       Wend       While hWnd <> 0         Sleep 500         DoEvents         hWnd = FindWindowA("Internet Explorer_TridentDlgFrame", "印刷プレビュー")       Wend     Next   End With End Sub

merlionXX
質問者

お礼

何度もありがとうございます。 しかも勤労感謝の日の夜にまで・・・・。 本当に感謝いたします。 以下のようにやったところうまくいきました! Sub PreviewTEST() Const READYSTATE_COMPLETE = 4 Const OLECMDID_PRINTPREVIEW = 7 Const OLECMDEXECOPT_DODEFAULT = 0 Dim myRng As Range, c As Range Dim hWnd As Long Dim tmp As String On Error Resume Next tmp = objIE.Name If Err.Number <> 0 Then 'エラーならIEが起動していないので、起動する Set objIE = CreateObject("InternetExplorer.Application") End If On Error GoTo 0 Set myRng = Selection For Each c In myRng If c <> "" Then With objIE navigate "​http://******.co.jp/******/**/***/Details/DetailsScr/init"​ .Visible = True Do While .busy DoEvents Loop .document.all.Item("HogeHogeNo").Value = c.Text 'テストボックスへ入力:Name属性で指定 Do While .busy ' = True 'オートコンプリートなどの機能が働く場合があるので、念のため待機 DoEvents Loop .document.forms(0).submit '送信ボタンクリック Do While .busy DoEvents Loop .ExecWB OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT Do While hWnd = 0 DoEvents hWnd = FindWindowA("Internet Explorer_TridentDlgFrame", "印刷プレビュー") Loop Do While hWnd <> 0 DoEvents hWnd = FindWindowA("Internet Explorer_TridentDlgFrame", "印刷プレビュー") Loop End With End If Next c End Sub ありがとうございました。

その他の回答 (2)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

>Printは出来ましたがPrintPreviewがうまくいきません。 ぅーん...... PrintPreviewは難しそうです... ExecWBは非同期実行されますから、 >For Each c In myRng な使い方だと、プレビュー画面が表示されたまま次の.navigateが実行されてしまいエラーです。 ExecWBを同期実行させるやり方ってあるんでしょうか... そこは私にはわかりません。 私が思いつくのは、ExecWBメソッドの後、プレビュー画面のウィンドウハンドルを取得するまで待って、 それからさらにプレビュー画面ウィンドウが閉じるまで待つ、という方法くらいです。 WindowsAPI関数を使う事になるかと思いますが、そこまでして、その機能を実装しますか? WinAPIも詳しいわけではないので触りしか書きませんが、考え方としては .ExecWB OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT While hWnd = 0   Sleep 500   DoEvents   hWnd = FindWindow("Internet Explorer_TridentDlgFrame", "印刷プレビュー") Wend While hWnd <> 0   Sleep 500   DoEvents   hWnd = FindWindow("Internet Explorer_TridentDlgFrame", "印刷プレビュー") Wend こんな感じでいけるはず。 不安なので詳しい方からのレスもお待ちください。 ですが、そもそもプレビューは印刷設定の確認の為でしょうか? その場合、Each c で設定せずに、最初の1回だけ確認すれば良かったりしませんか? そのようにLoopを組む事で対応できないですかね? 最初の c だけプレビューしてユーザーに選択させ、OKであれば印刷し、 2個目の c からは印刷だけ...など。 考え方を変えて、時には妥協も必要かと。 MsgBoxはプレビュー画面に隠れてしまいますから、最前面に表示させるようにちょっと工夫が要ります。 WScriptのPopupメソッドを使ったりすると良いでしょう。 If CreateObject("WScript.Shell") _   .Popup("印刷設定はこれでいいですか?", , , vbYesNo + vbSystemModal) = vbYes Then Else End If いずれにしても、これ以上の追加アドバイスはできそうもないので ご自分で色々と調べて工夫してみてください。

merlionXX
質問者

お礼

end-uさま、いつもありがとうございました。 プレビューしようと思ったのは一旦WEB画面を見て印刷の要否を判断するようにできたらと思ったのです。 それならば、なにもFor Each c ループせずに、最初に質問欄で書いたPrivate Sub Worksheet_SelectionChangeのイベントで一データずつやれば多少は不便ですが何とかなりそうです。 勝手を申しました。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

定番の有益サイトです。 『.ExecWB メソッドを使い、 印刷処理を実行してみた。』 http://ken3-info.blog.ocn.ne.jp/objie/2009/06/execwb_cdcc.html 簡易なサンプル。 Sub test()   Const READYSTATE_COMPLETE = 4   Const OLECMDID_PRINTPREVIEW = 7   Const OLECMDEXECOPT_DODEFAULT = 0   With CreateObject("internetExplorer.application")     .Visible = True     .navigate "http://oshiete1.goo.ne.jp/qa5455536.html"     While .busy Or (.readyState <> READYSTATE_COMPLETE)       DoEvents     Wend     .ExecWB OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT   End With End Sub

merlionXX
質問者

お礼

ありがとうございます。 あまり理解できていませんが以下のようにやったところうまくエクセルデータを入力して表示させた画面を次々とプリントすることができました。 助かりました。 Sub 印刷TEST() Const OLECMDID_PRINT = 6 Const OLECMDEXECOPT_DONTPROMPTUSER = 2 'IEが起動しているかチェック。objIE.Nameプロパティの取得に成功したら起動とみなす。 Dim tmp As String On Error Resume Next tmp = objIE.Name If Err.Number <> 0 Then 'エラーならIEが起動していないので、起動する Set objIE = CreateObject("InternetExplorer.Application") End If On Error GoTo 0 Set myRng = Selection For Each c In myRng If c <> "" Then With objIE .navigate "http://******.co.jp/******/**/***/Details/DetailsScr/init" .Visible = True Do While .busy DoEvents Loop .document.all.Item("HogehopgNo").Value = c.Text Do While .busy DoEvents Loop .document.forms(0).submit '送信ボタンクリック Do While .busy DoEvents Loop .ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER '印刷 End With End If Next c End Sub

merlionXX
質問者

補足

追加の質問で申し訳ありません。 Printは出来ましたがPrintPreviewがうまくいきません。 Const OLECMDID_PRINTPREVIEW = 7 Const OLECMDEXECOPT_DODEFAULT = 0 として .ExecWB OLECMDID_PRINTPREVIEW, , OLECMDEXECOPT_DODEFAULT でやってみましたが最初のプレビュー画面を手動で閉じるとそれから先に行ってくれません。 プリントなら次々に印刷されていくのですが・・・・。 。

関連するQ&A