アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excel VBAで指定してフォルダのPDFファイルを開いて印刷したいです(できれば閉じるところまで)。
開くところまではできたのですが、その先に印刷するのはどのようにしたら良いか教えてください。
安直な考えで開いた後のコードに何か付け足せばいけるのかと思って色々調べてはみたのですが、
そもそも開く段階で別のコマンドを指定しないといけないのでしょうか。
ちなみに、フォルダは変動しませんがファイル名はA1に入っている文言を拾うようにしています。

現在のコード
Sub printpdf()
Dim keyword As String
Dim myPath As String
Dim fName As String

keyword = Worksheets("Sheet1").Range("A1").Value
myPath = "\\フォルダのパス\"
fName = Dir(myPath & keyword & ".pdf")

If fName = "" Then
MsgBox ("該当するファイルが存在しません。")
Exit Sub
End If

Shell ("explorer.exe " & myPath & fName)
fName = Dir()
End Sub

質問者からの補足コメント

  • そちらの質問も拝見しました。
    ただ、複数のPCから共有のデータを開くので(pdfビューワーもAcrobat readerとAcrobat Proの人がいる)、できれば関連付けられたアプリケーションで開く今の状態に何か足してできればと思ったのですが、甘い考えだったかもしれません。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/04/29 23:31

A 回答 (6件)

#4の回答者です。



>ちなみにプリンターバッファの問題とはバッファにデータが残ってしまうのでしょうか?

ある一定量を越えると、プリンターがうんともすんとも反応しなくなってしまうことがありました。マクロはすごく速く処理してしまうのに、プリンターのほうは、実際に印刷時間がありますから、ギャップがあるのです。

Sleep 1000  '1秒
------------------
cnt = cnt + 1
If cnt > 100 Then Exit Sub

で、ほんのちょっとの時間稼ぎはしています。
ちなみに、
If cnt > 100 Then Exit Sub 
これは、ハンドルが取れない時の保護処理です。

なお、sendkeys は、例えば、エクセルで発生させると、エクセル内に関しては、うまくいくこともありますが、外部には働かないことが多いです。
もし、Sendkeys を試すなら、
  CreateObject("Wscript.Shell").SendKeys "%{F4}"
を試してみることですね。

>キーワードが頭に無い為調べ方すら分からないレベルだったので勉強になりました。
そういう私も、もう一度勉強し直します。WMで始まる命令って4個ぐらいしかないのですが、実は、他の定数で、もっと一杯あることを最近知りました。ネット検索でも、ぜんぜん出てこないのですね。(探し方にVB限定で検索するのが、問題があるようです)
    • good
    • 1
この回答へのお礼

頂いたコードを理解するのに時間がかかったためお礼が遅くなって申し訳ありません。
とはいってもまだ完全には理解できていないのでお恥ずかしいですが…
Sleep関数も知りませんでしたのでただただ頭が下がります。1秒は1000と表記するのか…!というレベルなので頑張ります。
PDFは大量に印刷するわけではなく、Excelの複数のシートをマクロで印刷した最後に1枚PDFを足すような感じなので、そこまで問題は出ないかもしれません。
VBA以外の言語がわかるともっと幅が広がるということなんでしょうね。
本当にありがとうございました。

お礼日時:2017/05/06 13:58

不確実性が高くなりますが、sendkeysの対応は不可でしょうか?


開いた後に、
1.開いたpdfをアクティブにする(しなくてもなってるかも)
2.ctrl + pで印刷画面を開く
3.Enterなど印刷
4.Alt + F4で閉じる
時間をどれくらいあけるかや、パソコン性能によって失敗率が変わりますが、手っ取り早いかと思います。
失敗が許されない場面では適用できませんが。
    • good
    • 0
この回答へのお礼

Sendkeysとは他のアプリケーションを開いた後に押すキーボードを指定するという感じでしょうか。
そういったやり方があるとは全く知らなかったので勉強になります。
実際に使用するのは私よりも更にパソコンが分からない人たち(しかも複数)で、PCスペックも様々なので実用性は低いかもしれませんが、これも試してみたいと思います。
回答ありがとうございました。

