• ベストアンサー

ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法

●やりたいこと ExcelVBAで、APIを実行し、外部ソフトのウィンドウに含まれている エディットテキストを取得して、セルに出力したい 使用する関数・宣言、できればコードを教えていただけませんでしょうか。 イメージはこちらをご参考いただけると幸いです。 ​http://situmon-img.blogspot.com/2008/08/1.html​ 変数hwindowに親ウィンドウのハンドルが取得されています。 エディットボックスのハンドル、IDは分かりません。 エディットボックスのハンドルを取得し、 分かっているクラス・ハンドルの文字列を取得 といった流れになるのではと思っております。 変数にさえ文字列が取得できれば、 当然ですが、Range("B2")=変数 で大丈夫です。 変数は、ひとつを使いまわしで構いません。 変数をエディットテキストの数だけ用意しても構いません。

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

  • ベストアンサー
回答No.3

あの QNo.4256138の質問でも、同じ様な事を質問されていたと思います。 出来たらそちらで質問された方がよかったのではと思います。 テキストボックスの取得も、私の回答した全く同じ方法で 取得出来ると思います。クラス名が Edit になるだけです。  EnumChildWindows(hWnd,lpEnumFunc,0&) は、親ウィンドウに含まれる 子ウィンドウがすべて返ってきます。ボタンもテキストボックスも、その他の 子ウィンドウがすべて、何個あっても、取得できます。 ただ EnumChildWindows(hWnd,lpEnumFunc,0&) で与える子ウィンドウを 受け取る関数は、コールバック関数なので、1回のコールで1個の子ウィンドウ しか返ってきません。ただ、子ウィンドウがある分だけ何度も同じ関数が 呼び出されます。よび出される度に  GetClassName(hWnd,lpClassName,nMaxCount) でクラス名を取得し クラス名が Edit ならテキストボックスになります。 SendMessage(テキストボックスハンドル, &HD, 240, ByVal cbuf) で cbuf にテキストボックスの文字が取得出来ます。 尚、cbuf は文字長を多い目に事前に確保しておきましょう。 cbufのNULL値までが実際の文字となります。 また、コールバック関数はデバッグモードで、ブレークさすと、 フリーズするので注意して下さい。通常はデバッグしにくいので、 コールバック関数内では、配列変数にハンドルをためこんでいきます。 その後で、配列にためこんでいるハンドルを順番にクラス名を取得し テキストがボタンか判断していきます。

emson100
質問者

お礼

度々ご返答いただき誠にありがとうございます。 具体的で即使えるように記載いただき非常に助かります。 基本を勉強してないのでエラーしまくりですが、何とか進めております。

その他の回答 (3)

回答No.4

#3の回答者です。 EnumChildWindows(hWnd,lpEnumFunc,0&) で登録した子ウィンドウを 受け取る関数は、その関数を終了する時に TRUE を返す様に しないと、全ての子ウィンドウのハンドルを受け取れませんので 注意して下さい

noname#259269
noname#259269
回答No.2

No.1の回答者です。 誤: FindWindowEx の第二パラメータに設定します) 正: FindWindowEx の第4パラメータに設定します) です。失礼しました。

noname#259269
noname#259269
回答No.1

まず、Spy++ や フリーウェア(Winspectorなど)を使って、エディットボックスのクラス名かキャプション名を得てください。 その後、FindWindowEx API を使って親から階層を手繰ってください。 例えば、親の1階層下に "Frame"クラスのコントロールがあり、さらにその中に対象とするエディットボックス "Edit" が存在するとしたら、 hFrame = FindWindowEx(親ハンドル, 0, "Frame", 0) hEdit = FindWindowEx(hFrame, 0, "Edit", 0) (尚、クラス名ではなくウィンドウキャプションで取得する場合は、FindWindowEx の第二パラメータに設定します) ここまできたら、あとは Dim strText As String strText = Space(2048) SendMessage(hEdit, WM_GETTEXT, strText, Len(strText)) strText = Left(strText, Len(strText)-1) strText = Trim(strText) という感じになるかと思います。 考え方だけですので適宜微調整はお願いしますね。

emson100
質問者

お礼

具体的な例ありがとうございます。 取得した後の詳しい説明、本当にありがとうございます。 参考に試行錯誤しております。

関連するQ&A