[[20130516115449]] 『VBAでIE操作』(あや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

 『VBAでIE操作』(あや)

 2003 XP  IE9

 あまり詳しくないため説明がわかりにくかったらすみません

 別会社に委託したシステムがあり、
 作られた環境はIE9
 HTMLとjavascriptで作られています。

 そこでVBAからIEの操作が出来るので、
 単純な作業は組んでしまえないかなと思い
 試行錯誤しております。

 作業している流れは、
 システムのURLにアクセス
 ↓
 ログインIDをテキストボックスに表示
 ↓
 ログインボタン押す

 ここまでは出来ました。

 Set objIE = CreateObject("InternetExplorer.Application")
 objIE.Visible = True   
 objIE.Navigate "□□□ "   ’システムへのパス

    For Each obj In objIE.Document.forms(0)
        If obj.Name = "User" Then
            obj.innerText = "000"
            Exit For
        End If
    Next

    For Each obj In objIE.Document.getElementsByTagName("input")
        If obj.ID = "roguinButton" Then
            obj.Click
            Exit For
        End If
    Next

 無事にログイン後の画面が開くので、次の作業に入りたいのですが

 ウォッチ式で確認していた、
 obj.ID の値が
 <オートメーション エラーです。
 起動されたオブジェクトはクライアントから切断されました。 >
 となり取得できずにいます。

 考えたこととしては、
 ログイン後の画面がNewPage?というのか、
 リンク先URLを新しいウィンドウで開いている感じで
 objIEの値がクリアされてしまっているのではないかと思っています。

 以下はよく参考にさせてもらっているページです
http://www.ken3.org/vba/backno/vba163.html
 しかしどのようにしたら今の環境で使えるのかわからずにいます

 リンク先のNewPageの
 objIEの情報を取りたいのですが、どのようにしたら良いでしょう。

 IE の表示状態が切り替わったタイミングで、変更前のオブジェクトは(objIEは別)使用
 できなくなります。
 マクロは画面の状態を常に把握しながら動作する必要があります。
 ログオン後は新しいウィンドウ(もしくは新しいタブ)が開くのですか?もしくはログオンの
 ウィンドウの中身が違う内容になるのでしょうか。

 別ウィンドウであれば、objIE 自体も別のものを指す必要があります。タブが異なる場合も
 それを指定する処理が必要です。
 後者であれば objIE 自体は変わりないので、そのまま使用できます。
 (Mook)

 Mookさんありがとうございます
 わたしの文章では足らない部分がありすみません、

 ログオン後は
 ログイン画面は閉じて、新たにIEが開いています。
 同じIE内にタブが作られるわけではないようです。

 今の状況です

 新たに開いたウィンドウのURLが取得できたら
 なんとかなるかな?と思い方法を検索していて

[[20091129091530]] 『VBAでieのアクティブなタブの情報を取得するには』(d_ue)

 を見つけました。

 しかしIE9では動かないようです。

 また何かありましたら教えてください

 (あや)

ログイン後、新たな画面をポップアップさせるとは考えにくいので、表示書き換えが
終わるのを待たずにHTML解析しようとして、何も見つからない現象かも知れません。

ボタンクリック後に、以下の1行を追加して、更新完了待ちしてみてください。

    Call sWait(obj)

以下のルーチンも併せて追記。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

 Sub sWait(OBJ As Object)
    Sleep 1000
    While OBJ.readyState <> 4
        While OBJ.Busy = True
            DoEvents
            Sleep 100
        Wend
    Wend
    Sleep 1000
End Sub

(???)


 ???さんありがとうございます

 教えて頂いた記述を
 ログインボタンを押した後に追加してみました。

 しかし結果は同じく、
 obj.ID の値が
 <オートメーション エラーです。
 起動されたオブジェクトはクライアントから切断されました。 >
 となります。

 画面の更新がついてきているか確認しながら
 デバッグで1行づつも進めてみましたが
 結果は同じでした。

 >新たな画面をポップアップさせるとは考えにくい
 そうでしたか…

 なにか検証方法がないかなと試してみました
 タスクマネージャのアプリケーションタプを表示させ、
 システムを起動、ログインしたところ
 タスクにIEのアイコンが新たに追加されることなく
 現在あるログインのアイコンが、ログイン後のIE画面と変化していましたので
 ???さんのおっしゃるように
 新たな画面をポップアップしているわけではないと思いました。

 こんな確認方法で良いのかわかりませんけど…

 また何かありましたら教えてください。

 (あや)

ステップ実行でも駄目でしたか。

次案として、直接ログイン後の画面を表示してみる事はできないでしょうか?
HTMLを調べて、ログインボタンを押した後に、どのようなURLを実行しているか。
おそらく、ログイン名等を追加した形になっているはずなので、それをVBAから直接
開くのです。

ただ、ログインの際にセッションID等を発生させる場合も多いので、この場合は
ログインは今のままで行い、その後に改めてボタン後のURLを開く形になります。
(???)


 取りあえず、こんなのでさらってみると、そのウィンドウも含まれてきますか?

 Sub detect()
   Dim Windw As Object

      For Each Windw In CreateObject("Shell.Application").Windows
           Debug.Print Windw.LocationURL
      Next
 End Sub

 (半平太) 2013/05/16(Thu) 16:20

 上の経緯を読んでいると、同じウィンドウのように思えるのですが、
 最初のコードの最後に

    MsgBox "新しいウィンドウの表示が完了したら OK を押してください。"
    objIE.Visible = False
    Sleep 2000
    objIE.Visible = True

 を追加したら、その新しいウィンドウは2秒間消えるでしょうか。エラーが出るでしょうか。
 コードのあるモジュールの先頭に
 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 も追加してください。

 消えて見えるようでしたら、操作だけの問題だと思います。

 IE の表示内容が変わった場合、
 >obj.ID の値が
 ><オートメーション エラーです。
 は当然の動作(ユーザ認証フォームは消えるので)だと思いますので、これは気に
 しないほうがよいと思います。
 (Mook)

 ???さんありがとうございます

 >ログイン名等を追加した形になっているはずなので、
 はい。そのとおりです。

 ログイン後に、
    objIE.Navigate " " ログイン後表示されている画面のアドレス

 を記述し、実行すると

 3種類の動きがあり…

 1
 再度ログイン画面になる
 1行デバッグすると、追加したobjIE.Navigate のところを読み込むと
 ログイン画面になっているようです

 2
 「システムエラーです」というメッセージがIE上に表示される
 IEのエラーではなくシステムが出力しているエラーのよう

 3
 ログイン後の画面が表示されているだけで、無反応

 検証の余地ありですが、ひとまずの報告とさせて頂きます

 半平太さんありがとうございます

 含まれてきます
 次に確認することがあれば教えてください。

 Mookさんありがとうございます

 >追加したら、その新しいウィンドウは2秒間消えるでしょうか。
 消えていませんでした

 ログイン後の画面のobjIEが変数なしになっているため、
 visibleが設定できていないようです

 (あや)

 あら、そうですか。
 だとすると、IE が別起動しているのでしょうか。

 確認するには、いろいろな方法があると思いますが、タスクマネージャが使えるようでし
 たら、「プロセス」タブで「表示」⇒「列の選択」で PID にチェックを入れ、
 ログオン画面表示時の iexplore.exe の PID を控えておき、別起動していれば ログオン後
 にこれが変わると思います。

 これが変わっているのであれば、半平太さんがやっているような方法で、該当ウィンドウ
 を探し、それを制御するなどが対応方法でしょうか。
 「GetObject VBA IE」などで検索するとサンプルが見つかるかな?
 (Mook)

 > 半平太さんありがとうございます
 > 含まれてきます
 > 次に確認することがあれば教えてください。

 そう云うことでしたら、問題のWindwに辿りついたら、
 そのWindowをObjIEに代入して操作を続行できませんか?

  Sub detect1()
       Dim Windw As Object
       Dim ObjIE As InternetExplorer
       For Each Windw In CreateObject("Shell.Application").Windows
            If Windw.LocationURL = "問題となっているWindowのもの" Then
              Set ObjIE = Windw
              Exit For
            End If
       Next
       'got It
  End Sub

 (半平太) 2013/05/16(Thu) 19:23

 Mookさん 
 PIDは初めて知りました
 教えてくれてありがとうございます

 しかし、ログイン画面を出しても
 IEXPLORE.EXEという項目があがってこないのです

 サーバーに関して全くの素人なんで曖昧ですが…
 クラウドシステムを採用しているようで
 仮想のパソコン上にIEが開いている状態なのかな?と
 考えております。

 曖昧なままの書き込みですみません。

 半平太さん ご丁寧にありがとうございます
 教えて頂いた記述でアドレスを取得しIEの中身も取れました
 進めてみます^^

 また何かありましたら教えてください

 (あや)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.