[三流君] [VBAで楽しく] [VBA IE 操作]
−−> No.170 IE Aタグのリンク先を.Click(クリック)してみた

IE Aタグのリンク先を.Click(クリック)してみた

概要:
フレームの先のJavaScriptの起動ができなくて、
苦肉の策で
フレームの先のリンク先オブジェクトを探して
.Click(クリック)して逃げました。

※メルマガ記事ではオブジェクトの参照設定をしていませんができれば、下記を参考に参照設定してください。
[Microsoft Internet Controls,Microsoft HTML Object Library を参照設定する](このほうが開発時、操作時に楽)
また、VistaとIE7の場合は、 [IE7 操作 Vistaで失敗]も参考にしてください。

リンク 分類: [Document(文章)からデータを取得] / [Form入力処理] / [Linkリンク情報] / [Image画像情報] / [Frameフレーム処理] サンプル: [IEを使ったVBAのサンプル] / [小さなVBAでIE操作のコード]

メルマガ発行内容

やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。

IE Aタグのリンク先を.Click(クリック)してみた

どうも、三流プログラマーのKen3です。

今回は、
IE で フレームの先のJavaScriptの起動にチャレンジしてみます。
といっても、.Runや.Scriptは攻略できなくて、逃げたんだけどね。

/* * 1. 今回のキッカケ */

掲示板にいただいた質問 --- >Ken3さんの「InternetExplorer操作 Frameと遊ぶ Objectを探る方法」 >にて以下のようなコードがありますよね。 >----------------------------------------------------------- >Sub ie_test_2() > > Dim objIE As Object '型は何でも来い、得意のObject型 > > 'インターネットエクスプローラーのオブジェクトを作る > Set objIE = CreateObject("InternetExplorer.application") > objIE.Visible = True '見えるようにする(お約束) > > 'フレームページを表示する > objIE.Navigate "http://www.ken3.org/vba/test116.html" > > '表示終了まで待つ > Do While objIE.Busy = True > '何もしないループ(笑) > DoEvents > Loop > > 'TOPのオブジェクトから項目まで.で行く(笑) > objIE.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3" > objIE.Document.frames("F_RIGHT").Document.all("pass").Value = "aaa" > >End Sub >--------------------------------------------------- > >これを参考にして自動ログインからフレームのテキストボックスに >文字を代入する所までは出来たのですが、最後にJavaScriptを動かす >所がうまくいきません。 > >objIE.navigate "javascript:******()" →ダメ >objIE.Document.frames("F_RIGHT").***** →ダメ --- と質問をもらった。 javascriptかぁ・・・ 前に、 No.162 IE データセット後、JavaScriptを起動する http://www.ken3.org/vba/backno/vba162.html で Me.WebBrowser1.Document.scripts(n) とか、scriptsがスクリプトオブジェクトだから、 これを.RUNとかないかなぁと探ってみましたが、 目的の処理が見つかりませんでした。 そこで、 <a href = "JavaScript:parts('B')">〜 とリンクになっているから、それだったら、 .Navigate2 "JavaScript:parts('B')" でOKなのか?って発想でテスト実行して逃げてたっけ・・・

/* * 2.あれでできるんじゃない?と無責任な腰高の先輩達 */

