プロが教える店舗&オフィスのセキュリティ対策術

エクセルVBAについて質問です。
エクセルを開いた時にpdfを自動的に起動させます。
パスワード付きのpdfを開く際に、パスワード入力とOKボタンを自動で行うには、どの様なコードになるのでしょうか?
pdfを開くことは出来るのですが、パスワード入力欄とOKボタンのハンドル取得ができません。

A 回答 (2件)

対象は、Acrobat Reader DC (試験したのは、Ver.2017.012.20098)



これで試してみてください。
ただ、「エクセルを開いた時にpdfを自動的に起動させます。」のような同時に動かすことは、あまり賛成いたしかねます。以下は、Sleepにより、多少の時間差は加わっていますが、どちらかが、失敗する可能性があります。

'//標準モジュール推奨
'Option Explicit
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Any) As Long

Private Const BM_CLICK As Long = &HF5
Private Const WM_ACTIVATE As Long = &H6
Private Const WM_SETTEXT As Long = &HC
Private Const PSW As String = "xyz" 'パスワード
Sub PDFOpenPSW()
 Dim objFOS As Object
 Dim WshShell As Object
 Dim fn As Variant
 Dim cnt As Long
 Dim hWnd As Long
 Dim hWnd_c As Long
 Dim hWnd_ebx As Long
 Dim hWnd_btn As Long
 Set WshShell = CreateObject("Wscript.Shell")
 fn = ActiveCell.Value 'アクティブセルにファイル名がある。
 If fn Like "*.pdf" Then
  If Dir(fn) = "" Then
   MsgBox "ファイルがありません。", vbExclamation
   Exit Sub
  End If
 End If

 WshShell.Run fn, 1

 Do Until hWnd_ebx <> 0 Or cnt > 100
  hWnd = FindWindow("#32770", "パスワード")
  hWnd_c = FindWindowEx(hWnd, 0&, "GroupBox", vbNullString)
  hWnd_btn = FindWindowEx(hWnd_c, 0, "Button", "OK")
  hWnd_ebx = FindWindowEx(hWnd_c, 0, "RICHEDIT50W", vbNullChar)
  Sleep 100
  DoEvents
  cnt = cnt + 1
 Loop
 If hWnd <> 0 Then
  If hWnd_ebx = 0 Then MsgBox ("EditBoxが、取得できませんでした。"), vbCritical: Exit Sub
  If hWnd_btn = 0 Then MsgBox ("Buttonが、取得できませんでした。"), vbCritical: Exit Sub

  Call SendMessage(hWnd_ebx, WM_SETTEXT, 0&, PSW)
  Call SendMessage(hWnd_btn, BM_CLICK, 0, 0&)
 End If
End Sub
    • good
    • 0

'#1のコードは、32bit 版でした。


'64bit では、Win API は以下のように変わります。
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPtr
Private Declare PtrSafe Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2017/11/02 22:20

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