解決済み

Excel VBAでアプリのウィンドウ名取得

  • 困ってます
  • 質問No.6997365
  • 閲覧数4647
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 77% (47/61)

WindowsXP, Excel2007で、ExcelからIE8にキーコードを送りたいです。
ネットで拾った以下のコードにより、

Option Explicit

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Function activate_win(win_name As String) As Long
Dim hwindow As Long
hwindow = FindWindow(vbNullString, win_name)
If hwindow <> 0 Then SetForegroundWindow hwindow
activate_win = hwindow
End Function

Call activate_win("ウィンドウ名")
Sendkeys "ABC", True

のような形で、メモ帳での動作は確認したのですが、
IEだとウィンドウがアクティブになってくれません。

おそらくウィンドウタイトルを間違えているのだと思われますが、
全角半角などを変えてみたりしても、どう見比べてみても間違いがわかりません。
見た目ではわからない、似た文字だが違うということではないかと思っています。

そこで、開いているアプリのウィンドウ名すべてをメモ帳に書き出すような
(あるいは任意のアプリにペーストできるようにするような)コードはないでしょうか?

よろしくお願いします

質問者が選んだベストアンサー

  • 回答No.1

ベストアンサー率 75% (9/12)

hzd00430様

こんばんわ。IE限定なら、こんな感じでタイトルをゲットできますよ。
(ウィンド名 = タイトルという仮定の話ですが...)
外してたら、ゴメンナサイ。


Sub Test()
Dim objShell As Object, i As Variant, cnt As Integer

'シェルオブジェクトを作成
Set objShell = CreateObject("Shell.Application")

cnt = objShell.Windows.Count

'全ウィンドウをループ
For i = cnt - 1 To 0 Step -1

If TypeName(objShell.Windows((i)).document) = "HTMLDocument" Then
'タイトルを表示
MsgBox objShell.Windows((i)).document.Title
End If
Next i

End Sub
お礼コメント
hzd00430

お礼率 77% (47/61)

ありがとうございます。タイトルの文字列が得られました。
その文字列を使ってCall activate_winをしたところ、
無事IEをアクティブにすることができました。

ただ、ウィンドウ名としては、タイトルに続くアプリケーション名(- Windows Internet Explorerの部分)が得られないのですね。
今後の参考まで、可能でしたらウィンドウ名そのものを得る方法があれば知りたいです。
投稿日時 - 2011-09-09 08:57:04

その他の回答 (全1件)

  • 回答No.2

ベストアンサー率 75% (9/12)

こんばんわ。

>ただ、ウィンドウ名としては、タイトルに続くアプリケーション名(- Windows Internet Explorerの部分)が得られないのですね。
>今後の参考まで、可能でしたらウィンドウ名そのものを得る方法があれば知りたいです。


色々チャレンジしてみたのですが、私の能力ではできませんでした orz...

ちなみに objShell.Windows((i)).FullName とすると、そのウィンドウを起動しているソフトのEXEファイルのフルパスが得られます。
例えばIEだと「C:\Program Files\Internet Explorer\iexplore.exe」が返ってきます(Win7の場合です)
アプリケーション名であれば、これを使うのも一案かなぁと思います。

あと蛇足ですが、当方IE9なのですが「- Windows Internet Explorer」が表示されなくなりましたね。(私のPC環境だけかな?)
お礼コメント
hzd00430

お礼率 77% (47/61)

わざわざお手数をおかけして申し訳ありません。

何しろ win_activate に渡す引数を得るのが目的なものですから、ウィンドウ名そのものを得たいなぁと思ってまして。
ですから、実行ファイル名が得られてもちょっと使えません(^^;;

> 「- Windows Internet Explorer」が表示されなくなりましたね。

そうなんですか?ウィンドウ名が「(開いているファイル等)- (アプリケーション名)」という形式なのはWindowsのシェル全体の話だと思ってました(Officeソフトやメモ帳や、大抵のアプリはそういう形式だったので)。でもそうなってないアプリもありますね。
投稿日時 - 2011-09-12 12:52:23
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


OKWAVE若者応援スペシャル企画

ピックアップ

ページ先頭へ