アプリ版:「スタンプのみでお礼する」機能のリリースについて

vbaを使ってエクセルのセルのデータを起動済みの他のアプリケーション(以下他アプリ)に貼り付けたいと考えています。
具体的には、↓のようなものを作りたいと考えています。

Sub CopyCell()
 Cells(2, 1).Copy
 AppActivate ("タイトル")
 SendKeys "^v", True
End Sub

そこで上記のようにAppActivateを使用して他アプリをアクティブにしようと思っています。しかし、AppActivateに必要になる、他アプリのウィンドウのタイトルがそのときどきによって変わる為、それに対処したいのですがなかなかうまくいかず困っています。

調べたところによると、API関数のGetWindowTextを使用すればそれが可能であるとのことでした。ただ、私は完全な初心者なのでAPIの使用方法や複数同時起動しているアプリケーションの中からアプリだけを選ぶ方法がまったくわかりません。

どなたかおわかりになる方いましたらよろしくお願い致します。
具体的なソースを貼って頂けると大変助かります。

A 回答 (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

といった具合でしょう …

この回答への補足

具体的な内容で助かります。
大変申し訳ないんですが一つ条件を説明しそこねていました。

他アプリのタイトルは非常に把握しにくくなっています。
「0666 ABC          平成20年 処理済」
このような形式のタイトルで、ABCと平成の間のスペースの数を把握することができません。上述のタイトルで変わらないのは「平成」という部分だけです。

このマクロを使用する際、平成という文字を含むウインドウは他に使用しないので、タイトルが完全に一致していなくても、「平成」の文字をタイトルに含むウインドウに対してキーを送るようにできれば十分です。

このタイトルを把握しにくいという問題を解決するために考えている方法は現在2つあります。

■直接appactivateにタイトル名を入れる方法
なんらかの方法で完全なタイトル名を取得し、それを手打ちで直接マクロに入れます。
たとえば、「タイトル123」のような完全な形でタイトルを把握し、appactivate("タイトル123")で直接指示するような形です。これができると非常に楽です。

■教授していただいたような方法
平成の文字列をタイトルに含むウインドウに対してキーを送るような形式。


よろしくお願い致します。

補足日時:2008/03/19 15:09
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています