• 締切済み

VBAでのタイトルバーの取得

vbaを使ってエクセルのセルのデータを起動済みの他のアプリケーション(以下他アプリ)に貼り付けたいと考えています。 具体的には、↓のようなものを作りたいと考えています。 Sub CopyCell()  Cells(2, 1).Copy  AppActivate ("タイトル")  SendKeys "^v", True End Sub そこで上記のようにAppActivateを使用して他アプリをアクティブにしようと思っています。しかし、AppActivateに必要になる、他アプリのウィンドウのタイトルがそのときどきによって変わる為、それに対処したいのですがなかなかうまくいかず困っています。 調べたところによると、API関数のGetWindowTextを使用すればそれが可能であるとのことでした。ただ、私は完全な初心者なのでAPIの使用方法や複数同時起動しているアプリケーションの中からアプリだけを選ぶ方法がまったくわかりません。 どなたかおわかりになる方いましたらよろしくお願い致します。 具体的なソースを貼って頂けると大変助かります。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

GetWindowTextでタイトルバーの文字列は取得出来ますが このAPIにはウィンドウハンドルが必要です このハンドルを取得するには EnumWindowsなどを使って取得しないといけません EnumWindowsはコールバック関数を使ってユーザーアプリケーションにウィンドウハンドルを返してきます 標準モジュールに以下を記述します Declare Function EnumWindws lib "user32" _ (ByVal lpEnumFunc, ByVal lParam as Long) as Long Declare Function IsWindowVisible Lib "user32" _ (ByVal hWnd as Long) as Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal Hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Public ssMyTitle as String Function myProc(ByVal as hWnd as Long, byVal lParam as Long) as Long   ' 非表示のウィンドウ以外を検索する   if IsWindowVisible( hWnd ) then     Dim ss as String, nLen as Long     ss = String( 255, vbNullChar )     nLen = Len( ss )     if GetWindowText( hWnd, ss, nLen ) > 0 then       ' ここで目的のタイトルかどうかを判断       ' 条件が成立するなら0を返す       if Left(ss, 5) = "MyTest" then         ssMyTitle = ss         myProc = 0         Exit Function       end if     end if   end if   ' 次を探すためには1を返す   myProc = 1 End Function 呼び出し側は Sub Macro1()   ssMyTitle = ""   EnumWindows Addressof myProc, 0   if ssMyTitle <>"" then     Cells(2,1).Copy     AppActivate ssMyTitle     Sendkeys "^v", True   end if End Sub といった具合でしょう …

puriketu9
質問者

補足

具体的な内容で助かります。 大変申し訳ないんですが一つ条件を説明しそこねていました。 他アプリのタイトルは非常に把握しにくくなっています。 「0666 ABC          平成20年 処理済」 このような形式のタイトルで、ABCと平成の間のスペースの数を把握することができません。上述のタイトルで変わらないのは「平成」という部分だけです。 このマクロを使用する際、平成という文字を含むウインドウは他に使用しないので、タイトルが完全に一致していなくても、「平成」の文字をタイトルに含むウインドウに対してキーを送るようにできれば十分です。 このタイトルを把握しにくいという問題を解決するために考えている方法は現在2つあります。 ■直接appactivateにタイトル名を入れる方法 なんらかの方法で完全なタイトル名を取得し、それを手打ちで直接マクロに入れます。 たとえば、「タイトル123」のような完全な形でタイトルを把握し、appactivate("タイトル123")で直接指示するような形です。これができると非常に楽です。 ■教授していただいたような方法 平成の文字列をタイトルに含むウインドウに対してキーを送るような形式。 よろしくお願い致します。