• 締切済み

VBA Split関数で区切り文字 

vbaでIEのHTML操作をしているのですが、 次のソースの日付と時間を別々に取得したいとき、&nbsp;の扱い方がわかりませんm(__)m '<font color="000080" size="2">&nbsp;&nbsp;00:00&nbsp;&nbsp;Wed,19 Aug 2015</font> Dim varA as Variant varA = split(tag.innertext, &nbsp;&nbsp;) '←ここの&nbsp;&nbsp;部分の書き方がわかりません。 .cells(2,1) = Var(2) .cells(2,2) = Var(1) また、instr関数を使って、該当タグを探すときに Instr(tag.outerHTML,"★")の★部分に上記ソースの 「 <font color="000080" size="2">&nbsp;&nbsp; 」をまるごと使いたい場合、 どのように編集すれば良いか、こちらもよろしければご教授お願い致しますm(__)m ★部分: "<font color=""000080"" size=""2"">&nbsp;&nbsp;" など試してみましたが、まだ甘いようです。 よろしくお願いいたします。

みんなの回答

noname#212067
noname#212067
回答No.6

>こちらのTag.Document.allは、指定URLを読み込み後、何か、変数宣言は必要なのでしょうか? >書き換えた見たところ、オブジェクトまたはWITHの変数が見つかりませんというエラーが出現しました。 私のTagオブジェクトはあなたのとはSetした内容が違うようですね あなたのTagはおそらくieObject.Document.documentElementまでSETされているのではないでしょうか? わたしのTagはieObjectまでSetしています ブラウザのバージョンによってプロパティ構造が違う場合がありますのでウォッチウィンドウにTagオブジェクトを追加してプロパティ構造の把握とワンステップずつの実行で中の値の確認を行ったほうが解り易いと思います Dim Tag As SHDocVw.InternetExplorer Dim ieouterText As Object Set Tag = CreateObject("InternetExplorer.Application") Tag.Navigate2 "URL"←URLを設定する For Each ieouterText In Tag.Document.all debug.print ieouterText.outerText ←ブレークポイントを設定して、該当する文字列があるかワンステップずつ実行して確認する If Instr(ieouterText.outerText,"<font color=""000080"" size=""2"">&nbsp;&nbsp;") > 0 Then '見つかった!! Exit For End If Next ieouterText

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.5

No4に補足ですが。 IEオブジェクトでカラーコードを読み込むと元ソースに記述されていなくてもカラーコードの「#」が補完されるようです。 デバックで「objIE.Document.Body.InnerHtml」やら「coll(0).InnerHtml」で取得されているソースコード確認してから文字列操作したほうが良いですよ。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.4

>If InStr(tag.outerHTML, "<font color=""000080"" size=""2"">&nbsp;&nbsp;") > 0 Then '★すべてスルーしてしまう そりゃカラーコードの「#」ぬけてるからでしょう。

noname#212067
noname#212067
回答No.3

>次のソースの日付と時間を別々に取得したいとき、&nbsp;の扱い方がわかりませんm(__)m &nbspの特殊文字が直接入っているのでしたら置き換えてください "CHR$(160) & ";" & CHR$(160) & ";" ← "&nbsp;&nbsp;" &nbspはUnicodeで160です VBAではCHR$(160)になります Sub test1() Dim varA As Variant varA = Split(tag.innertext, "&nbsp;&nbsp;") Debug.Print Replace(varA(2), "</font>", "")←</font>を取る Debug.Print varA(1) End Sub Instrの件 tag.outerHTMLはページ単位でそのタグが含まれてを探す場合に使えると思いますが 行単位になるとTag.Document.allで行頭から順番に探していきます For Each ieouterText In Tag.Document.all If Instr(ieouterText.outerText,"<font color=""000080"" size=""2"">&nbsp;&nbsp;") > 0 Then '見つかった!! Exit For End If Next ieouterText Set ieouterText = Nothing

kenthehg
質問者

お礼

ご回答ありがとうございます。 コードの書き方、大変勉強になりますm(__)m No.3の回答者様に現在の私が作ったコードを載せました。 >For Each ieouterText In Tag.Document.all こちらのTag.Document.allは、指定URLを読み込み後、何か、変数宣言は必要なのでしょうか? 書き換えた見たところ、オブジェクトまたはWITHの変数が見つかりませんというエラーが出現しました。 >>If Instr(ieouterText.outerText,"<font color=""000080"" size=""2"">&nbsp;&nbsp;") > 0 Then こちらが、見つかってくれませんm(__)m "<font color=""000080"" size=""2"">" & Chr$(160) & ";" & Chr$(160) & ";" など試してみましたが、、、 もう少し、自分で考えてみたいと思います。 ご回答ありがとうございました。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

