[三流君]
[VBAで楽しく]
[VBA IE 操作]
−−> No.119 IEを使用して、Web上の表をExcelへ
IEを使用して、Web上の表をExcelへ
メルマガ発行内容
<IEを使用して、Web上の表をExcelへ>
どうも、三流プログラマーのKen3です。
今回は、
IEを使用して、Web上の表をExcelに取り込む処理
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
そんな感じの処理を作成してみたいと思います。
http://www.ken3.org/p/7/office-026.lzh
に今回のサンプル保存されてます。
あわせてみてください。
/*
* 1. 今回のキッカケ
*/
メールで下記の質問をもらいました。
-----
>私は、IEのテーブル部分をマウスで範囲選択しコピー、そ
>れをExcelに貼り付けています。これで、セルスタイル
>のデータになります。
>次に、Excelデータをアクセステーブルに追加貼付け
>しています。これら一連の手作業をVBAで自動的にやりた
>いのですが、できれば、連続的に例えば同種で複数のページ
>を自動的に取り込めたらと思うのですが。
-----
要望は、Accessのテーブルへだけど、
今回は、途中のIE --> Excelへの落とし込みにチャレンジしてみます。
/*
* 2.IE Elementオブジェクト(タグに対応した各要素)を探る
*/
IEのオブジェクトの要素を探ってみます。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Sub ie_test_click()
Dim objIE As Object 'IEオブジェクト参照用
Dim objTAG As Object
Dim y As Integer
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
objIE.Navigate "http://www.ken3.org/cgi-bin/g/index.html"
'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'
y = 2
'.All のデータをループする
For Each objTAG In objIE.document.all
Cells(y, "A") = objTAG.tagName
Cells(y, "B") = objTAG.innerHTML
Cells(y, "C") = objTAG.innerTEXT
Cells(y, "D") = objTAG.outerHTML
Cells(y, "E") = objTAG.outerTEXT
y = y + 1
Next
End Sub |
ポイントは、
~~~~~~~~~~~~
For Each objTAG In objIE.document.all
で、.Allまわしてみました。
Cells(y, "A") = objTAG.tagName
Cells(y, "B") = objTAG.innerHTML
Cells(y, "C") = objTAG.innerTEXT
Cells(y, "D") = objTAG.outerHTML
Cells(y, "E") = objTAG.outerTEXT
で、それぞれ、データをセットしてみました。
Elementオブジェクト(タグに対応した各要素)
innerHTML 内部にあるタグ付き文字列
innerText 内部にある文字列のみ
outerHTML 外部も含めたタグ付き文字列
outerText 外部も含めた文字列
tagName 対象となっているタグの名前
と、データが取れるので、確認してみてください。
HTMLは、基本のパターンを書くと、
<Font SIZE=+1><I>AAAA</I></Font>
と、
タグの開始と終了に挟まれています(囲われてます)
For Each objTAG In objIE.document.all
で、各タグを取り出してます。
まぁ、
.tagNameがタグの名前なので、FONTとなっていて、
^^^^^^^^
.innerHTMLは内部にあるタグ付き文字列なので、<I>AAAA</I>
^^^^^^^^^^
.outerHTMLが外部も含めたタグ付き文字列、なんて堅く書いてるけど、
^^^^^^^^^^そのまんまの、
<Font SIZE=+1><I>AAAA</I></Font>
と外側のタグも含めたHTMLの文字列なんですね。
あとは、innerText,outerText は、タグが抜かれたテキストです。
場面によって、使い分けてくださいね。
/*
* 3.表のオブジェクト(TABLEタグ)を探る
*/
作りたいのは、Web上に表示されている表から、
データを取り出したい処理なので、そこら辺を探ってみます。
HTMLの表は、基本のパターンを書くと、
<TABLE>
<TR>
<TD>XXXXXX</TD>
<TD>YYYYYY</TD>
<TD>ZZZZZZ</TD>
</TR>
</TABLE>
と、
<TABLE>テーブルのタグから始まり、
<TR>行の開始
<TD>列のデータ(<TH>と見出しをキチント書いている人もありです)
の
3つの組み合わせと順番です。
IE Elementオブジェクト(タグに対応した各要素)
で、
Elementオブジェクト(タグに対応した各要素)
innerHTML 内部にあるタグ付き文字列
innerText 内部にある文字列のみ
outerHTML 外部も含めたタグ付き文字列
outerText 外部も含めた文字列
tagName 対象となっているタグの名前
を探ってました。
下記のテストプログラムで、
http://www.ken3.org/cgi-bin/cnt/test.asp
で表示される表を探ってみます。
Sub ie_test_click()
Dim objIE As Object 'IEオブジェクト参照用
Dim objTAG As Object
Dim y As Integer
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
objIE.Navigate "http://www.ken3.org/cgi-bin/cnt/test.asp"
'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'データを削除する
Rows("3:1000").Select
Selection.Delete Shift:=xlUp
'3行目から書き込む
y = 3
'.body のデータをループする
For Each objTAG In objIE.document.body.all
Cells(y, "A") = objTAG.tagName
Cells(y, "B") = objTAG.innerHTML
Cells(y, "C") = objTAG.innerTEXT
Cells(y, "D") = objTAG.outerHTML
Cells(y, "E") = objTAG.outerTEXT
y = y + 1
Next
End Sub |
タグ別にデータを取り出せるが、
これだと、テーブルは見つけられても、セットできない。
う〜ん、、どうしましょう・・・
objIE.document.body.allのアイテム内を探すと、
さらに下の<TABLE>のアイテムを探ると、
ITEM8なんですが、その下にもALLの階層があって、
さらにアイテムを探すと、テーブルの中身が取れます。
Item8は、.all 28個のアイテムを持っていて、
なんて感じで、テーブル内のデータを探れそうです。
/*
* 4.階層を深くたどり、Excelへデータを取り込む
*/
TABLEのタグを見つけたら、
そのITEM内をさらに.Allで探し、テーブルをExcelの表にしてみたいと思います。
Sub ie_make_table_test()
Dim objIE As Object 'IEオブジェクト参照用
Dim objTAG As Object 'TAGのオブジェクトを代入
Dim y As Integer
Dim x As Integer
Dim objTableItem As Object 'TABLE内のITEM検索用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
objIE.Navigate "http://www.ken3.org/cgi-bin/cnt/test.asp"
'表示終了まで待つ
Do While objIE.Busy = True
'何もしないループ(笑)
DoEvents
Loop
'.body のデータをループする
For Each objTAG In objIE.document.body.all
'テーブルのタグを探す
If objTAG.tagName = "TABLE" Then
'新規ブックを追加する
Workbooks.Add
'カウンタの初期化
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 |
なんか、ループが深いですが、
ポイントは、
^^^^^^^^^^^^
For Each objTAG In objIE.document.body.all
と、<BODY>内をループで回し、タグ(ITEM)を1つ1つ取り出します。
取り出したタグがTABLEか判断するには、
If objTAG.tagName = "TABLE" Then
と、.tagNameで判断してます。
※TABLEの要素を.document.body.allから見つけます。
見つけ方は、.tagNameとタグの名前がTABLEかで判断してます。
TABLEのITEM(要素、エレメント)を見つけたら、
今度は、そのTABLE内のITEMを1つ1つ取り出します。
For Each objTableItem In objTAG.all
objTAG.allがポイントです。
※objTAGがテーブルのオブジェクトです、
このオブジェクトは、階層構造になっており、
アイテムを複数持ってます。
そのアイテムを取り出すために、
For Each objTableItem In objTAG.all
と記述して、TABLEオブジェクトから要素(TRやTDなど)を取り出します
行の開始が<TR>なので、
If objTableItem.tagName = "TR" Then
y = y + 1 '行カウンタを+1
x = 1 '列カウンタを1(左端にする)
End If
と、行を+1列を開始位置の1にセットします。
<TD>がデータなので、
If objTableItem.tagName = "TD" Then
'テキストデータをセットする
Cells(y, x) = objTableItem.innerText
x = x + 1 '列カウンタを+1(次にする)
End If
と普通にデータをセットしてます。
/*
* 5.終わりの挨拶
*/
今回は、
IEのオブジェクト、ITEMを探るのを兼ねて、
<TABLE>をExcelに取り込んでみました。
http://www.ken3.org/p/7/office-026.lzh
に今回のサンプル保存されてます。
あわせてみてください。
最大のポイントは、
みつけた<TABLE>のアイテムからさらにITEMが検索可能だった点です。
まぁ、よくよく、考えてみれば、
<HTML> 〜 </ HTML>と、一番大きなタグ(笑)
から、ITEM単位で行っているので、
大分類から中分類、小分類を探る、そんな感じでしたね。
なんか、出来たようなこと、完成したと書いてるけど、
結合セルの処理がまだなのと、右寄せ・中央・左寄せなどの処理、
バックカラーの処理がまだかなぁ。
あっ、あと、表なのに、罫線もつけてないしね・・・
不思議なIEお嬢様、まだまだ攻略できそうにないよね。
えっ、Excel姫やAccessお姉さまも攻略して無いダロって?
※う〜ん、実力無くて、なかなか、攻略できなくて。。。。
何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマー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に流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・