エクセル2000です。
VBAでNavigateを使いWeb画面(イントラネット)を開き、
.Document.all.Item("Hoge****No").Value = Target.Text のような方法で入力を行い、
.Document.forms(0).submit で送信ボタンクリックして新たな画面を開くところまではできております。
次に、その開いた画面をプリントしたいのです。
どのようなコードになるのでしょうか?
ご教示いただければ幸いです。
(o。_。)oペコッ
現在のコードは以下のとおりです。
Dim objIE As Object
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub '複数セル不可
If Target.Column <> 1 Then Exit Sub 'A列のみ対象
'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
With objIE
.Navigate "http://******.co.jp/******/**/***/Details/Detail …
.Visible = True
Do While .Busy = True
DoEvents
Loop
.Document.all.Item("Hoge****No").Value = Target.Text 'テストボックスへ入力:Name属性で指定
'オートコンプリートなどの機能が働く場合があるので、念のため待機
Do While .Busy = True
DoEvents
Loop
.Document.forms(0).submit '送信ボタンクリック
End With
End Sub
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
何度もありがとうございます。
しかも勤労感謝の日の夜にまで・・・・。
本当に感謝いたします。
以下のようにやったところうまくいきました!
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/Detail …
.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
ありがとうございました。
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
いずれにしても、これ以上の追加アドバイスはできそうもないので
ご自分で色々と調べて工夫してみてください。
end-uさま、いつもありがとうございました。
プレビューしようと思ったのは一旦WEB画面を見て印刷の要否を判断するようにできたらと思ったのです。
それならば、なにもFor Each c ループせずに、最初に質問欄で書いたPrivate Sub Worksheet_SelectionChangeのイベントで一データずつやれば多少は不便ですが何とかなりそうです。
勝手を申しました。
No.1
- 回答日時:
定番の有益サイトです。
『.ExecWB メソッドを使い、 印刷処理を実行してみた。』
http://ken3-info.blog.ocn.ne.jp/objie/2009/06/ex …
簡易なサンプル。
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
この回答への補足
追加の質問で申し訳ありません。
Printは出来ましたがPrintPreviewがうまくいきません。
Const OLECMDID_PRINTPREVIEW = 7
Const OLECMDEXECOPT_DODEFAULT = 0 として
.ExecWB OLECMDID_PRINTPREVIEW, , OLECMDEXECOPT_DODEFAULT
でやってみましたが最初のプレビュー画面を手動で閉じるとそれから先に行ってくれません。
プリントなら次々に印刷されていくのですが・・・・。
。
ありがとうございます。
あまり理解できていませんが以下のようにやったところうまくエクセルデータを入力して表示させた画面を次々とプリントすることができました。
助かりました。
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/Detail …
.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/02/02 09:25
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) VBAで重複した値のセルに色付けをしたい 1 2022/11/02 16:12
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelのグレーの部分を戻したい
-
ページが増える
-
EXCEL改ページプレビューのペー...
-
エクセルの縦の幅だけ拡大したい。
-
エクセルでA4 2枚をA3 1枚で印...
-
YMM4 で MOV ファイルが読み込...
-
EXCELで1行の内容を1枚の紙に印...
-
エクセルのA3横一枚のデータをA...
-
エクセルのマクロで印刷プレビ...
-
エクセルのセルの枠線の点線に...
-
Excelで縦を拡大、横を縮小する...
-
プリンターが突然1部しか印刷...
-
改ページの2ページ目の作り方
-
印刷範囲がこまぎれになる
-
エクセルで印刷ページだけ白く...
-
エクセルで点線を引き、印刷す...
-
エクセルで空白ページが印刷さ...
-
Excelの改ページ印刷についての...
-
Excelで全ての行単位で改...
-
Excelで特定の文字・記号のとこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのグレーの部分を戻したい
-
EXCEL改ページプレビューのペー...
-
エクセルの縦の幅だけ拡大したい。
-
ページが増える
-
エクセルでA4 2枚をA3 1枚で印...
-
改ページの2ページ目の作り方
-
YMM4 で MOV ファイルが読み込...
-
エクセル上に貼り付けた画像が...
-
エクセルのマクロで印刷プレビ...
-
エクセルのA3横一枚のデータをA...
-
EXCELで1行の内容を1枚の紙に印...
-
Excelで縦を拡大、横を縮小する...
-
エクセルで点線を引き、印刷す...
-
エクセルでページのど真ん中に...
-
印刷範囲がこまぎれになる
-
Excelの改ページ印刷についての...
-
Excelで特定の文字・記号のとこ...
-
ExcelVBA 改ページの横破線を消...
-
Thunderbirdで印刷およびページ...
-
エクセルで、大きく灰色に書か...
おすすめ情報