[三流君]
[VBAで楽しく]
[VBA IE 操作]
−−> No.170 IE Aタグのリンク先を.Click(クリック)してみた
IE Aタグのリンク先を.Click(クリック)してみた
発行内容
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> <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でした。
フィードバック
VBA系の→[掲示板]←を覗く、質問を書き込む
評価・感想
ページフッター(リンクや広告など)
[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます
広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列
書籍の購入
Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??
コンピュータ書籍の発送がハヤイ専門店
コンピュータの本・専門店
|
※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり
|
amazon.co.jpでキーワード別チェック
下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・