No1に補足と訂正です。 >また、instr関数を使って、該当タグを探すときに 上記同様です。 同様ではないですね。失礼しました。 VBAのコード内で文字列であることを明示するための記号にダブルクォーテーション記号「"」を用います。 文字列として同記号を用いる際には区切り記号と区別するために手前にエスケープ文字「"」(VBAの場合)を付加して記載します。 (多くの言語の場合、エスケープ文字はバックスラッシュ「\」が使用されています) よって、「"A"」という文字列を変数へ格納する場合や、引数として指定する場合において 文字列を指定する際には以下のようになります。 変数 = """A""" 以下は補足ですが、 文字列操作をする場合、ブレークポイントを設けたり、ステップ実行、イミディウィンドウへの出力などで変数の内容を把握しながら操作してみてください。 上手くいった、甘かったではどこに重大なバグが潜んでいるか分からなくなるかと思います。 コードに記載されている内容・動作を把握できるようにしておいた方が良いですよ。 VBAコードを記述するモジュールの先頭に「Option Explicit」を記載しておくと 宣言されていない変数がコード内で使用された場合にエラーとなります。 型宣言を省略できるVBAにおいては少々面倒くさい事もあるかとおもいますが、varAをvarと記述するようなうっかりミス(バグの原因)は減るかと思います。

kenthehg
質問者

お礼

ご回答有難うございます。 サンプルコード試さしていただきました。ありがとうございます。正常に動きました。 しかし、私の作ったコードですと、INSTRで該当タグを見つけてくれていないようですm(__)m If InStr(tag.outerHTML, "<font color=""000080"" size=""2"">&nbsp;&nbsp;") > 0 Then 目的サイトのソースは、クラス分けなどされていないため探しづらい仕様なのですが、この形は不変だと思われます。 <font color="000080" size="2">&nbsp;&nbsp;01:00&nbsp;&nbsp;Fri, 21 Aug 2015</font> 該当ソースをグーグルデベロッパーツールでみると体裁が下のように改行された状態で出現しているのも原因があるかもしれません。 <font color="000080" size="2">&nbsp;&nbsp;01:00 &nbsp;&nbsp; Fri, 21 Aug 2015</font> ダブルクォーテーション3つ「"<font color="""000080""" size="""2""">&nbsp;&nbsp;"」ですと、コンパイルエラー(区切り記号)」 というものが出現します。 他にも次のようなものも試してみました。 If InStr(tag.outerHTML, "<font color=""000080"" size=""2"">" & Chr$(160) & Chr$(160)) > 0 Then いずれも改善できていません。 もう少し探ってみます。時間を割いていただきありがとうございました。m(__)m Option Explicit Sub GetFeed2() Dim objIE As New InternetExplorer Dim ws As Worksheet Set ws = Worksheets("feed") Call ieView(objIE, "https://*******.com/") 'URL呼び出し用 '公開できずすみません。 '■DOM Dim coll, tag As Object Dim varAH, varOU, varDate As Variant 'split関数格納用 With ws Dim y, x As Integer 'シートの開始行 y = 2 x = 2 Set coll = objIE.Document.getElementById("container").getElementsByTagName("tbody") For Each tag In coll If InStr(tag.outerHTML, "<font color=""000080"" size=""2"">&nbsp;&nbsp;") > 0 Then '★すべてスルーしてしまう varDate = Split(tag.innerHTML, "&nbsp;&nbsp;") '上がスルーしてしまうため、正しいのか判断できていません、、 .Cells(y, 1) = varDate(2) .Cells(y, 2) = varDate(1) y = y + 1 End If  If InStr(tag.outerHTML, "/m*****ah.cfm?id=") > 0 Then 'こちらは正常に取得できます。(iframeのURL部分がouterHTML内に出現) varAH = Split(tag.outerHTML, "','") 'こちらは正常に取得できます。 .Cells(x, 3) = varAH(2) x = x + 1 End If  Next End With End Sub

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

>varA = split(tag.innertext, &nbsp;&nbsp;) '←ここの&nbsp;&nbsp;部分の書き方がわか その書き方であっていますよ。 >.cells(2,1) = Var(2) >.cells(2,2) = Var(1) 用意した配列変数はvarAですよね。varA(2)、varA(1)としてください。 >また、instr関数を使って、該当タグを探すときに 上記同様です。 以下のコードを参考にしてください。 ■VBAコード Sub test() Dim tag As String, tag2 As String, hit As Integer Dim varA As Variant '元のHTMLタグ(頭に余分にTTTTTTTTTTTTTESTを付与) tag = "TTTTTTTTTTTTTEST<font color=""000080"" size=""2"">&nbsp;&nbsp;00:00&nbsp;&nbsp;Wed,19 Aug 2015</font>" 'タグの頭位置を検索 hit = InStr(1, tag, "<font color=""000080"" size=""2"">&nbsp;&nbsp;") '文字列操作(HTMLタグから該当のタグ部分を切りだし作業) tag2 = Right(tag, Len(tag) - hit + 1) 'Split分割 varA = Split(tag2, "&nbsp;&nbsp;") 'セルへ書き出し With ActiveSheet   .Cells(1, 1) = tag2   .Cells(2, 1) = varA(2)   .Cells(2, 2) = varA(1) End With End Sub

関連するQ&A