タイトル : Re^5: withEventsで生成したInternetExplorerが捕捉できない 投稿日 : 2015/04/10(Fri) 18:15 投稿者 : 魔界の仮面弁士
これ、実際のコードをそのまま貼った物では無いですよね。 実行するまでも無くコンパイルエラーになりそうな箇所さえありますし…。 それはさておき: > Private WithEvents objIE as InternetExplorer フォームモジュールレベルの変数「objIE」と > Private sub Command1_Click > Dim objIE As Object プロシージャーレベルの変数「objIE」が競合していますよね。 ですから、Command1_Click 内で幾ら objIE を参照しても、 それは WithEvents 変数とは無関係になってしまう、ということです。 このコードには、他にもいろいろな問題点を抱えていますが、とりあえず 今回の主題である WithEvents の件から片付けてしまいましょうか。 そのためにまずは、For Each で使われているループ変数と、 WithEvents のための変数を、別の変数名に置き換えることから はじめてみてください。 > 既に開いていたらそれを、なければNavigateとしたいのですが まず、この仕様自体もかなり曖昧になっていますよ。 たとえば、IE が 2 つ起動されていたと思ってください。 A は Apple、B は Google を表示している状態です。 ここで新たに、Microsoft のサイトを開きたいとした場合、 (1) A で開く(Apple のサイトは見えなくなる) (2) B で開く(Google のサイトは見えなくなる) (3) C で開く(新たにもうひとつ IE を開く) (4) A または B で開く(既存のウィンドウのいずれかで開く) のどれにしたいのでしょうか? 仮に(4) だとしたら、A と B を区別する必要は無いので、 LocationURL や HWND の出番は無いはずです。 一方、(1) や (2) だとするのなら、どういう時に A (あるいは B)を 選択するのか明らかにしてもらわないと、仕様が曖昧すぎて回答できないです。 とはいえ、「極力同じ IE を使い続ける」のが目的なのだとすれば、 WithEvents 変数一つだけで事足りますので、そもそも For Each は不要となります。 さて、問題は (3) のケース。もしもこのパターンを望んでいるんだとしたら、 再度、同じURL(Microsoft のサイト)を開きなおしたい場合に、 (5) C を再利用してそこに Navigate (6) C とは別に D のウィンドウを開く のどちらにしたいのかが、今までの質問からは読み取れませんでした。 もし (6) なのだとしたら、そもそも For Each での列挙は不要でしょう。 常に新しい IE を起動するだけなので、WithEvents も For Each も不要で、 毎回 OpenIE を呼び出すだけで事足ります。 一方 (5) の場合はどうかというと、これは現状のコードでは不十分に見えます。 たとえばユーザーが、A で Apple ではなく Microsoft を表示し始めてしまい、 C では Microsoft ではなく、Amazon に遷移させていたとします。 この場合、LocationURL で判断すると、C ではなく A で Navigate しちゃいますよね。 その場合は A で表示したい、というのであればそれでも良いですが、 問題は先ほど表示した C で表示させたいケース。LocationURL に加えて HWND を 併用すれば良いかといえば、これも怪しいところ。一つの IE 上で複数のタブが開かれていた場合、 同じウィンドウハンドルを持つ複数の InternetExplorer が存在することがありえるからです。 もし、HWND も LocationURL も合致するウィンドウが複数あったら、 そのなかのどれを Navigate するのか、曖昧なままですよね。 |