上司や先輩は経験豊富なので聞いてみると、無責任な回答をもらったりする。 下記、私の無責任な回答 ---- >タイトル:.fireEventでイベントを発砲できたらいいな > >> objIE.navigate "javascript:******()" →ダメ >> objIE.Document.frames("F_RIGHT").***** →ダメ > >もし、JavaScriptが ><DIV align=right><SELECT onchange=Rdp(); name=JYO> > <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR> ><TR> ><TD><B>レース</B><BR> ><DIV align=right><SELECT onchange=Hdp(); name=Race> > <OPTION value=0 selected>選択項目 </OPTION></SELECT></DIV></TD></TR> > >みたいに、 >onchange >とかイベントに割り当たっていたら、 >.fireEventなんてメソッドがあったり。 > >No.155 IE SELECT後 .fireEventでJavaScriptのイベントを起動 >http://www.ken3.org/vba/backno/vba155.html > >↑を参照してください。 > >そのまま起動だったら・・う〜ん。。。 > >htmlを見てないのでなんともいえませんが、 --- なんて回答してました。 まるで腰高の内野手みたいな一歩も動く気ない回答だ。 ※サッカーの腰高ディフェンダー、バスケの棒立ち選手って感じかな。 いつから自分が嫌いな歳だけ高い(プライドも高い)プログラマーになっちまったんだ、 動けよコラ、ボール(質問)に真剣に飛びつけよと思いつつ・・・ (※自分から動けなくなった先輩プログラマーって...イヤだけど自分がなるとは・・) >htmlを見てないのでなんともいえませんが、 けっ、プログラムや解説は三流でも、 できない時の予防線のハリカタは超一流ですね。 ~~~~~~~~~~~~~~~~~~ (※できないのを認めたくない、プライドだけが高いプログラマーって嫌だよね。   見習いたくないけど私みたいな先輩達が一部に居るのも(多い?)のも事実だったり)

/* * 3.重い腰を上げ、テスト環境を作る */

いつもの自己嫌悪に落ちつつ、もっと親切な回答しなきゃと思っていたら、 質問者よりソースの一部をもらう(ボールが飛んできた) ----- >フレームを指す "objIE.Document.frames("F_RIGHT")."に >"FireEvent"、"navigate"を組み合わせて何回も試してみたのですが。 >とにかくInternetExplorerの操作は初めてなので、すべて試行錯誤の >状態です。 > >ちなみにソースはこんな感じです。 >-------------------------------------------------------- ><b>顧客番号</b></font>&nbsp;&nbsp;<input TYPE="TextBox" size="6" Name="number" Id="Job" maxlength="8"> > </font><font FACE="Verdana, arial, geneva" COLOR="#000000" SIZE="2"> ><b><a HRef="JavaScript:gonumber();">検索</a></b></font></td> >--------------------------------------------------------- > >"number"に数字を代入する所までは出来ています。 >あとはJavaScript:gonumber()動かせれば・・という所です。 ----- a タグで JavaScript:gonumber() へ飛んでるのね。 こいつを攻略するかぁ。 環境を相手から教わったので、まずテスト環境を作ります。 ※いい先輩・上司のテクニックって、  質問して来た後輩から、状況をうまく聞きだすんだけど、  私はなんとなくうまく聞き出せなかったり。 ※※使えないプライド高い先輩予備軍でプライド高い新人プログラマー、   なかなか状況を聞き出しにくい、そんな後輩も居るのでいい先輩も難しいんだけど 今日は余談が長い、もっと短く要点をまとめてください。。。 左右のフレームを呼び出すメインのHtmlを作成します。 test170main.html <html> <HEAD> <TITLE>三流君 VBAで楽しくプログラミング</TITLE> </HEAD> <frameset COLS="160,*" FRAMEBORDER=1 BORDER=1 FRAMESPACING=0> <frame SRC="http://www.ken3.org/vba/menu-vba.html" NAME="F_MENU"> <frame SRC="http://www.ken3.org/vba/test170f.html" NAME="F_RIGHT"> </frameset> </html> 次にテストで使う(問題のフレーム)htmlを作成します。 test170f.html <HTML> <head> <title>A タグでJavaScriptを起動するHTML</title> </head> <BODY BGCOLOR="#ffffff"> <h1>A タグでJavaScriptを起動するHTML</h1> リンク先を押すとJavaScriptが起動します <br> <FORM name=test> <TABLE BORDER="1"> <tr> <td><b>顧客番号</b></td> <td><input TYPE="TextBox" size="6" Name="number" Id="Job" maxlength="8"></td> <td><a HRef="JavaScript:gonumber();">検索</a></td> </tr> <tr> <td><b>担当者番号</b></td> <td><input TYPE="TextBox" size="6" Name="tanto" Id="Tan" maxlength="8"></td> <td><a HRef="JavaScript:tanto();">検索</a></td> </tr> </TABLE> </FORM> <script type="text/javascript"> <!-- //ここからJavaの関数を書いてみる function gonumber(){ // gonumber 検索が押された時に alert("gonumberが呼ばれたよ、何か処理するよ"); } function tanto(){ // tanto 検索が押された時に alert("tantoが呼ばれたよ、何か処理するよ"); } // --> </script> <hr> </BODY> </HTML> と、簡単なテストプログラムを書いてみました。 http://www.ken3.org/vba/test170main.html ↑テストのHTMLを実行してみてください。

