掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
WebBrowserで表のデータ収集 (ID:108546)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> DAOで検索で調べましたが初心者に優しいサイトがなかったです・・(泣) DAO、あるいは、ADO + Jet OLEDB(Engine Type は &H80を指定)での取得は、 単純なHTML表の場合は有効ですが、結合列を含むような複雑な表の場合は 期待した結果にはならない事があります。汎用性という面ではお奨めしません。 > こんな感じで書けばいいんでしょうけど、動く気配がないです。 > Text1.Text = WebBrowser1.Document.body.Table.tBody.rows ……考え方としては間違っていませんが、記述は正しくありませんね。(^^; # まずは、先に掲載したページ(Internet SDK)を良く見てください。 # bodyオブジェクトに、Tableプロパティという物はありませんよ。 # (Internet SDKは、お手持ちのMSDNライブラリにも掲載されていると思います) DHTMLにて、任意のエレメント(この場合はTABLEエレメント)を取得する方法は 幾つかありますが、代表的な物を幾つか挙げてみますと、 getElementByIdメソッド getElementsByNameメソッド getElementsByTagNameメソッド allコレクション などを使う方法が用意されています。 で、とりあえずまずは、TABLEエレメントを Dim objTable As Object のような変数に Set してください。例えばこんな感じです。 Dim objTables As Object Dim objTable As Object Set objTables = Me.WebBrowser1.Document.getElementsByTagName("TABLE") Debug.Print "TABLEの数:", objTables.length If objTables.length > 0 Then Set objTable = objTables(0) '最初のTABLEエレメントを取得 End If ———しかし、もしもTable要素を取得できていたとしても、先の > Text1.Text = WebBrowser1.Document.body.Table.tBody.rows というコードには、まだ問題が残されていたりします。 まず、このコードでは Table.tBodyというコードが書かれていますが、 私の先の回答には、「tBodyプロパティ」という記述は無かったはずです。 回答にあったのは、tBodiesプロパティでしたよね? また、rowsプロパティが返すものは、「TRオブジェクトのコレクション」です。 コレクションをそのまま Text1.Text に表示する事はできないのです。(※1) さて、ここで少し、HTMLテーブルの構造を説明させてください。(※2) * HTMLの文法的には、TABLEエレメントは、その下に * 0個または1個の<CAPTION> ……表題部 * 0個以上の<COL>または<COLGROUP> ……列定義部 * 0個または1個の<THEAD> ……ヘッダ部 * 0個または1個の<TFOOT> ……フッタ部 * 1個以上の<TBODY> ……明細部 * というエレメントが、この順番で配置されていなければいけません。 * * ただし、THEADエレメントもTFOOTエレメントもなく、かつTBODYエレメントが * 一つしか含まれないテーブルの場合だけは、TBODYの記述を省略する事ができ、 * その場合だけは、TABLE の直下に TR が来る事ができる事になっています。 さて、上記のTABLE構造を踏まえた上で、VBのコーディングに話を戻します。 まず、この『1個以上の<TBODY>』を取得するための記述が、 先に回答した「tBodies」というプロパティとなります。 例えば、TABLE内の最初の TBODY を取得するためには、 Dim objTBodies As Object Dim objTBody As Object Set objTBodies = objTable.tBodies Debug.Print "TBODYの数:", objTBodies.length Set objTBody = objTBodies(0) のようになります。(※3) で、上記のように tBodyオブジェクト を取得した後は、 Set objRows = objTBody.rows Debug.Print "TRの数:", objRows.length Set objRow = objRows(0) という感じで、TBODYの下にある、最初のTRオブジェクトを取得できます。(※4) 同様に、cellsプロパティを使って、 Set objCells = objRow.cells Debug.Print "セルの数:", objCells.length Set objCell = objCells(0) という感じで、TRの下にある、最初のTD(またはTH)オブジェクトを取得できます。 あとは、このセルの innerText、innerHTML、outerHTML プロパティなどで テキストを取得したり、あるいは firstChild、childNodex、allプロパティなどで その下にある別のエレメントを拾うなどしていけば、望む物が出来ると思います。 例えば、HTML中に含まれる最初のTABLEエレメントを取得し、その一番左上のセルの テキストの内容を取得する場合は、以下のようになります。 Set objTables = Me.WebBrowser1.Document.getElementsByTagName("TABLE") Text1.Text = objTables(0).rows(0).cells(0).innerText ----------- (※1) rowsコレクションを、そのまま表示する事はできない、と書きましたが、 実際には、DHTMLのほぼ全てのオブジェクトが、規定の「toStringメソッド」を 持っており、ここから自動的に"[object]"という文字列が返されるようになっています。 ですから、もしも先のコードが、正しくrowsコレクションを取得していたのならば、 Text1.Text = objTBody.rows.toString() のような意味として実行され、Text1には"[object]"という文字列が表示されます。 (※2) いちいち、HTMLの文法構造まで持ち出すのは冗長かとも思いましたが、 DHTMLは、HTMLをプログラムから操作できるような物なので、HTMLの構造を 理解しておいてもらった方が、解説しやすかったのです。 (※3) なお、『TABLEの直下に TBODYが無い場合(TABLEの直下にTRがある場合)』でも、 tBodiesプロパティを利用して、tBodyオブジェクトを取得することができます。 これはHTMLテーブルの構造の解説でも述べたように、TABLEの直下にTRがある場合というのが すなわち、「TBODYの記述が省略されているだけの状態」であるため、結果として、 objTable.tHead → これは、Nothing を返す objTable.tFoot → これも、Nothing を返す objTable.tBodies → これは、tBodyのコレクションオブジェクトを返す objTable.tBodies.length → 省略されたTBODYは1つだけなので、これは1を返す のようなオブジェクト構造となるからです。 (※4) 同様に、Set objRows = objTable.rows という感じで、tableオブジェクトから、 直接TRオブジェクトのコレクションを取得する方法もあります。 tHead、tBody、tFootに対するrowsコレクションの場合は、それぞれの直下にあるTRのみを その範囲としますが、tableオブジェクトのrowsコレクションの場合は、それら全てを 含んだ、表全体の行(trオブジェクト)を含んでいる事になります。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.