戻る  □一般操作のサロン  □ 使用方法  □ 新着記事  □ 新規に質問する!  □ トピック一覧  □ 検索  □ 過去ログ
[ 最新記事及び返信フォームをトピックトップへ ]
このトピック参照回数 :
同時に開いている他のアプリケーションファイル名の取得

    [189441] 同時に開いている他のアプリケーションファイル名の取得-

    ■親トピック/記事引用/メール受信=OFF■

    □投稿者/ ことり -(2019/06/04(23:37))
    □U R L/

      どうか教えてください。

      エクセルファイルと同時に開いている、PDFファイルのファイル名を取得する方法がありますでしょうか。
      PDFのタイトルバーに表示されているタイトルを取得して、エクセルファイルのセルに取り込みたいのです。
      お分かりになる方、ご教示の程、宜しくお願い致します。




    [189442] Re[1]: 同時に開いている他のアプリケーションファイル名の取得-

    記事引用/メール受信=OFF■

    □投稿者/ 河童どきあ -(2019/06/05(04:52))
    □U R L/
      ご参考。
      
      APIを使用することになるかと思います。
      以下をそのまま張り付けて、「ウィンドウ一覧取得」を実行してみてください。
      ※エクセルのバージョンは32bitという前提です。
      
      現在開いているウィンドウ(非表示なども含む)の
      タイトルバーの文言を全て取得し、
      エクセルシートのE列に書き出します。
      
      
      
      '--------------------------
      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 GetWindowText Lib "user32.dll" Alias "GetWindowTextA" ( _
      ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
      Private Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" ( _
      ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
      Private wSht As Excel.Worksheet
      Private lRow As Long
      Public Sub ウィンドウ一覧取得()
        Set wSht = Workbooks.Add.Worksheets(1)
        lRow = 0
        GetHWndEnum 0, 0
        Set wSht = Nothing
        MsgBox "完了", vbInformation
      End Sub
      Private Sub GetHWndEnum(ByVal index As Integer, ByVal hWnd As Long)
        Dim hChld As Long
        hChld = 0
        Do
          hChld = FindWindowEx(hWnd, hChld, vbNullString, vbNullString)
          If hChld = 0 Then
            Exit Do
          End If
          lRow = lRow + 1
          wSht.Cells(lRow, 1).Value = index
          wSht.Cells(lRow, 2).Value = hWnd
          wSht.Cells(lRow, 3).Value = hChld
          wSht.Cells(lRow, 4).Value = GetClass(hChld)
          wSht.Cells(lRow, 5).Value = GetText(hChld)
        Loop
      End Sub
      Private Function GetText(ByVal hWnd As Long)
        Dim buf As String
        buf = String(256, vbNullChar)
        GetWindowText hWnd, buf, 256
        GetText = Mid(buf, 1, InStr(1, buf, vbNullChar) - 1)
      End Function
      Private Function GetClass(ByVal hWnd As Long)
        Dim buf As String
        buf = String(256, vbNullChar)
        GetClassName hWnd, buf, 256
        GetClass = Mid(buf, 1, InStr(1, buf, vbNullChar) - 1)
      End Function
      '--------------------------
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [189448] Re[2]: 同時に開いている他のアプリケーションファイル名の取得-

    記事引用/メール受信=OFF■

    □投稿者/ ことり -(2019/06/05(23:40))
    □U R L/

      河童どきあさん、迅速なご回答ありがとうございました。

      たいへん大掛かりなもので、ちょっとびっくりしましたが、
      ご親切に考えてくださったのがよく分かって、すごくうれしかったです。感謝致します。

      しかし実行してみると、確かに目的のPDFファイル名は取得されますが、
      それ以外に、なんだか見たこともないような英語が、ザザッと130行くらい現れました!

      いや、これではちょっと取得され過ぎなんで、贅肉を取り除いて、
      シンプルにPDFファイルのタイトル名のみ取り出す方法はないでしょうか?

      APIについてあまり詳しくないので、コードを一行ずつネットで調べながら吟味したのですが、
      なかなか自力では進展がおぼつかないです。

      ご教示よろしくお願いします。




    [189449] Re[3]: 同時に開いている他のアプリケーションファイル名の取得-

    記事引用/メール受信=OFF■

    □投稿者/ 河童どきあ -(2019/06/06(06:32))
    □U R L/
      取得したい行のD列の値(文字列)を
      hChld = FindWindowEx(hWnd, hChld, vbNullString, vbNullString)
      の第3引数に指定してください。
      
      例)エクセルのタイトルバーのみ取得したい場合
      
      E列にエクセルのタイトルバーの文字列が出力されている行の
      D列の値は「XLMAIN」になっているかと思います。
      
      提示のプログラムを
      hChld = FindWindowEx(hWnd, hChld, "XLMAIN", vbNullString)
      に書き換えて実行すると、
      エクセルのタイトルバーの文字列のみが出力されるようになります。
      
      
      例)Adobe Acrobat Reader DCのタイトルバーのみ取得したい場合
      
      E列にAdobe Acrobat Reader DCのタイトルバーの文字列が出力されている行の
      D列の値は「AcrobatSDIWindow」になっているかと思います。
      
      提示のプログラムを
      hChld = FindWindowEx(hWnd, hChld, "AcrobatSDIWindow", vbNullString)
      に書き換えて実行すると、
      Adobe Acrobat Reader DCのタイトルバーの文字列のみが出力されるようになります。
      
      
      ※PDFファイルをどのアプリケーションを使用して開いているかによって
       指定する文字列は変わります。
      
      
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [189453] Re[4]: 同時に開いている他のアプリケーションファイル名の取得-

    記事引用/メール受信=OFF■

    □投稿者/ ことり -(2019/06/06(21:14))
    □U R L/
      いけました!バッチリです。
      
      少し改良して、なんとかタイトルだけ取り出すことに成功しました。
      やりました。どうもありがとうございます。
      
      出来たのですが、後学のため、いくつか質問してもよろしいでしょうか。
      なにせ、疑問に思ったままほおっておくと、気になって眠れそうもないという困った性分なので・・・。
      
      @実行すると、別のエクセルブックで開きます。
       Set wSht = Workbooks.Add.Worksheets(1)あたりでしょうが、
       別ブックで開かずに、そのままのブックのアクティブセルに取得するにはどうすればよいでしょうか?
      
      AA列からE列にズラっと出てきたものは、いったい何なのですか?
       D列はタスクマネージャーに表示されているものかと思いましたが、
       CiceroUIWndFrame、DSUI:FloatContainerなど、見なれないものがたくさんあります。
       C列の桁数の多い数字も、得体が知れません。
      
      Bbuf = String(256,vbNullChar)とありますが、この「256」という数字は何でしょうか?
      
      何度も失礼します。宜しくお願いします。


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [189455] Re[4]: 同時に開いている他のアプリケーションファイル名の取得-

    記事引用/メール受信=OFF■

    □投稿者/ sy -(2019/06/06(22:07))
    □U R L/
      河童どきあさん
      
      「AcrobatSDIWindow」は「Adobe Acrobat Reader DC」のクラス名では無いでしょうか。
      開いているpdfファイルの各タスクのクラス名は、「TaskBarTabMessage_Receiver_Window」と思います。
      
      
      後wordがインストールされてる環境なら以下でも良いかも知れません。
      Sub test()
          Dim Task1, Task2, i As Long
          Set Task1 = CreateObject("Word.Application")
          Cells.Clear
          For Each Task2 In Task1.Tasks
              If InStr(Task2.Name, ".pdf") > 0 Then
                  i = i + 1
                  Range("A" & i).Value = Left(Task2.Name, InStr(Task2.Name, ".pdf") + 3)
                  Range("B" & i).Value = Task2.Name
              End If
          Next
          Task1.Quit
          Range("A:B").RemoveDuplicates Array(1, 1)
          MsgBox "完了"
      End Sub
      ことりさんのActiveSheetと言うのを見逃してたので、出力先をActiveSheetに修正。(22:21)
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [189478] Re[5]: 同時に開いている他のアプリケーションファイル名の取得-

    解決!!ありがとうございました! / 記事引用/メール受信=OFF■

    □投稿者/ ことり -(2019/06/10(00:17))
    □U R L/

      syさん、ご回答ありがとうございました。

      なるほどCreateObject関数を使う方法もありましたか。
      WordVBAを使うやりかたですね。
      私のPCには・・・、幸運にもWordが入ってました!
      さっそく試してみると、こちらでも出来ました!
      こちらのほうが、比較的初心者にも分かりやすい方法でしょうか。
      教えてくださってありがとうございました。


      河童どきあさん、迅速なご回答ありがとうございました。

      新しく知った方法で、たいへん勉強になりました。
      教えてくださってどうもありがとう。感謝しております。



このトピック内容の全ページ数 / [0]

このトピックに書きこむ
Name/
E-Mail/

└>このツリーのレス記事をメールで受信しますか? YES/ NO/
Title/
URL/
Comment/ 通常モード->  図表モード-> (←の場合適当に改行を入れて下さい)
タグが使用できます。例 ⇒ <font color="blue">文字</font>
解決!!ありがとうございました! 解決       保留中です・・・ 保留        迷宮入りorほかあたって見ます・・ 迷宮入       すいませ〜ん。誰か〜! Help! ←※回答者専用
解決したらチェック       保留(コードテスト中など・・)         解決不可orレスが全く付かなくてほかのサイトに行くときなど・・
削除キー/
(半角8文字以内) 


- Child Forum -
Edit:ゆう-G