/* * 4.一緒に失敗してみる(同じ目線で失敗してみる)・・・ */

上から(安全な場所から)、いいかげんなことを言うのではなく、 同じ目線で(同じ失敗で)はじめてみたいと思います。 ※居るんだよね口では偉そうなこと言ってて、現場に来ると(現状を把握すると)  こりゃ大変だ、予算が、納期が・・と担当者以上にあわてるヤツが・・・ まずは、 http://www.ken3.org/vba/test170main.html を読み込んで、 JavaScript:gonumber()を試してみます。
Sub ie_test_001()

    Dim objIE    As Object '型は何でも来い、得意のObject型

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    'フレームページを表示する
    objIE.Navigate "http://www.ken3.org/vba/test170main.html"

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    '↑ステータスを見ないとフレームの場合は良くないよ、、、

    'TOPのオブジェクトから項目まで.で行く(笑)
    objIE.Document.frames("F_RIGHT").Document.all("Job").Value = "4649"
    objIE.Document.frames("F_RIGHT").Document.all("Tan").Value = "114"

    'JavaScriptを起動する
    objIE.Navigate "JavaScript:gonumber()"

End Sub
ポイントは無く、 'JavaScriptを起動する objIE.Navigate "JavaScript:gonumber()" を+して、テストしてみた。 データはセットされるけど無反応?かよ?と思ったら、下のステータスバーに ページでエラーが発生しましたと出てますね。 そのまま .Navigate "JavaScript:gonumber()"はダメなのね。 同じ目線に立って簡単には、できないことがわかった。 .fireEventもイベントでJavaScriptを起動してないし、 単なるクリックで起動だしなぁ。 まだまだ、同じ目線に立ってないよオマエハマダコシダカなんだよ。 えっ、同じ目線に立って、同じツラサを味わって見たってば自分なりに。 それは、担当者と同じ目線だろ、開発担当者の気持ちがわかっただけだろコラ!!! 相手側、客先担当者(ここではIE自身かな)の気持ちになって考えてみろよ。 ※意外と難しいのが立場によって見方が違ったり、 自分側だけじゃなくて、相手側に立って自分を見るってことも必要。 ※時には使う人の立場(開発中はOSや言語の立場とか??) フレームを扱っているアプリケーションIE様から見たら、 .Navigate "JavaScript:gonumber()" ってなんだ? 私は(test170main.htmlは)、フレームのソースしか知らないよ、 どこに飛べって言ってんだよ って感じなんだろうなぁ。 私をコントロールしたかったら、 人間と同じようにマウスを移動させてクリックしろって??? 言ってるの?API使って自動に? そんなこと言ってないでしょ!!! クリックしろって自分でも言ってるでしょ。

/* * 5..links(リンク先を探し) .Click してみた */

