• 締切済み

VBA:HTML から文字列を取得したい

エクセルのVBAを使ってHTMLの操作をしようとしています。 実際のHTMLではなくて恐縮ですが、以下のようなテーブルがあります。 <tr class="hoge"> <td>ABC</td> <td>fuga</td> <td>piyo</td> <td>テキスト:いろは</td> <td>hogehoge</td> </tr> 四つ目のtd要素に含まれている文字列「いろは」で、目的のtr要素を特定し(「いろは」はHTML中一回しか使われません)、一つ目のtd要素にある「ABC」を取得して変数に収め、利用したいと考えています。 このクラス名「hoge」を用いたtr要素は複数あって、かつその並び順は新しいデータの更新・追加に従って変わるので、添え番で指定することが出来ません。 このとき、GetElementsByClassName でクラス名「hoge」のエレメントコレクションを取得するところまでは判りますが、その後どういった処理を行えば希望する結果が得られるか思いつきません。 どういう方法を使えばよいか、なんらかヒントをご教示頂ければ助かります。 なにとぞよろしくお願い致しますm(__)m

みんなの回答

回答No.1

こんにちは。 少し抽象的過ぎて、お応えするのが難しい面があります。 > エクセルのVBAを使ってHTMLの操作をしようとしています。 「MSHTML」で「MSHTML.HTMLDocument」の「DOM操作」という前提(*1)でお応えします。 > 実際のHTMLではなくて恐縮ですが、以下のようなテーブルがあります。 例示なさったサンプルは、「テーブル」ではなくて「テーブル」配下の 「レコード」(trタグの付いたHTMLTableRow)を1例だけ挙げたもののようです。 なので、<tr class="hoge">だけを検索したとすると、 目標のテーブル以外のデータを拾ってしまう可能性もありますが、 その点で問題があるかどうか、確認した方が良さそうです。 前提(*2)  目標のテーブル以外には<tr class="hoge">が存在しない、という場合 > 四つ目のtd要素に含まれている文字列「いろは」で、目的のtr要素を特定し(「いろは」はHTML中一回しか使われません)、 > 一つ目のtd要素にある「ABC」を取得して変数に収め、利用したいと考えています。 前提(*3)  HTMLTableRow内のインデックスは、"四つ目""一つ目"で絶対的であるという場合。      下記サンプルでは、0から始る添え字を使いますので、それぞれ、3、0、で表されています。 > このとき、GetElementsByClassName でクラス名「hoge」のエレメントコレクションを取得するところまでは判りますが、 前提(*4)  「判ります」=「出来ています」という意味だとして、      ここでは仮に、   Set colElm = oDoc.getElementsByClassName("hoge")      というような、変数(仮にcolElm)に      MSHTML.IHTMLElementCollection が格納されている場合を前提にします。 > その後どういった処理を行えば希望する結果が得られるか思いつきません。 前提(**)  <td>タグ配下には、その他のタグが存在しない、として、、、。 前提(***)  実は<table>タグ配下では無かった?場合はエラーになります。 ' ' ///サンプル '  Set colElm = oDoc.getElementsByClassName("hoge") Dim oTblRow As Object ' As MSHTML.HTMLTableRow   For Each oTblRow In colElm     If  oTblRow.Cells(3).innerText Like "*いろは*" Then       Debug.Print oTblRow.Cells(0).innerText  '  → "ABC"       Exit For     End If   Next ' ' /// 直接的な答えとしては、以上のような感じ、になるかな、と。 (開発の段階では、MSHTML(Microsoft HTML Object Library)に参照設定しておくと、  デバッグがやり易くなったり、ある程度の疑問は自己解決できる場合も多くなります。) その他、テーブルそのものの属性など、条件によっては様々なトライが可能ではありますが、 > どういう方法を使えばよいか、なんらかヒントをご教示頂ければ助かります。 「DOM操作」で「テーブル」を扱うなら、TableRow、Cells、あたりを押さえておけば、 大抵答えには辿りつけるかと思います。 前提(*2)が確実で、HTMLが固定的な場合等では、DOMを離れて、 文字列値としてのHTMLを正規表現VBScript_RegExp_55(Microsoft VBScript Regular Expressions 5.5) で処理する方が有利な場合も結構あります。(個人的にはこっちがやや多い?) ' ///走り書きですし、簡単な検証しかしていませんが、例示に忠実なダミーサンプルでは機能しました。 Sub try9060613w() 'Dim sHtml As String '  sHtml = oDoc.body.innerHTML  '  ← 一例です。 Dim oRegExp As VBScript_RegExp_55.RegExp Dim colMatch As VBScript_RegExp_55.MatchCollection   Set oRegExp = New VBScript_RegExp_55.RegExp   With oRegExp     .Global = True     .IgnoreCase = True     .Pattern = "\s*<td>([^<]*)</td>\n*(\s*<td>[^<]*</td>\n*){2}\s*<td>[^<]*いろは[^<]*</td>"     On Error GoTo ErrMatch_     Set colMatch = oRegExp.Execute(sHtml)     On Error GoTo 0     Debug.Print colMatch(0).SubMatches(0)  '  → "ABC"   End With   Set colMatch = Nothing Exit_:   Set oRegExp = Nothing   Exit Sub ErrMatch_:   MsgBox Err & vbLf & Err.Description   Resume Exit_ End Sub ' /// 以上、お役に立てるか確信はありませんが、参考まで。 〓資料)テストに使ったサンプルの一部  (インデントを表示する目的でタブの代りに全角スペースを当てています)    <table class="hogepiyo">     <tr class="hoge">      <td>XYZ</td>      <td>foo</td>      <td>bar</td>      <td>テキスト:にほへ</td>      <td>baz</td>     </tr>     <tr class="hoge">      <td>ABC</td>      <td>fuga</td>      <td>piyo</td>      <td>テキスト:いろは</td>      <td>hogehoge</td>     </tr>    </table>

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • クラス名の振られた要素の文字列取得方法

    Javascriptで特定のクラス名の付けられた要素から、タグに挟まれた文字列を取得する方法を教えてください。 ある自動生成されるページに、以下のように決まったクラス名が振られる要素があります。 これらの要素から"AAA"や"BBB"の部分を取得するにはどうすればいいでしょうか? 教えてください。 <a href="hoge.html" class="fuga">AAA</a> <p class="piyo">BBB</p>

  • 正規表現で任意の文字列が含まれない文字列の取得

    VB6/VBAでお願いします。 <tr> <td>あいうえお</td> <td>かきくけこ</td> </tr> ここで、<td>と</td>に挟まれた文字列を取得しようとするのですが、 ABCとXYZ両方が取得できます。任意の文字列を含まない指定はどう すればいいでしょうか? この場合、「きくけ」を含まない「あいうえお」を取得したいと思い ます。

  • 値を取得できない

    var hoge = {   piyo: {     bar = /* ここにhogehoge.fooの値を入れたい */   },   foo: "Hello, World!" } でhoge.piyo.barからhoge.fooの値を取得したいのですが、 hoge.fooとやってもthis.fooとやっても取得できません。 どうすれば取得できるのでしょうか?

  • Linux シェルスクリプトでの XML 読み込み

    次のような xml があります。 ------------------------------------------------------------------------------------------------------------------ <?xml version="1.0" ?> <ROOT> <hoge> <fuga> <piyo>/var/log/tokyo</piyo> <hogera>7</hogera> <hogehoge>*.log</hogehoge> </fuga> <fuga> <piyo>/var/log/osaka</piyo> <hogera>3</hogeara> <hogehoge>*.log</hogehoge> </fuga> </hoge> <foo> <bar> <baz>/media/tokyo/tokyo.zip</baz> <qux>/var/log/tokyo</qux> <quux>7</quux> <foobar>*.log</foobar> </bar> <bar> <baz>/media/osaka/osaka.zip</baz> <qux>/var/log/osaka</qux> <quux>3</quux> <foobar>*.log</foobar> </bar> </foo> </ROOT> ------------------------------------------------------------------------------------------------------------------ 1)要素 qux の値を取り出してパスを評価 2)パスが存在すれば要素 foobar の条件に一致したファイルを要素 baz にアーカイブする というシェルスクリプトを作成したいのですが、良い方法が分かりません ご教授いただければ幸いです。

  • HTMLインデント機能

    市販またはフリーのツールで たとえば <TR><TD>hoge</TD></TR> のような記述を <TR>  <TD>   hoge  </TD> </TR> のように変換してくれる機能のついたものってあるのでしょうか? HTMLを整形といったらいいでしょうか よろしくお願いいたします

    • ベストアンサー
    • HTML
  • PHPとHTMLをまとめてコメントアウトしたいので

    HTMLの中にPHPが混じっているコードを、上から下まで一気にコメントアウトしたいのですが、どうしたらいいでしょうか? PHPとHTMLに分け、それぞれコメントアウトしていくしかないのでしょうか? それだともの凄く見難くなるのですが…… 後、HTML複数行コメントアウトの中に、PHPコメントアウトを書いてもいいのでしょうか? 例) ----------------------------------------------------- ・今日の天気予報<br> ・一覧 … <?php echo array_sum($hoge); ?> 全国<br>  <table>  <tr id="Theading" >  <th id="Theading"> Yahoo</th>  <th id="Theading"> livedoor</th>  <th id="Theading"> excite</th>  </tr>  <?php foreach($hoge as $k => $v){ ?>  <tr id="Tvalues">  <td><?php echo $piyo; ?></td>  <td><?php echo $k; ?></td>  <td><?php echo $v; ?></td>  <?php $piyo++; ?>  </tr>  <?php } ?>  </table> <br><br> -----------------------------------------------------

    • ベストアンサー
    • PHP
  • 【PHP】スクリプトから相対パスを知りたい

    現在、XHTML+PHPにてサイトを構築している者です。 PHP スクリプト ファイル自身から見たトップディレクトリまでの相対パスの深さを知りたいのですが、どうすれば良いのでしょうか? 例 DocumentRoot/hoge/piyo.php → ../ DocumentRoot/hoge/piyo/fuga.php → ../../ DocumentRoot/hoge/piyo/fuga/fuuga.php → ../../../ 例に示したように取得する方法を知りたいです。

    • ベストアンサー
    • PHP
  • 指定した要素を含んだテキストで取得する

    <table>  <tr id="aaa"><td>あああ</td></tr>  <tr><td>いいい</td></tr> </table> <script> alert(document.getElementById("aaa").innerHTML) </script> 上記のようなHTMLを実行すると 「<td>あああ</td>」と表示されますが これをid指定されている<tr>要素を含んだ形で 即ち「<tr id="aaa"><td>あああ</td></tr>」というように 取得するにはどのような方法が考えられるでしょうか?

  • PHPコードをHTML形式に変換

    しょっぱなからお見苦しいコードで申し訳ありません。 <table border="1"> <tr> <td>社員ID</td> <td>社員名</td> <td>部署名</td> <td>役職名</td> </tr> <?php $dsn = 'mysql:dbname=thscontest;host=localhost'; $user = 'root'; $password = ''; $dbh = new PDO($dsn, $user, $password); $sql = 'SELECT e.id, e.name, p.name AS name2, e.offtitle FROM employee e, post p WHERE e.post = p.id GROUP BY e.id'; foreach ($dbh->query($sql) as $row) { echo '<tr>'; print('<td><a href=member.php?id=' . $row['id'] . '>' . $row['id'] . '</a></td>'); print('<td>' . $row['name'] . '</td>'); print('<td>' . $row['name2'] . '</td>'); print('<td>' . $row['offtitle'] . '</td>'); echo '</tr>'; } ?> </table> このコードを表示させソース表示させますと <table border="1"> <tr> <td>社員ID</td> <td>社員名</td> <td>部署名</td> <td>役職名</td> </tr> <tr> <td><a href=member.php?id=hoge>hoge</a></td> <td>東京太郎</td> <td>hoge部署</td> <td>hoge役</td>   </tr>   <tr>[省略]</tr> </table> というHTMLのコードが出力されるわけですが このHTML形式のソースを使いたいのですが処理中に変換をかける方法はありますでしょうか? 御存知の方いらっしゃいましたらよろしくお願いします。

    • ベストアンサー
    • PHP
  • VBAのInstrについて

    webページのソースコードを変数に代入し、 その中から<td class="abc">という文字列の位置を取得したいので hogehoge = Instr(baf,"<td class="abc">")と指定すると""の部分でエラーになってしまいますので ""をutf-8にあらかじめ変換し、%22で囲ってみました hogehoge = Instr(baf,"<td class=%22abc%22>") これでエラーはでませんが、これではソースコードから該当の文字列が探せません。 Instrで指定の文字の位置を取得したいが、その文字列内に「"」が含まれている場合、 どのようにすれば正常に取得できるでしょうか? よろしくお願いします。

専門家に質問してみよう