Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1745 / 13645 ツリー ←次へ | 前へ→

【72196】EXCEL上からPDFを開く方法(パスワードを渡す) 食う・寝る・走る 12/6/19(火) 9:35 質問[未読]
【72197】Re:EXCEL上からPDFを開く方法(パスワード... とおりすぎ 12/6/19(火) 12:59 回答[未読]
【72198】Re:EXCEL上からPDFを開く方法(パスワード... Abyss 12/6/19(火) 14:28 回答[未読]
【72200】Re:EXCEL上からPDFを開く方法(パスワード... 食う・寝る・走る 12/6/19(火) 16:16 お礼[未読]
【72199】Re:EXCEL上からPDFを開く方法(パスワード... 食う・寝る・走る 12/6/19(火) 15:28 お礼[未読]
【72201】Re:EXCEL上からPDFを開く方法(パスワード... Abyss 12/6/19(火) 17:04 発言[未読]
【72212】Re:EXCEL上からPDFを開く方法(パスワード... 食う・寝る・走る 12/6/20(水) 14:22 お礼[未読]
【72213】Re:EXCEL上からPDFを開く方法(パスワード... Abyss 12/6/20(水) 16:38 発言[未読]
【72216】Re:EXCEL上からPDFを開く方法(パスワード... 食う・寝る・走る 12/6/21(木) 11:28 お礼[未読]
【72217】Re:EXCEL上からPDFを開く方法(パスワード... Abyss 12/6/21(木) 11:36 発言[未読]

【72196】EXCEL上からPDFを開く方法(パスワードを...
質問  食う・寝る・走る  - 12/6/19(火) 9:35 -

引用なし
パスワード
   エクセル上で、図面番号を整理しております。
直接パスワード付きの図面(PDFファイル)を開きたいのですが、
うまくいかずに困っています。パスワードはファイルを開くときに必要なものです。
PDFファイルを開くときにパスワードBOXが出ますが、パスワード枠へパスワードを自動で転記し、OKボタンを押す動作が出来ないでしょうか?

動作環境は、
 OS:WindowsXp+SP3
 エクセル:MicrosoftOffice2007(Excel)
 アクロバット:Acrobat7
 クラスの取得:spy++(VisualStudio6.0+SP5のVC++付属)

VBAでは、予め、spy++で目的のクラス名を得ていれば立ち上がっているメモ帳へデータを転記することは、可能であることを以下のマクロで確認済です(A1セルをダブルクリックで動作確認済)。

同様にA2セルをダブルクリックするとPDFパスワードに転記するマクロが動くはずなのですが、うまくいきません。アクロバット7のフォーム名はspy++によると、
「#32770(ダイアログ)」と出ますが、なぜか「#32770」としないと戻り値が0で取得できません。また、クラス名で子ウィンドウのハンドルは「Edit」とありますが、戻り値が0で、取得できません。
何か情報をお持ちでしたら、お教え頂けると幸いです。


'事前にメモ帳とパスワード付きのPDFのパスワードを求めるメッセージBOXを
'立ち上げておいて下さい。
'下記マクロをsheet1にコピー&貼付けし、A1、A2セルに適当な文字を入れて
’ダブルクリックするとイベントが発生します。
'------------------------------------------------------------------------
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 hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) 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 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Const BM_CLICK As Long = &HF5
Private Const WM_ACTIVATE As Long = &H6
Private Const WM_SETTEXT As Long = &HC

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

  Dim strWindowClassName   As String
  Dim lngWindowHandle     As Long
  Dim strChildWindowClassName As String
  Dim lngWindowTextBuffer   As String * 255
  Dim lngChildWindowHandle  As Long
  Dim lngResult As Long


Select Case Target.Address
Case "$A$1" 'メモ帳へ転記
  ' クラス名でウィンドウハンドルを取得
  strWindowClassName = "Notepad" '←メモ帳のフォーム名の取得
  ' メモ帳のウィンドウハンドルを取得
  lngWindowHandle = _
    FindWindow( _
      strWindowClassName, _
      vbNullString)
  ' ウィンドウハンドルを取得できたときは
  If lngWindowHandle <> 0 Then
    ' クラス名で子ウィンドウのハンドルを取得
    strChildWindowClassName = "Edit" '←メモ帳の入力枠のクラス名
    lngChildWindowHandle = _
      FindWindowEx( _
        lngWindowHandle, _
        0, _
        strChildWindowClassName, _
        vbNullString)
    ' 子ウィンドウのハンドルを取得できたときは
    If lngChildWindowHandle <> 0 Then
      'シートのA1セルの値をメモ帳へ転記
      lngWindowTextBuffer = Cells(1, 1)
      lngResult = _
        SendMessage( _
          lngChildWindowHandle, _
          WM_SETTEXT, _
          0, _
          ByVal lngWindowTextBuffer)
    End If
  End If
  
  
Case "$A$2" 'PDFのパスワード枠へ転記
' クラス名でウィンドウハンドルを取得
  strWindowClassName = "#32770" '←アクロバット7のフォーム名の取得
  ' メモ帳のウィンドウハンドルを取得
  lngWindowHandle = _
    FindWindow( _
      strWindowClassName, _
      vbNullString)
  ' ウィンドウハンドルを取得できたときは
  If lngWindowHandle <> 0 Then
    ' クラス名で子ウィンドウのハンドルを取得
    strChildWindowClassName = "Edit" '←PDFのパスワード枠のクラス名
    lngChildWindowHandle = _
      FindWindowEx( _
        lngWindowHandle, _
        0, _
        strChildWindowClassName, _
        vbNullString)
    ' 子ウィンドウのハンドルを取得できたときは
    If lngChildWindowHandle <> 0 Then
      'シートのA2セルの値をPDFのパスワード枠へ転記
      lngWindowTextBuffer = Cells(2, 1)
      lngResult = _
        SendMessage( _
          lngChildWindowHandle, _
          WM_SETTEXT, _
          0, _
          ByVal lngWindowTextBuffer)
    End If
  End If


End Select

End Sub

【72197】Re:EXCEL上からPDFを開く方法(パスワー...
回答  とおりすぎ  - 12/6/19(火) 12:59 -

引用なし
パスワード
   クラス名"#32770"っていっぱいあるから、FindWindowの引数lpWindowNameも
していするとか。

あと、
Dim lngWindowTextBuffer   As String * 255
で*255はいらない。

こちらでは、バージョン違うからか、階層数、クラス名が異なっていた。

【72198】Re:EXCEL上からPDFを開く方法(パスワー...
回答  Abyss  - 12/6/19(火) 14:28 -

引用なし
パスワード
   ご質問の件は解決可能ですが、
この作業の前後を繋ぎ合わせる事は
既に済んでいますか?

何かと言いますと、
常にPDFファイルのパスワード問い合わせWindowが
立ち上がった時点でVBAをスタートさせるのですか?

通常ですと、セルダブルクリックでPDFファイルを
開く命令を発し、もしそこでパスワードを聞かれたら
何かの文字列を入力したい。。。とのことかと。

【72199】Re:EXCEL上からPDFを開く方法(パスワー...
お礼  食う・寝る・走る  - 12/6/19(火) 15:28 -

引用なし
パスワード
   ▼とおりすぎ さん:
>クラス名"#32770"っていっぱいあるから、FindWindowの引数lpWindowNameも
>していするとか。
親・子クラス共にlpWindowNameで値指定したところ、無事にパスワードボックスに
パスワードが転記できました。ありがとう御座います。

>Dim lngWindowTextBuffer   As String * 255
確かに文字数確保する必要は無いと思います。

spy++でのクラスの関係をまとめておきます。
パスワードボックスが立ち上がると後にAcrobatのソフトが立ち上がっているため
パスワードボックスは"Adobe Acrobat Standard"の子クラスだと思いましたが、spy++で構造を調べるとそうではありません。

-00010014"" #32769(デスクトップ)
 l
 l_00030530"パスワード" #32770(ダイアログ)
 l   l_00010546""Edit
 l   l_00020548"OK"Button
 l   l_0002054A"キャンセル"Button
 l 
 l_00230308"Adobe Acrobat Standard" AdobeAcrobat
 l   l_
 l   l_
 l   l_

【72200】Re:EXCEL上からPDFを開く方法(パスワー...
お礼  食う・寝る・走る  - 12/6/19(火) 16:16 -

引用なし
パスワード
   ▼Abyss さん:
ファイル置き場に「図面番号=ファイル名」としてPDFを格納しています。
>この作業の前後を繋ぎ合わせる事は
>既に済んでいますか?
下記のマクロでPDFを開きパスワード要求BOXが出る所までは来ております。
path2:ファイルサーバー内のファイルの位置
CreateObject("WScript.Shell").Run Chr(34) & path2 & Chr(34), vbNormalFocus

>何かと言いますと、
>常にPDFファイルのパスワード問い合わせWindowが
>立ち上がった時点でVBAをスタートさせるのですか?
上記の処理の後に 後はパスワードの転記→OKボタンを押してPDFを開くことを考えております。

>通常ですと、セルダブルクリックでPDFファイルを
>開く命令を発し、もしそこでパスワードを聞かれたら
>何かの文字列を入力したい。。。とのことかと。
御推測の通りです。
セルには図面番号が表示されていてダブルクリックで開く流れにしたいと思います。パスワードは、図面番号からそれなりのルールで分かりますので、VBA内に組み込みたいと思います。                  

【72201】Re:EXCEL上からPDFを開く方法(パスワー...
発言  Abyss  - 12/6/19(火) 17:04 -

引用なし
パスワード
   > CreateObject("WScript.Shell")....

命令に続くFindWindow間のタイミングが合っているのなら
問題ないでしょう。

【72212】Re:EXCEL上からPDFを開く方法(パスワー...
お礼  食う・寝る・走る  - 12/6/20(水) 14:22 -

引用なし
パスワード
   ▼Abyss さん:
> > CreateObject("WScript.Shell")....
>
>命令に続くFindWindow間のタイミングが合っているのなら
>問題ないでしょう。
言われるように、タイミング次第ですね。
アクロバットが立ち上がった後に
DoEvents
Sleep (500) '処理待ち
を設けないと、アクロバットの立ち上がる前に実行してしまうから、パスワードを渡してボタンを押す処理が出来ませんでした。
本来ならば、パスワードボックスが立ち上がったのを確認してから
後の処理に移れればいいのでしょうが。今の段階では良しとします・・・。

初めに実行したのと2回目に実行したのではアクロバットの立ち上がり時間が違うから考慮した待ち時間を設定する必要があるようです。

【72213】Re:EXCEL上からPDFを開く方法(パスワー...
発言  Abyss  - 12/6/20(水) 16:38 -

引用なし
パスワード
   > 初めに実行したのと2回目に実行したのではアクロバットの立ち上がり時間が違うから
> 考慮した待ち時間を設定する必要があるようです。

もし、厳しく管理したいのなら、APIの
GetGUIThreadInfo関数あたりが使えると
思います。

【72216】Re:EXCEL上からPDFを開く方法(パスワー...
お礼  食う・寝る・走る  - 12/6/21(木) 11:28 -

引用なし
パスワード
   ▼Abyss さん:
>もし、厳しく管理したいのなら、APIの
>GetGUIThreadInfo関数あたりが使えると

とりあえず、動いているので今はプログラム作成を先に進めます。

おそらく、今後 他のスペックの違うPCで実行するとウェイト時間設定値が異なると思いますので、GetGUIThreadInfo関数が必要になると思います。

アドバイス、たいへん参考になりました。
ありがとう御座います。

【72217】Re:EXCEL上からPDFを開く方法(パスワー...
発言  Abyss  - 12/6/21(木) 11:36 -

引用なし
パスワード
   事情のご説明、ありがとうございます。

あと、AcrobatReaderではなく、Acrobatアプリが
インストールされているなら、Acrobat Automationが
使えるので、そちらの方向もいいと思います。

ご参考までですので。
では。

1745 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free