クリックしろ??? どうやって?? No.97 InternetExplorer.application操作 .Clickでクリック http://www.ken3.org/vba/backno/vba097.html データをフォームに objIE.document.all.userid.Value = "Ken3" 'ユーザー名 objIE.document.all.pass.Value = "aaa" 'パスワード でセットして、その後、 objIE.document.all.btn01.Click 'クリックメソッドを実行 単純にクリックメソッドを実行して、自動ログイン処理を作成しました。 とか、言ってるジャン。 だからそれは、フォームのボタンだからクリックできるんでしょ。 あっそ。リンクのアンカーは(Aタグは)クリックできないんだ。 リンク先へ飛ぶ時はいつもクリックしてるけどね。 あまりイジメナイデ下さいよ。ってことは、 あっでも、 <td><a HRef="JavaScript:gonumber();">検索</a></td> とかで名前が付いていません。残念です。 なんですぐにあきらめるかなぁ。 名前が付いてなきゃ私を(IEを)操作できないのかよオマエは(プログラマーは)。 No.148 IE ラジオボタン(RADIO)の.Checkedと.Clickの違い http://www.ken3.org/vba/backno/vba148.html INPUT Type=RADIO(ラジオボタン)のオブジェクトに対して、 .Checkedだとイベントが起動しないが、 .ClickだとonClickのイベントが起動する、 そんな違いの話を少し書いてます。 この中で、 '区分を探してセットする For Each objITEM In objIE.document.all '.allからオブジェクトを探す '名前がsentakuで値がa?のラジオボタンを探す If objITEM.TAGName = "INPUT" Then 'まず、タグでINPUTか判断 Debug.Print objITEM.Name 'TESTで値を表示 Debug.Print objITEM.Value 'TESTで値を表示 '↓の条件でクリックするオブジェクトを探す If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then objITEM.Click '素直にクリックしてみた(笑) Exit For '目的の処理が終わったので、ループを抜ける End If End If Next と、タグの名前と値を探して.Clickしてました。 だとすると、フレームのドキュメントからリンク情報を取り出し、 探したオブジェクトに対してクリック(.Click)すれば、起動するのかな??? リンク先を探すのは、 No.71 IE操作 リンク先を取出す .Document.links(i).href http://www.ken3.org/vba/backno/vba071.html で、 objIE.Document.links.Length でリンクの数を取得できるので、 'リンク数分まわす For i = 0 To objIE.Document.links.Length - 1 Cells(nYLINE, "A") = "'" & objIE.Document.links(i).outerText Cells(nYLINE, "B") = "'" & objIE.Document.links(i).href Cells(nYLINE, "C") = "'" & objIE.Document.links(i).outerHTML nYLINE = nYLINE + 1 'セット位置を+1する Next i と objIE.Document.links(i).outerText objIE.Document.links(i).href objIE.Document.links(i).outerHTML をそれぞれセットしてみました。 これを使って、links(i).Clickしてみますか。
Sub ie_test_002()

    Dim objIE    As Object '型は何でも来い、得意のObject型

    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True '見えるようにする(お約束)

    'フレームページを表示する
    objIE.Navigate "http://www.ken3.org/vba/test170main.html"

    '表示終了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
    Loop
    '↑ステータスを見ないとフレームの場合は良くないよ、、、

    'TOPのオブジェクトから項目まで.で行く(笑)
    objIE.Document.frames("F_RIGHT").Document.all("Job").Value = "4649"
    objIE.Document.frames("F_RIGHT").Document.all("Tan").Value = "114"

    'フレームのドキュメントを変数に保存して、
    'リンクのアンカーオブジェクトをクリックする
    Dim n As Integer
    Dim objFDOC As Object  'フレームのドキュメントを保存する
    Set objFDOC = objIE.Document.frames("F_RIGHT").Document '代入
    'リンク情報からオブジェクトを探し.Clickする
    For n = 0 To objFDOC.links.Length - 1 'リンク数分まわす
        Debug.Print objFDOC.links(n).href 'デバックで表示する
        'リンク先(.href)をチェックする(文字列比較する)
        If objFDOC.links(n).href = "javascript:gonumber();" Then
            objFDOC.links(n).Click  '.Clickでクリックしてみた
            Exit For  '見つかったので強制的にループを抜ける
        End If
    Next n
    
