• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:WinXP,7のIE8にて新規セッションで起動)

WinXP,7のIE8で新規セッションでログインするVBAのコード

このQ&Aのポイント
  • VBAを使用してWinXPまたはWin7のIE8で新規セッションでウィンドウを起動し、Webサイトにログインする方法を教えてください。
  • 現在動かしているコードでは上手く動かないため、explore.exe -noframemergingを使用して新規セッションでIEを起動する方法を組み込みたいです。
  • 現在使用しているコードでは、IEを起動し、IDとパスワードを入力してログインしています。どなたか助けてください。

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

  • ベストアンサー
noname#212058
noname#212058
回答No.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 (以下省略)  

Lily0
質問者

お礼

回答ありがとうございます! サンプルコードをコピーして入力しましたら無事に新規セッションでIEが起動してくれて、Outlookもスルーしてくれて、ログインまで問題無く起動してくれました! 長期間にわたってご指導頂き、ホントにありがとうございました! 年末までに作成することができてとても嬉しいです! ホントにありがとうございました!

その他の回答 (6)

noname#212058
noname#212058
回答No.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    変数をウオッチで確認して、「値」と「型」に表示される内容の確認    をお願いします。

Lily0
質問者

お礼

回答ありがとうございます! 早速指示を頂いた通りにやってみましたところ、IEの起動は指示頂いた3通り全部エラーで上手く起動してくれませんでした。こちらでいろいろと弄ってみましたら、 IEProcessId = Shell("C:\Program Files\Internet Explorer\iexplore.exe -noframemerging http://") という形で起動することができました!これで大丈夫でしょうか? 次に指示頂いた通りにコードを修正してうごかしてみたのですが、同じエラーで止まってしまいましたので、Exploreをウォッチで確認してみましたところ、 値が空欄で何も入っておらず、 型がVariant/Object/WebBrowser_V1 と表示されていました。 よろしくお願いします(_ _;)

Lily0
質問者

補足

いろいろやってるうちにMicrosoftOutlookを起動していたからエラーがでて止まっていたようです! Outlookを落とした状態だと上手く動いてくれました! Outlookが起動していても動くようにしたいのですが、できますでしょうか…?^^; 何度も申し訳ありませんが、よろしくお願いします…>_<…

noname#212058
noname#212058
回答No.5

回答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)ブロックの中に 入れずに、外に記述してください。

Lily0
質問者

お礼

回答ありがとうございます! ご指示頂いた通り確認してみたところ、 (1).IEは起動するのですが、表示されるHPが『Request Error(invalid_request)』という画面になってしまい、Googleも含めてどのURLも開けない状態です。 (2).もう一度サンプルコードを全てコピーしてご指示頂いた通りコードの位置も確認してやってみたのですが、Call GetWindowThreadProcessIdのところでエラーが発生して『実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。』と出て止まってしまいます。 お手数ですがよろしくお願いします…><;

noname#212058
noname#212058
回答No.4

回答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 (以下省略)

Lily0
質問者

お礼

こんなにも詳しくサンプルコードまで回答ありがとうございます! さっそくサンプルコードを参考に入力してみました! 入力して起動してみたところ、なぜか IEProcessId = Shell("""C:\Program Files\Internet Explorer\iexplore.exe"" -noframemerging ""http://""") のところでHPを開くときにエラーが出てしまい、コード自体は動いているようなのですが、HPを開いてくれませんでした。 HPのアドレスも間違っていないか確認しましたが、特に間違っている様子はありませんでした...。 その後、 Call GetWindowThreadProcessId(Explore.hwnd, CurrentProcessId) でオブジェクトが必要ですとのエラーがでてしまい、これ以上コードが進みません...。 何度も申し訳ありませんが、初めて見るコードばかりでヘルプを見てもよくわからず、助けてくれると嬉しいです。

noname#212058
noname#212058
回答No.3

回答No.1です。 Call IE.navigate2("http://", &H8000) でお願いします。

Lily0
質問者

お礼

早速のご回答ありがとうございます! 指示頂いた通りに変更しましたらコンパイルエラーはなくなったのですが、値を変更しても新規セッションでIEが起動せず、一つ目に開いてログインした情報を引き継いだままになり、二つ目ではログイン画面に行くことができませんでした。 最初に起動したIEでログインした後に、新規セッションで別IDを使ってログインは難しいのでしょうか…?

noname#212058
noname#212058
回答No.2

回答No.1です。 すいません。16進数の指定を誤ってました。 × IE.navigate2 "http://" 0x8000 ○ IE.navigate2 "http://" &H8000 先の回答のページに記載されている値を試す時も、 先頭の 0x を &H に変更してください。

Lily0
質問者

お礼

引き続きの回答ありがとうございます! 先程試してみたのですが、『&H8000』にて起動しようとすると前回と同じくステートメントの最後というコンパイルエラーが発生してしまい、上手く動きませんでした。 値を変更したり、『& H8000』とスペースを入れてみたりもしましたが、値を変更した場合はコンパイルエラーが発生、&の後ろにスペースを入れた場合はエラーは発生しませんでしたが、今と変わらず現在ログインしている情報を引き継いだままIEが起動し、新規セッションでの起動はできませんでした。 他にもなにか対応策はあったりするのでしょうか…? あれば何でも試してみようと思いますので、教えて頂けると嬉しいです。

noname#212058
noname#212058
回答No.1

IE.navigate "http://" を IE.navigate2 "http://" 0x8000 としてみたらどうでしょう。 それでダメなら、以下のページを参考に 0x8000 のところに 指定する値を変えて試してみてください。

参考URL:
http://msdn.microsoft.com/ja-jp/library/aa768360%28v=vs.85%29.aspx
Lily0
質問者

お礼

回答ありがとうございます! 早速指示頂いた通りに変更してみたのですが、コンパイルエラーが発生してしまい、値を変更しても動きませんでした。 他にもなにか対応策があれば教えて頂けると助かります。

関連するQ&A

専門家に質問してみよう