- ベストアンサー
WinXP,7のIE8で新規セッションでログインするVBAのコード
- VBAを使用してWinXPまたはWin7のIE8で新規セッションでウィンドウを起動し、Webサイトにログインする方法を教えてください。
- 現在動かしているコードでは上手く動かないため、explore.exe -noframemergingを使用して新規セッションでIEを起動する方法を組み込みたいです。
- 現在使用しているコードでは、IEを起動し、IDとパスワードを入力してログインしています。どなたか助けてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
回答No.1 です。 どうやらあと一歩のところまで来たようですね。 ○IEの起動 ⇒ IEが起動して、HPが表示されたのであれば、その記述で OK です。そもそもの目的である『新規セッションで起動』 になっていたでしょうか? ○Call GetWindowThreadProcessIdのところでエラー ⇒ 何が邪魔しているのかと思ったら、Outlookでしたか…。 コードに直してみたので、こちらで試してください。 ------------------------------------------------------------ ' 指定されたウィンドウを作成したスレッドの ID を取得するAPI関数 ' http://msdn.microsoft.com/ja-jp/library/cc364779.aspx Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, ByRef ProcessId As Long) As Long Public Sub ろぐいん() ' IE を起動 Dim IEProcessId As Long ' 起動した IE のプロセスID IEProcessId = Shell("C:\Program Files\Internet Explorer\iexplore.exe -noframemerging http://") ' 起動した IE を探す Dim IE As Object Dim ShellObject As Object Set ShellObject = CreateObject("Shell.Application") Do While True ' ShellWindows のリストを取得し、その中から起動したIEを探す For Each Explore In ShellObject.Windows() ' 取得した ShellWindows のリストからIE, Explorer を抽出(Outlookを排除) If TypeName(Explore) = "IWebBrowser2" Then ' プロセスIDを取得 Dim CurrentProcessId As Long Call GetWindowThreadProcessId(Explore.hwnd, CurrentProcessId) ' 起動した IE のプロセスIDと比較 If CurrentProcessId = IEProcessId Then ' 見つけた IE のオブジェクトを回収 Set IE = Explore ' IE が見つかったので、Whileループを抜ける Exit Do End If End If Next ' ここに処理が来たときは、IEが見つからなかった ' (まだIEが起動中の場合は見つけることができない) ' 1秒待ってリトライする Call Application.Wait(Now + TimeValue("00:00:01")) Loop Set ShellObject = Nothing ' ここから先は元のコードが使えます ' 文字入力 IE.document.getElementById("ID").Value = UserID IE.document.getElementById("PASS").Value = UserPass (以下省略)
その他の回答 (6)
回答No.1 です。 すいません、質問者さんの環境が WindowsXP であることを 見落としてました。サンプルは Windows7 で確認していたの で、それで動かないのかもしれません。こちらに WindowsXP がないので、正直苦しいですね…。 ○IEは起動するのですが、表示されるHPが~(以下略) ⇒ まずは Google くらいは表示できるようにしないと先に進 みません。まずは『コマンドプロンプト』で以下のコマンド を1行ずつ実行してみてください。それぞれ IE が開いて Google が表示できますか? "C:\Program Files\Internet Explorer\iexplore.exe" -noframemerging "http://www.google.co.jp" "C:\Program Files\Internet Explorer\iexplore.exe" -noframemerging http://www.google.co.jp "C:\Program Files\Internet Explorer\iexplore.exe" http://www.google.co.jp 表示できる場合は、URL を表示したいHPに変えて試してください。 # 3つのコマンドのどれも表示できない場合は、ちょっと対処不能 # かもしれません。 ○Call GetWindowThreadProcessIdのところでエラーが~(以下略) ⇒ こちらで検証ができないのであてずっぽうですが… Call GetWindowThreadProcessId(Explore.hwnd, CurrentProcessId) を Call GetWindowThreadProcessId(Explore.HWND, CurrentProcessId) に変えてみてください。 それでダメなら、このコードにブレークポイントを置いて、Explore 変数をウオッチで確認して、「値」と「型」に表示される内容の確認 をお願いします。
お礼
回答ありがとうございます! 早速指示を頂いた通りにやってみましたところ、IEの起動は指示頂いた3通り全部エラーで上手く起動してくれませんでした。こちらでいろいろと弄ってみましたら、 IEProcessId = Shell("C:\Program Files\Internet Explorer\iexplore.exe -noframemerging http://") という形で起動することができました!これで大丈夫でしょうか? 次に指示頂いた通りにコードを修正してうごかしてみたのですが、同じエラーで止まってしまいましたので、Exploreをウォッチで確認してみましたところ、 値が空欄で何も入っておらず、 型がVariant/Object/WebBrowser_V1 と表示されていました。 よろしくお願いします(_ _;)
補足
いろいろやってるうちにMicrosoftOutlookを起動していたからエラーがでて止まっていたようです! Outlookを落とした状態だと上手く動いてくれました! Outlookが起動していても動くようにしたいのですが、できますでしょうか…?^^; 何度も申し訳ありませんが、よろしくお願いします…>_<…
回答No.1 です。 > 入力して起動してみたところ、なぜか > IEProcessId = Shell("""C:\Program ~以下省略 > のところでHPを開くときにエラーが出てしまい、 > コード自体は動いているようなのですが、HPを > 開いてくれませんでした。 おや? このコードを実行すると IE が起動して HP が表示 されるはずですが、どこまで成功しているでしょうか? ・IE が起動しない ⇒ C:\Program Files\Internet Explorer\iexplore.exe が質問者さんのパソコンに存在するか確認してください ・IEは起動するがHPが表示されない ⇒ いったん指定する URL を http://www.google.co.jp/ に変更して実行してみましょう。Google は表示され ますか? > Call GetWindowThreadProcessId( ~以下省略 > でオブジェクトが必要ですとのエラーがでてしまい サンプルの『--------』の行と『Public Sub ろぐいん()』 の行の間にあるコード『Private Declare Function~』も コピーされているでしょうか? このコードがコピーされて いないとそのエラーが発生します。 このコードはプロシージャのコード(Sub)ブロックの中に 入れずに、外に記述してください。
お礼
回答ありがとうございます! ご指示頂いた通り確認してみたところ、 (1).IEは起動するのですが、表示されるHPが『Request Error(invalid_request)』という画面になってしまい、Googleも含めてどのURLも開けない状態です。 (2).もう一度サンプルコードを全てコピーしてご指示頂いた通りコードの位置も確認してやってみたのですが、Call GetWindowThreadProcessIdのところでエラーが発生して『実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。』と出て止まってしまいます。 お手数ですがよろしくお願いします…><;
回答No.1です。 私が先に提案した方法では実現がかなり面倒そうということが わかりましたので、方針を転換します。以下にサンプルコード を作ってみましたので、こちらを参考にしてみてください。 注1) このサンプルでは、IEの起動に失敗した場合は無限ループが 発生してフリーズ状態になります。その問題の対処は、まぁ、 そちらで工夫してください。------------------------------------------------------------ ' 指定されたウィンドウを作成したスレッドの ID を取得するAPI関数 ' http://msdn.microsoft.com/ja-jp/library/cc364779.aspx Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, ByRef ProcessId As Long) As Long Public Sub ろぐいん() ' IE を起動 Dim IEProcessId As Long ' 起動した IE のプロセスID IEProcessId = Shell("""C:\Program Files\Internet Explorer\iexplore.exe"" -noframemerging ""http://""") ' 起動した IE を探す Dim IE As Object Dim ShellObject As Object Set ShellObject = CreateObject("Shell.Application") Do While True ' エクスプローラのリストを取得し、その中から起動したIEを探す For Each Explore In ShellObject.Windows() ' 候補のエクスプローラのプロセスIDを取得 Dim CurrentProcessId As Long Call GetWindowThreadProcessId(Explore.hwnd, CurrentProcessId) ' 起動した IE のプロセスIDと比較 If CurrentProcessId = IEProcessId Then ' 見つけた IE のオブジェクトを回収 Set IE = Explore ' IE が見つかったので、Whileループを抜ける Exit Do End If Next ' ここに処理が来たときは、IEが見つからなかった ' (まだIEが起動中の場合は見つけることができない) ' 1秒待ってリトライする Call Application.Wait(Now + TimeValue("00:00:01")) Loop Set ShellObject = Nothing ' ここから先は元のコードが使えます ' 文字入力 IE.document.getElementById("ID").Value = UserID IE.document.getElementById("PASS").Value = UserPass (以下省略)
お礼
こんなにも詳しくサンプルコードまで回答ありがとうございます! さっそくサンプルコードを参考に入力してみました! 入力して起動してみたところ、なぜか IEProcessId = Shell("""C:\Program Files\Internet Explorer\iexplore.exe"" -noframemerging ""http://""") のところでHPを開くときにエラーが出てしまい、コード自体は動いているようなのですが、HPを開いてくれませんでした。 HPのアドレスも間違っていないか確認しましたが、特に間違っている様子はありませんでした...。 その後、 Call GetWindowThreadProcessId(Explore.hwnd, CurrentProcessId) でオブジェクトが必要ですとのエラーがでてしまい、これ以上コードが進みません...。 何度も申し訳ありませんが、初めて見るコードばかりでヘルプを見てもよくわからず、助けてくれると嬉しいです。
回答No.1です。 Call IE.navigate2("http://", &H8000) でお願いします。
お礼
早速のご回答ありがとうございます! 指示頂いた通りに変更しましたらコンパイルエラーはなくなったのですが、値を変更しても新規セッションでIEが起動せず、一つ目に開いてログインした情報を引き継いだままになり、二つ目ではログイン画面に行くことができませんでした。 最初に起動したIEでログインした後に、新規セッションで別IDを使ってログインは難しいのでしょうか…?
回答No.1です。 すいません。16進数の指定を誤ってました。 × IE.navigate2 "http://" 0x8000 ○ IE.navigate2 "http://" &H8000 先の回答のページに記載されている値を試す時も、 先頭の 0x を &H に変更してください。
お礼
引き続きの回答ありがとうございます! 先程試してみたのですが、『&H8000』にて起動しようとすると前回と同じくステートメントの最後というコンパイルエラーが発生してしまい、上手く動きませんでした。 値を変更したり、『& H8000』とスペースを入れてみたりもしましたが、値を変更した場合はコンパイルエラーが発生、&の後ろにスペースを入れた場合はエラーは発生しませんでしたが、今と変わらず現在ログインしている情報を引き継いだままIEが起動し、新規セッションでの起動はできませんでした。 他にもなにか対応策はあったりするのでしょうか…? あれば何でも試してみようと思いますので、教えて頂けると嬉しいです。
IE.navigate "http://" を IE.navigate2 "http://" 0x8000 としてみたらどうでしょう。 それでダメなら、以下のページを参考に 0x8000 のところに 指定する値を変えて試してみてください。
お礼
回答ありがとうございます! 早速指示頂いた通りに変更してみたのですが、コンパイルエラーが発生してしまい、値を変更しても動きませんでした。 他にもなにか対応策があれば教えて頂けると助かります。
お礼
回答ありがとうございます! サンプルコードをコピーして入力しましたら無事に新規セッションでIEが起動してくれて、Outlookもスルーしてくれて、ログインまで問題無く起動してくれました! 長期間にわたってご指導頂き、ホントにありがとうございました! 年末までに作成することができてとても嬉しいです! ホントにありがとうございました!