お礼日時:2017/05/04 11:34

ちょっと作ってみました。


ただ、あまりこのマクロを頻繁に続けると、プリンターバッファの問題が出て来るので、プリンター側の調整が必要だと思います。

'標準モジュール
Private Declare Function ShellExecute Lib "SHELL32" Alias "ShellExecuteA" (ByVal hWnd&, _
  ByVal lpOperation$, ByVal lpFile$, ByVal lpParameters$, ByVal lpDirectory$, _
  ByVal nShowCmd&) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_CLOSE As Long = &H10
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Sub OpenPdf()
Dim FileName As String
Dim retval As Long
Dim hWnd As Long
Dim cnt As Long
Const myFOLDER As String = "\\フォルダのパス\"
Const ACR_CLASSNAME As String = "AcrobatSDIWindow"

FileName = myFOLDER & Worksheets("Sheet1").Range("A1").Value & ".pdf"
If Dir(FileName) <> "" Then
retval = ShellExecute(0&, "print", FileName, vbNullString, vbNullString, 1)
End If
If retval = 0 Then Exit Sub
Sleep 1000
Do
  hWnd = FindWindow(ACR_CLASSNAME, vbNullString)
  DoEvents
  cnt = cnt + 1
  If cnt > 100 Then Exit Sub
Loop Until hWnd <> 0

Call SendMessage(hWnd, WM_CLOSE, 0&, 0&)
End Sub
    • good
    • 1
この回答へのお礼

おおすごい!できました!ありがとうございます。
Private Const WM_CLOSE As Long = &H10 ここの部分がウィンドウを閉じる動作なんですね。
キーワードが頭に無い為調べ方すら分からないレベルだったので勉強になりました。
ちなみにプリンターバッファの問題とはバッファにデータが残ってしまうのでしょうか?

お礼日時:2017/05/04 11:21

印刷だけなら


Shell ("explorer.exe " & myPath & fName)
Call ShellExecute(Application.hwnd, "print", myPath & fName, vbNullString, vbNullString, 0)

でいけます。


閉じるのはかなり難しそうです。
https://www.google.co.jp/search?hl=ja&source=hp& …

組み合わせれば何とかなるかもしれませんが。
https://www.moug.net/tech/acvba/0010014.html
http://www.gizcollabo.jp/vbtomo/log/archive/chos …
http://mrxray.on.coocan.jp/Delphi/plSamples/722_ …
    • good
    • 0
この回答へのお礼

いや、十分です!とても助かりました!

あと、プロシージャの外に
Declare Function ShellExecute Lib "SHELL32" Alias "ShellExecuteA" (ByVal hwnd&, ByVal lpOperation$, ByVal lpFile$, ByVal lpParameters$, ByVal lpDirectory$, ByVal nShowCmd&) As Long

を入れないと動かないので備忘録として記しておきます。

お礼日時:2017/05/01 19:52

PDFを開くだけなのと、開いたPDFを操作することは別です。



関連付けされたもので開くことは簡単ですが、[印刷]や[閉じる]などは
簡単には設定できるものではないので、複数の環境にて使うのなばら、
別方法を検討したほうが良いかもしれませんね。
PDFを印刷
http://pdf-dde.nnn2.com/?p=16
readerを閉じる
http://pdf-dde.nnn2.com/?p=38
その他
http://pdf-dde.nnn2.com/
https://helpx.adobe.com/jp/acrobat/kb/2558.html
    • good
    • 0
この回答へのお礼

お礼したつもりが投稿ボタンを押し忘れたようで遅くなり申し訳ありません。
印刷するまでは他の方が教えてくださったので、閉じるところは別方法を検討しようと思います。
さすがに考えが安直すぎたようで反省です。回答ありがとうございました。

お礼日時:2017/05/02 14:09

過去ログで探してみましたか?


https://oshiete.goo.ne.jp/qa/8346776.html
同じようなことをしたい質問がありましたよ。
Adobe Readerを指定して、印刷する必要があるようです。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A