あなたの「必」の書き順を教えてください

以前こちらで質問させて頂きました。
https://oshiete.goo.ne.jp/qa/9735053.html
Pdfファイルを開いて印刷する方法を教えて頂きましたが、お恥ずかしい限りなのですが今度はExcel2016で印刷できない現象にぶつかっています。
Excel2016でWindows10の環境が複数ありますが全て同じ現象です。(Windows7に2003を入れているPCも多数)

’宣言部分を分岐
#If Win64 Then
Private Declare PtrSafe Function ShellExecute Lib "SHELL32" Alias "ShellExecuteA" (ByVal hwnd&, ByVal lpOperation$, ByVal lpFile$, ByVal lpParameters$, ByVal lpDirectory$, ByVal nShowCmd&) As LongPtr
#Else
Private Declare Function ShellExecute Lib "SHELL32" Alias "ShellExecuteA" (ByVal hwnd&, ByVal lpOperation$, ByVal lpFile$, ByVal lpParameters$, ByVal lpDirectory$, ByVal nShowCmd&) As Long
#End If

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

Call ShellExecute(Application.hwnd, "Print", myPath & fName, vbNullString, vbNullString, 0)
fName = Dir()
End Sub

Excel2003では問題なく印刷できるのですが、2016では印刷できません。
Application.hwnd, "Print"のPrintをOpenにすると2016でも開くところまではできるので、
何が問題なのでしょうか。

https://msdn.microsoft.com/ja-jp/library/cc42207 …
こちらのURLのprintの部分で「lpFile パラメータで指定したファイルを印刷します。lpFile パラメータで文書以外のファイルを指定すると、この関数は失敗します。」とありますが、何か関係ありますか?
いっそ全てのPCのExcel2016を32bitでインストールし直した方が手っ取り早いですかね…
何で全部64bitでインストールしたのか意味不明なのですが(遠い目)
宜しくお願いします。

A 回答 (1件)

こんにちは。



見当させていただいたのですが、
>Call ShellExecute(Application.hwnd, "Print", myPath & fName, vbNullString, vbNullString, 0)

これは、Shell ですから、32bit と 64bit では呼び出しの手順が違うのだろうと思います。まちがなくAcrobat Reader? が呼び出されるとは限らないですね。AcroRd32.exeゆえの問題も残るのかもしれません。OLEの仕様が分かれば、そちらに移行したほうがよいでしょうね。

以下は、同じような仕組みではあっても、
https://helpx.adobe.com/jp/acrobat/kb/510705.html
ここで書かれてあるような、コマンドプロンプトを用いました。
うまくいくとは言い難いのは、オプションをつけても、自動終了しないので、こちらで終了させることにしました。

'//
#If VBA7 And Win64 Then
 '64ビット版
 Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
 Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
 '32ビット版
 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 Private Declare Sub Sleep Lib "kernel32" (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
#End If
Private Const WM_CLOSE = &H10

Sub PDF_PrintTest()
 Dim myPath As String
 Dim oShell As Object
 Dim fName As String
 Dim Keyword As String
 Dim CommandPdf As String
 Dim cnt As Long
 Dim hWnd As Long
 Dim Ret As Long
 'myPath = "\\フォルダのパス\"
 Keyword = Worksheets("Sheet1").Range("A1").Value

 fName = Dir(myPath & Keyword & ".pdf")

 If fName = "" Then
  MsgBox "該当するファイルが存在しません。", vbCritical
  Exit Sub
 End If
 fName = myPath & fName
 Set oShell = CreateObject("WScript.Shell")
 CommandPdf = """C:\Program Files\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"" " & " /t " & fName
 Ret = oShell.Run(CommandPdf)
 Do
  Sleep 500
  hWnd = FindWindow("AcrobatSDIWindow", vbNullString)
  cnt = cnt + 1
  If cnt > 50 Then Exit Sub
 Loop Until hWnd > 0
 Call SendMessage(hWnd, WM_CLOSE, 0&, 0&)
 Sleep 500
 hWnd = FindWindow("AcrobatSDIWindow", vbNullString)
 If hWnd > 0 Then
  Call SendMessage(hWnd, WM_CLOSE, 0&, 0&)
 End If
End Sub
    • good
    • 0
この回答へのお礼

ありがとう

WindFallerさん、前回に引き続き回答ありがとうございます。
頂いたコードを使用するために四苦八苦していたところ、あっという間に時間が経ち自動的に質問が締め切られてしまったのでお返事が遅くなり大変申し訳ありません。
わざわざお時間割いて回答して頂き本当にありがとうございます。
まだうまく行ってないのですが、頂いたコードとURLを参考に推古していきたいと思います。
本当はちゃんと理解してからお返事したかったのですが、自分の力不足を実感したのと時間がかかりそうなため取り急ぎお礼とさせていただきます。
また何かありましたらご質問させてください。

お礼日時:2017/05/23 00:11

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

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


おすすめ情報