1 つまたは複数のドキュメントをダウンロードし、Windows 関数を使用して印刷するために使用される Word マクロに VBA コードがありますShellExecuteEx
。コードは、Windows 2000、XP、および 7 (32 ビットおよび 64 ビット) 上の Word バージョン 97、2000、2003、2007、および 2010 (32 ビット) で正常に実行されます。
ただし、64 ビットの Word 2010 および 2013 では の呼び出しが失敗します。MSDNで文書化され、Win32API_PtrSafe ファイルで指定されているように、ShellExecuteEx
VBA7 (64 ビット) の宣言を更新しました。例えば:
#If VBA7 Then
Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As LongPtr
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As LongPtr
lpIDList As LongPtr
lpClass As String
hkeyClass As LongPtr
dwHotKey As Long
hIcon As LongPtr
hProcess As LongPtr
End Type
Declare PtrSafe Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" _
(sei As SHELLEXECUTEINFO) As Boolean
#End If
使い方はこんな感じです。
Dim bReturn As Boolean
Dim sei As SHELLEXECUTEINFO
With sei
.cbSize = Len(sei) ' size of the object
.fMask = SEE_MASK_NOCLOSEPROCESS ' indicate that we want a hProcess back
.hwnd = GetDesktopWindow() ' the window we are calling from
.lpVerb = "print" ' print the file
.lpFile = lpFile ' the file we want to print
.lpParameters = vbNullString ' no parameters because its a file
.lpDirectory = vbNullString ' use the current dir as working dir
.nShow = SW_HIDE ' state of the window to open
End With
bReturn = ShellExecuteEx(sei)
If bReturn Then
WaitForSingleObject sei.hProcess, 5000
CloseHandle sei.hProcess
DoEvents
Else
MsgBox "ShellExecuteEx failed with code: " & Err.LastDllError
End If
32 ビット Word では機能しますが、64 ビット Word では呼び出しはShellExecuteEx
常に失敗し、5 (SE_ERR_ACCESSDENIED) が返されます。fMask
(SEE_MASK_NOASYNC を含む)のフラグ値の範囲を試しましhwnd
たnShow
。
単純なShellExecute
関数は 32 ビットと 64 ビットの両方の Word で機能しますが、柔軟性がありません。複数のドキュメントを印刷する場合に優れているため、使用したいと考えてShellExecuteEx
います。別の印刷要求を送信する前に、印刷アプリケーション (Word、Adobe Reader など) の準備が整うのを待つことができます。それ以外の場合、アプリケーションの準備ができていない場合、印刷要求は失敗します。(印刷要求の間に数秒待つだけで試しましたが、信頼できません。)
ShellExecute
ファイルを印刷ShellExecuteEx
してもアクセスが拒否されて失敗するのはなぜですか?