[VBAで楽しく No.177] - VBAからIE操作 TABLEの中にTABLE .getElementsByTagNameほか
三流君のメルマガの解除は(小涙)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
まぐまぐ読者の人は、 http://www.mag2.com/m/0000099159.htm
メルマガ天国の人は、 http://melten.com/m/12604.html
Melma!の人は、 http://www.melma.com/mag/26/m00034126/index_bn.html
それぞれの発行スタンドで、お手数ですがアドレス入力後、解除ボタンで(小涙)
====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*=
[ 三流君 VBAで楽しくプログラミング No.177 ] 2005/10/17 月曜日 発送予定
=*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====
三流プログラマーのKen3(AB型の変わり者)が不定期で
VBAを使ったプログラムを失敗談や指摘を受けながら、
面白おかしく解説する予定です。*初心者歓迎、気軽に質問下さい
HP : http://www.ken3.org/vba/
BackNo : http://www.ken3.org/backno/backno_vba_mokuji.html
掲示板 : http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi
*↑返事が遅いけど、初心者さん歓迎
weblog : http://ken3-info.blog.ocn.ne.jp/day/ ←blogにたまに更新情報UP中
----------------------------------------------------------------------------
<VBAからIE操作 TABLEの中にTABLE .getElementsByTagNameほか>
こんにちは。AB型の変わり者 三流プログラマーのKen3です。
今回は、
IE 操作系でTABLEの中にTABLEタグが存在する、
よくある話にチャレンジしてみます。
/*
* 1. 今回のキッカケ
*/
最近下記の質問をいただく
----
>[No.119 IEを使用して、Web上の表をExcelへ]において、
>頁によっては表以外の記述にもtableタグを多用しているものがありますが、
>欲しい表のみをExcelへ持ってくる方法(tableの見分け方)はありますか?
>
>具体的には、
>以下の例で試すと、メインの表だけでよいところ、workbookが25個もできました。
>http://table.yahoo.co.jp/t?c=2004&a=10&b=4&f=2005&d=10&e=14&g=d&s=4753.t&y=0&z=4753.t
----
あらら、不必要な表を取得してしまうんですね。
まぁ、レイアウトをきれいにするためにTABLEタグで細工したHTML多いからね。
/*
* 2.現象を再現する
*/
世の中には、いろいろなHTML FORMがあります。
まずは、現象を再現しますか。
No.119 IEを使用して、Web上の表をExcelへ
http://www.ken3.org/vba/backno/vba119.html
から、
>HTMLの表は、基本のパターンを書くと、
><TABLE>
> <TR>
> <TD>XXXXXX</TD>
> <TD>YYYYYY</TD>
> <TD>ZZZZZZ</TD>
> </TR>
></TABLE>
>と、
><TABLE>テーブルのタグから始まり、
><TR>行の開始
><TD>列のデータ(<TH>と見出しをキチント書いている人もありです)
>の
>3つの組み合わせと順番です。
なんて言ってるから、
<TABLE>の中に<TABLE>があると変な処理になるんだよね。
No.119を元に、
URLを変更して、Bookがいっぱいだとうざいのでシートの.addに変えたバージョン
Sub ie_make_table_test()
Dim objIE As Object 'IEオブジェクト参照用
Dim objTAG As Object 'TAGのオブジェクトを代入
Dim strURL As String 'URLの文字列
Dim y As Integer
Dim x As Integer
Dim objTableItem As Object 'TABLE内のITEM検索用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
strURL = "http://table.yahoo.co.jp/" 'ベースURL
strURL = strURL & "t?c=2004&a=10&b=4&f=2005&d=10" '期間
strURL = strURL & "&e=14&g=d&s=4753.t&y=0&z=4753.t" '銘柄コードなど???
objIE.Navigate strURL 'URLへ
'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'新規ブックを追加する
Workbooks.Add 'No.177で修正ブックを新規に1つ作る
'.body のデータをループする
For Each objTAG In objIE.document.body.all
'テーブルのタグを探す
If objTAG.tagName = "TABLE" Then
'新規シートを追加する
Sheets.Add 'No.177で修正、新規シートを作成する
'カウンタの初期化
y = 0 '行カウンタ
'テーブル内のITEMでループする
For Each objTableItem In objTAG.all
If objTableItem.tagName = "TR" Then
y = y + 1 '行カウンタを+1
x = 1 '列カウンタを1(左端にする)
End If
If objTableItem.tagName = "TD" Then
'テキストデータをセットする
Cells(y, x) = objTableItem.innerText
x = x + 1 '列カウンタを+1(次にする)
End If
Next
End If
Next
End Sub
実行すると、うわっ・・・シートがかなりの数出てきたよ・・・
こりゃここからデータをさらに手作業で編集するのはツライなぁ。
/*
* 3.テーブルの中の判断可能な項目名(固定なもの)を探す
*/
URLの先を見ると、
ライブドア、株価・・・
オイオイ、株価のデータ取り込みかよ。
これのサンプル作るとほかにもいろいろと質問来るんだろうなぁと思いつつ、
数あるテーブルの中で、ほしいのは、
日付 始値 高値 安値 終値 出来高 調整後終値*
の表なんですよねキット。
そこで、簡単な逃げ手としては、
TABLEタグを見つけたら、その要素の中に終値とか出来高なんて項目があるか、
探してみるのがいいのかなぁ。
要素を1つ1つ探すと大変なので、
手抜きで.InnerTEXTをInStr関数で
If InStr(objTAG.InnerText, "終値") > 0 Then
↑こんな感じでTABLEの中をチェックしてみます。
Sub ie_make_table_test()
Dim objIE As Object 'IEオブジェクト参照用
Dim objTAG As Object 'TAGのオブジェクトを代入
Dim strURL As String 'URLの文字列
Dim strTAGNAME As String 'タグの名前保存用
Dim y As Integer
Dim x As Integer
Dim objTableItem As Object 'TABLE内のITEM検索用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
strURL = "http://table.yahoo.co.jp/" 'ベースURL
strURL = strURL & "t?c=2004&a=10&b=4&f=2005&d=10" '期間
strURL = strURL & "&e=14&g=d&s=4753.t&y=0&z=4753.t" '銘柄コードなど???
objIE.Navigate strURL 'URLへ
'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'新規ブックを追加する
Workbooks.Add 'No.177で修正ブックを新規に1つ作る
'.body のデータをループする
For Each objTAG In objIE.document.body.all
'テーブルのタグを探す
If objTAG.tagName = "TABLE" Then
'TABLEの中、テキスト文字で[終値]があるか、チェックする No.177
If InStr(objTAG.InnerText, "終値") > 0 Then '終値見つかったか?
'新規シートを追加する
Sheets.Add 'No.177で修正、新規シートを作成する
'カウンタの初期化
y = 0 '行カウンタ
'テーブル内のITEMでループする
For Each objTableItem In objTAG.all
strTAGNAME = objTableItem.tagName 'テーブル、タグ名
If strTAGNAME = "TR" Then
y = y + 1 '行カウンタを+1
x = 1 '列カウンタを1(左端にする)
End If
'↓No.177でTHもセットするように変更 TD or THの時
If strTAGNAME = "TD" Or strTAGNAME = "TH" Then
'テキストデータをセットする
Cells(y, x) = objTableItem.InnerText
x = x + 1 '列カウンタを+1(次にする)
End If
Next
End If
End If
Next
End Sub
よし、OK...と思ったら、ほかにも2つ変なシートができてるよ・・・
/*
* 4.TABLEの中、InnerHTMLにTABLEが存在するか?
*/
原因は大外のワク(TABLE)の中でも、
InStr(objTAG.InnerText, "終値")
が存在すると判断してしまったみたいですね。
チョコレートやお菓子の多重包装、
箱の中にさらに個別の包装じゃないんだからさ・・
そこで、
InStr(objTAG.InnerHTML, "TABLE") = 0
とテーブルタグが見つからない、、と条件を+してみます。
※オイオイ、、なめんなよ、Instrだけだと、
もしTABLEって文字があったらどうすんの?
タグじゃなくてさ・・・
まぁ、今回は手抜きでInStrでTABLEの文字を探しますが、
汎用性のあるシステムでは、TABLEタグを探してくださいね。
TABLEの中、テキスト文字で[終値]があるか、子TABLEは無しかチェック
If InStr(objTAG.InnerText, "終値") > 0 _
And InStr(objTAG.InnerHTML, "TABLE") = 0 Then '終値在り、TABLE無しか
上記2行を+してみます。
Sub ie_make_table_test()
Dim objIE As Object 'IEオブジェクト参照用
Dim objTAG As Object 'TAGのオブジェクトを代入
Dim strURL As String 'URLの文字列
Dim strTAGNAME As String 'タグの名前保存用
Dim y As Integer
Dim x As Integer
Dim objTableItem As Object 'TABLE内のITEM検索用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
strURL = "http://table.yahoo.co.jp/" 'ベースURL
strURL = strURL & "t?c=2004&a=10&b=4&f=2005&d=10" '期間
strURL = strURL & "&e=14&g=d&s=4753.t&y=0&z=4753.t" '銘柄コードなど???
objIE.Navigate strURL 'URLへ
'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'新規ブックを追加する
Workbooks.Add 'No.177で修正ブックを新規に1つ作る
'.body のデータをループする
For Each objTAG In objIE.document.body.all
'テーブルのタグを探す
If objTAG.tagName = "TABLE" Then
'TABLEの中、テキスト文字で[終値]があるか、子TABLEは無しかチェック
If InStr(objTAG.InnerText, "終値") > 0 _
And InStr(objTAG.InnerHTML, "TABLE") = 0 Then '終値在り、TABLE無しか
'新規シートを追加する
Sheets.Add 'No.177で修正、新規シートを作成する
'カウンタの初期化
y = 0 '行カウンタ
'テーブル内のITEMでループする
For Each objTableItem In objTAG.all
strTAGNAME = objTableItem.tagName 'テーブル、タグ名
If strTAGNAME = "TR" Then
y = y + 1 '行カウンタを+1
x = 1 '列カウンタを1(左端にする)
End If
'↓No.177でTHもセットするように変更 TD or THの時
If strTAGNAME = "TD" Or strTAGNAME = "TH" Then
'テキストデータをセットする
Cells(y, x) = objTableItem.InnerText
x = x + 1 '列カウンタを+1(次にする)
End If
Next
End If
End If
Next
End Sub
これで、無事に終値を含む表を1つだけ取り出すことができました。
/*
* 5.だから、.getElementsByTagName使えよ
*/
ホント、三流君って、.ALLから1つ1つ.TAGNAMEとかで探すの好きだよね。
できたからいいでしょ、動けばあとはアレンジしてよ。。。
私の記憶が正しければ、過去のメルマガに、
No.164 IE .getElementsByTagNameでタグ指定 .Quitで閉じる
http://www.ken3.org/vba/backno/vba164.html
こんなのあったよね?
うん、あったよ。
.getElementsByTagName("TEXTAREA").Item(0).InnerTEXT
とこんな感じで、TEXTAREAのアイテムを取り出してたよ。
だったら、If文でTABLEを探さないで、
.getElementsByTagName("TABLE")
で、探してもらえば???
うるさいなぁ、もう!!!書けばいいんだろ、書けば。
(より良い方法を親切に教えられるとなぜかキレる子供プログラマー多いよね)
'.body のデータをループする
For Each objTAG In objIE.document.body.all
'テーブルのタグを探す
If objTAG.tagName = "TABLE" Then
こいつを
'.document から.getElementsByTagName("TABLE")でオブジェクトを取り出す
For Each objTAG In objIE.document.getElementsByTagName("TABLE")
の1行に書き換えられるって言いたいのかい?
こんな感じで、
.getElementsByTagName("TABLE")
で、テーブルオブジェクトのみを取り出して処理する方法がスマートかも。
※三流君的には.allから探すの好きだけどね。
Sub ie_make_table_test()
Dim objIE As Object 'IEオブジェクト参照用
Dim objTAG As Object 'TAGのオブジェクトを代入
Dim strURL As String 'URLの文字列
Dim strTAGNAME As String 'タグの名前保存用
Dim y As Integer
Dim x As Integer
Dim objTableItem As Object 'TABLE内のITEM検索用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
strURL = "http://table.yahoo.co.jp/" 'ベースURL
strURL = strURL & "t?c=2004&a=10&b=4&f=2005&d=10" '期間
strURL = strURL & "&e=14&g=d&s=4753.t&y=0&z=4753.t" '銘柄コードなど???
objIE.Navigate strURL 'URLへ
'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'新規ブックを追加する
Workbooks.Add 'No.177で修正ブックを新規に1つ作る
'.document から.getElementsByTagName("TABLE")でオブジェクトを取り出す
For Each objTAG In objIE.document.getElementsByTagName("TABLE")
'TABLEの中、テキスト文字で[終値]があるか、子TABLEは無しかチェック
If InStr(objTAG.InnerText, "終値") > 0 _
And InStr(objTAG.InnerHTML, "TABLE") = 0 Then '終値在り、TABLE無しか
'新規シートを追加する
Sheets.Add 'No.177で修正、新規シートを作成する
'カウンタの初期化
y = 0 '行カウンタ
'テーブル内のITEMでループする
For Each objTableItem In objTAG.all
strTAGNAME = objTableItem.tagName 'テーブル、タグ名
If strTAGNAME = "TR" Then
y = y + 1 '行カウンタを+1
x = 1 '列カウンタを1(左端にする)
End If
'↓No.177でTHもセットするように変更 TD or THの時
If strTAGNAME = "TD" Or strTAGNAME = "TH" Then
'テキストデータをセットする
Cells(y, x) = objTableItem.InnerText
x = x + 1 '列カウンタを+1(次にする)
End If
Next
End If
Next
End Sub
/*
* 6.終わりの挨拶
*/
今回は、
TABLEがいっぱいのHTMLから、
終値が含まれている表をInStr関数で探し、
Excelへセットしてみました。
ポイントは、
^^^^^^^^^^^^
.InnerTextからInStrで終値の文字を探すことと、
TABLEが2重化されていないか、TABLEの文字を.InnerHTMLから探して判断しました。
おまけで、
.document.getElementsByTagName("TABLE")
で、テーブルオブジェクトのみ取り出すことができました。
そんな話でした。
プログラム作りは
^^^^^^^^^^^^^^^^
う〜ん・・・
まぁ、人それぞれ、十人十色、百社百色だけどね。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
今回も逃げるように失礼します。
AB型の変わり者、三流プログラマーのKen3でした。
※評価は↓で投票してね。感想は掲示板かメールでくださいね。
------------------------------------------------------------------
今回のメルマガはどうでしたか?あなたの評価をクリックしてください
------------------------------------------------------------------
満足(参考になった) http://www.ken3.org/cgi-bin/an/a.asp?K=VBA&NO=177&A=5
まぁまぁ(一部参考に..) http://www.ken3.org/cgi-bin/an/a.asp?K=VBA&NO=177&A=4
普通(どちらとも言えない http://www.ken3.org/cgi-bin/an/a.asp?K=VBA&NO=177&A=3
なんかなぁ(期待と違った http://www.ken3.org/cgi-bin/an/a.asp?K=VBA&NO=177&A=2
不満(読んで損した気分) http://www.ken3.org/cgi-bin/an/a.asp?K=VBA&NO=177&A=1
※↓途中経過、みなさんの評価
http://www.ken3.org/cgi-bin/an/a.asp?K=VBA&NO=177&A=0
↑あなたの評価とのギャップは?
----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
IE関係は
VBAでInternetExplorer.Applicationを操作する(IE操作)
http://www.ken3.org/cgi-bin/group/vba_ie.asp
↑を見てください。
--------------------
読者からのお便り紹介
--------------------
----------------------------------------
メールで問い合わせ・感想を送る
----------------------------------------
皆さまのご意見・ご感想・投稿、、毒舌、、どんどんお待ちしております。
面白そうな話、ご意見、注意書き?などあったら、教えてください。
メールに気軽に書いて mailmaga@ken3.org へ送ってください。
(メールソフトで返信ボタンを押して送ってください)
指摘メールやご意見メール、
嫌いそうに見えて、実は好き(変わり者)なんで、どんどん、送ってください。
※送られてきたメールは、メルマガで紹介するかもしれません。
紹介禁止のときは、転載禁止と入れて置いてください。
勝手なお願いでスミマセン・・・
----------------------------------------
メルマガ解除方法(登録も出来るけど(笑))
----------------------------------------
三流君のメルマガの解除は(小涙)
まぐまぐ読者の人は、 http://www.mag2.com/m/0000099159.htm
めろんぱん使用の人は http://www.melonpan.net/mag.php?003819
メルマガ天国の人は、 http://melten.com/m/12604.html
Melma!の人は、 http://www.melma.com/mag/26/m00034126/index_bn.html
Macky!で受け取り http://macky.nifty.com/cgi-bin/bndisp.cgi?M-ID=ken3
それぞれの発行スタンドで、お手数ですがアドレス入力後、解除ボタンで(小涙)
*友人・知人への紹介、読者登録も上記で(小嬉)
文章・説明にクセのあるメルマガなので、紹介するときは注意してね。
----------------------------------------
リンク、転載、引用について
----------------------------------------
もちろん、勝手にやってOKです。バグや障害付きサンプルもどんどん使ってください
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^( まぁ、丸々使えるのは無いので修正しつつ使ってね)
連絡無しでリンクしてもいいし、リンクしましたの連絡ありでも好きなように。
※三流君( http://www.ken3.org/vba/ )でこんなこと書いてました
と、宣伝付きの引用だと、嬉しいけど(少しは誘導を狙って・・・)
*あっ、私のサンプルを他の掲示板などで丸投げで質問するのやめてね(笑)
3回ほど、どこかで見たことあるサンプルだなぁってのを見かけた(笑)
そんな時は、作者に問い合わせてくださいよ。。頼りにならないけど。
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
ここから、広告や自分のHP/メルマガの紹介(本文と関係無しです)
自称AB型の変わり者 Ken3(元コンビニ店長、現在三流プログラマー)
が自分の失敗談、体験談を書いたメルマガとHPです※読んで笑ってね
http://www.ken3.org/24h/ ---- コンビニ関係の裏話、店長時代の話を少し
http://www.ken3.org/vba/ ----- VBAのサンプル解説、主にExcel/Access関係
http://www.ken3.org/guchi/ --- プログラマー関係の話を混ぜて語る本人の愚痴
ロボットさんが見つけてくれるといいなぁ。通販系のページを紹介する。
DVDの人気
http://h17-oct.holy.jp/Buy-DVD/Day17.html
イッセー尾形ベストコレクション’99「世紀末ってナニ??」を通販で予約する
http://h17-oct.holy.jp/ASIN/B00005FPLL.html
キャットシッターなんりの猫暮らしマニュアルを通販で予約する
http://h17-oct.holy.jp/ASIN/B000BM6KQU.html
受取人不明を通販で予約する
http://h17-oct.holy.jp/ASIN/B000AYB2LC.html
人生は美しい DVD-BOXを通販で予約する
http://h17-oct.holy.jp/ASIN/B000BI55T2.html
ワイヤー・イン・ザ・ブラッド セカンドシーズン DVD-BOXを通販で予約する
http://h17-oct.holy.jp/ASIN/B000BKJJA6.html
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
-【けんぞう!】---------------------------------------------------------
転職関係、在宅プログラマー、SOHOの広告まとめました
http://www.ken3.org/etc/500yen/zaitaku.html いろいろとあるので転機の人はぜひ
登録料無料、匿名で探せるので在宅で小金稼ぎの人も見てね
~~~~~~~~~~~~~~~~
オレ様、私は、SE様だ、月給30万以上ボーナス100万を探すのもありだよ。
私にみたいにVBA少しできるぐらいだと仕事無いよ・・・
と軽く言われても匿名なら気にならないし(笑)
逆にこんな簡単な仕事で月給27万貰えるの?って会社もあるし、世の中イロイロ。
http://www.ken3.org/etc/500yen/job.html
------------------------------------------------------------------------
新たな通販ページを作成中・・・メルマガバックナンバーをロボットが
読んでくれる事を期待して、リンクを載せるセコい実験(笑)
-【けんぞう!】---------------------------------------------------------
実家の貧乏酒屋
^^^^^^^^^^^^^^
で
ヘルシア緑茶をケースで売ってます↓。(アニキのコンビニから購入して通信販売)
http://www.kurokiya.com/kao.html
のしょぼいHPは、↑私が作った通販のページなんだけど・・・
「体脂肪が気になる人」
~~~~~~~~~~~~~~~~~~
じゃなくって
「コンビニ店員の目が気になる人は」(こいつヘルシア飲んでるぞの目が気になる)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
定価+税金+送料で通信販売してます(笑)ヨロシクデス。
※完全な定価です、ささやかな割引は2ケース目と4ケース目が送料無料です。
う〜ん、プログラマー相手のセールストークイマイチ。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
コンピュータ関係のお仕事されている皆さん、
話題のヘルシア緑茶はどうでしょうか?不健康(オイオイ)な自分にご褒美で・・
かなりシブメノ味が眠気覚ましにもなりますよ。
缶コーヒーから乗り換えてみては?どうでしょうか?
※カテキン効果じゃなくて、缶コーヒーで+される糖分が無くなっただけで
実はヤセル効果があったりしてね(オイオイそりゃ無いでしょ)
ご注文は↓から、
http://www.kurokiya.com/kao.html
不健康な在宅プログラマーより 提案でした(いつもの宣伝カヨ!!!)
------------------------------------------------------------------------
|