End Sub
処理のポイントは Dim objFDOC As Object 'フレームのドキュメントを保存する と1つ変数きって、 Set objFDOC = objIE.Document.frames("F_RIGHT").Document '代入 で、フレームのオブジェクトを代入しておいて、 ループでリンク情報.linksを探ります。 'リンク情報からオブジェクトを探し.Clickする For n = 0 To objFDOC.links.Length - 1 'リンク数分まわす Debug.Print objFDOC.links(n).href 'デバックで表示する 'リンク先(.href)をチェックする(文字列比較する) If objFDOC.links(n).href = "javascript:gonumber();" Then objFDOC.links(n).Click '.Clickでクリックしてみた Exit For '見つかったので強制的にループを抜ける End If Next n ↑今回比較するのは飛び先の文字列でjavascript:gonumber();を探してます。 最大のポイントは.hrefの比較は、ソースそのままじゃなくって中身が javascript:gonumber(); javascript:tanto(); になっていることに注意・・Debug.Print objFDOC.links(n).hrefで気が付いたよ <td><a HRef="JavaScript:gonumber();">検索</a></td> だから、そのままJavaScriptの大文字のまま、 If objFDOC.links(n).href = "JavaScript:gonumber();" Then としたいけど、 If objFDOC.links(n).href = "javascript:gonumber();" Then が正解

/* * 6.終わりの挨拶 */

今回は、 フレームの先の <td><a HRef="JavaScript:gonumber();">検索</a></td> を起動する、そんな話でした。 えっ、日頃の愚痴にしか聞こえなかったって? まぁ、前半に変な表現ありますが、気にしないでね。 そんなプログラマーの愚痴が見たい人は、 http://www.ken3.org/guchi/ ← 三流プログラマー 業務の愚痴 http://www.ken3.org/backno/backno_guchi_mokuji.html ←バックナンバー もヨロシクデス。 三流君VBAでInternetExplorer.Applicationを操作する(IE操作) http://www.ken3.org/cgi-bin/group/vba_ie.asp ↑にVBA IE操作系のメルマガまとめてます、こちらも一口どうぞ。 ※今回、かなりの複合技だったけど、1つ1つはなれれば簡単かなぁ。 全体的に斬新なテクニック系のネタじゃないのですが、 何か、感じ取ってくれると、うれしいです。 AB型の変わり者、三流プログラマーのKen3でした。

フィードバック

いろいろと別な切り口の方法もあるみたいなので...

Document.Script.setTimeoutもあるので試してみては?

objIE.Document.Script.setTimeout "javascript:コード", 200
みたいな感じで、Document.Script.setTimeoutでコードが実行可能でした。
Document.Script.setTimeoutを一度試してみてください
下記、実際のテスト動画です。よろしくお願いします。

ソースコードと簡単な解説は [蛇足 脱線 横道 VBScript IE操作 で javaScriptを実行 Document.Script.setTimeoutをテスト] をみてください。

ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

大分類:[Document.Forms(入力処理)] / [Document.Links(リンク情報)] / [Document.Images(画像情報)] / [Document.Frames(フレーム処理)]
サンプル・例題:[過去のメルマガ記事一覧] / [少し大きなIE操作サンプル] / [小さなコードでIE操作の動作確認]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[エクセル ユーザーフォームを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[エクセルからアクセスを操作する]・・・ExcelからAccessのマクロを起動してみました、
[エクセル関係 関数、その他]・・・その他Excel関係です

Access関係:
[アクセス ユーザーフォーム/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[アクセス レポート操作]・・・レポートを操作してみました
[アクセス クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [objIEを使用したサンプルコードを見る]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[トップページへ 戻る] / [VBA TOP] / [WebBrowser IEの操作 TOPへ]