CreateObjectを使用し、IEを起動するには?


たかし  2003-07-26 17:19:07  No: 78796  IP: [192.*.*.*]

たかしと申します。よろしくお願い致します。
お聞きしたいことは、以下のプログラムにより、IE(印刷プレビュー)を
起動しております。(ボタンを押すと以下のプログラムが動きます)

  Set IE = CreateObject("InternetExplorer.Application")
  IE.Navigate ファイル名                                 
  IE.ExecWB OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT

このプログラムだと、ボタンを押すたびに、新たなIEが起動してしまいます。
それを抑止したい(ボタンを押下しても新しいIEは起動せず、既に起動してる
IEに表示される)のですか、良い方法はありますでしょうか??

毎回、CreateObjectを行っているため、新たなIEが起動してしまいますが、
CreateObjectを行わないと、IEをcloseしてしまった場合、起動しなくなって
しまうため困っております。

ご存知の方がおりましたら、ご教授お願い致します。

編集 削除
シャノン  2003-07-26 17:37:17  No: 78797  IP: [192.*.*.*]

「既にプログラムが起動している場合はそれで開く」という処理は DDE を使うのがお約束かと。
DDE には詳しくないのでよくわかりませんが、IE は DDE サーバーになってますので、それでなんとかならんかなぁ、と。
どうにもならなかったらゴメンナサイ

編集 削除
魔界の仮面弁士  2003-07-26 18:14:15  No: 78798  IP: [192.*.*.*]

その IE 変数を、フォームモジュール等で
  Private WithEvents IE As InternetExplorer
のように宣言しておいてください。

IEが終了された場合は、
  Private Sub IE_OnQuit()
  End Sub
というイベントが発生します。
OnQuitが発生していない場合は、同じIEを使い回し、OnQuit後は
もう一度IEを起動しなおす、というコーディングになります。


もし、参照設定せずにコーディングしたい、という事であれば、
ShellWindowsコレクションオブジェクトを使ってみてください。
これを使えば、既に起動済みのInternetExplroerオブジェクトを
列挙する事ができますので、起動済みのIEを拾いなおす事ができます。

編集 削除
シャノン  2003-07-27 03:00:03  No: 78799  IP: [192.*.*.*]

いやはや、やはりロクに知らんことに口を出すべきではないですな。
いい加減なこと言って申し訳ありませんでした。

編集 削除
たかし  2003-07-30 09:50:32  No: 78800  IP: [192.*.*.*]

魔界の仮面弁士さん、シャノンありがとうございました。
自分でプログラムを作成し、試してみたいと思います。
本当にありがとうございました。

編集 削除
たかし  2003-08-06 16:09:25  No: 78801  IP: [192.*.*.*]

たかしです。よろしくお願いします。

魔界の仮面弁士さんに教えて頂いた方法で、試してみたところ
「型が一致しません」というエラーになってしましました。

Option Explicit

Private WithEvents IE As InternetExplorer

Private Sub Form_Load()
    'IEを起動しておきます
    Text1.Text = "http://www.google.co.jp/"
    Command1.Caption = "Click!"
    Set IE = CreateObject("InternetExplorer.Application")  ←ここです
    IE.Visible = True
End Sub

Private Sub Command1_Click()
    'テキストボックスで指定されたURLに移動します
    IE.Navigate2 Text1.Text
End Sub
                    ・
                    ・
                    ・

初歩的な質問かもしれませんが、ご教授お願い致します。

編集 削除
魔界の仮面弁士  2003-08-06 17:27:39  No: 78802  IP: [192.*.*.*]

『コンポーネントの追加』と『参照設定』を混同していないか確認してみてください。

例えば、コンポーネントの追加によって、『Microsoft Internet Controls』を
指定している場合(これはWebBrowserコントロールですね)、
先のCreateObjectからの代入動作は、型が異なるというエラーで失敗します。

しかし、(コンポーネントの追加ではなく)参照設定によって、
『Microsoft Internet Controls』を指定している場合は、
先のCreateObjectのコードが成功します。

編集 削除
たかし  2003-08-13 13:00:26  No: 78803  IP: [192.*.*.*]

魔界の仮面弁士さんありがとうございました。
無事、正常な動きを行えるようになりました。

ここでもう一つ質問があります。
今回の改善により一度IEを開いたら、2回目以降は常に
そのブラウザに表示するようになりました。

その際、IEが最小化されていた場合に、プログラムで
最大化し、表示する方法はあるでしょうか?
(IEが最小化されている場合だと、IEが小さく表示されてしまいます)

'マイナス値の場合は、最小化されている
If IE.Left < 0 And IE.Top < 0 Then
    'ここで行う処理です。
End If

ご存知の方がいらっしゃいましたら、ご教授お願いいたします。

編集 削除
魔界の仮面弁士  2003-08-13 17:23:44  No: 78804  IP: [192.*.*.*]

最小化されているかどうかを判断する IsIconic API
最大化されているかどうかを判断する IsZoomed API
最小化を解除してアクティブ化する   OpenIcon API
ウィンドウの表示状態を設定する     ShowWindow API

…などを利用してみてください。指定すべきウィンドウハンドルは、
InternetExplorerオブジェクトの HWND プロパティより取得出来ます。

編集 削除