• ベストアンサー

VBAのInstrについて

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

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

引用符の中で引用符を表わすには 二重化します。これは#1の方の回答 の通りです。 しかし、InStrより、正規表現を使う方が より有効です。 Dim 正規表現 As Object Dim 一致集合 As Object Dim 一致個別 As Object Dim テキスト As String Dim パターン As String '問題のテキスト テキスト = "<table><tr> <td class=""abc"">" '正規表現をインスタンス化する Set 正規表現 = CreateObject("VBScript.RegExp") '英字の大文字小文字を区別しない 正規表現.IgnoreCase = False '最初の検出だけで止める 正規表現.Global = False '正規表現パターンを設定する パターン = "<\s*td\s+class\s*=\s*[""']{0,1}abc[""']{0,1}\s*>" 正規表現.Pattern = パターン '一致する部分の集合を求める Set 一致集合 = 正規表現.Execute(テキスト) If 一致集合.Count = 0 Then   '一致するものが無い場合   MsgBox "一致する部分がありません" Else   '一致する部分を取得する   Set 一致個別 = 一致集合.Item(0)   '位置、長さ、内容を取得する   Dim 位置 As Long, 長さ As Long   Dim 内容 As String   位置 = 一致個別.FirstIndex + 1   長さ = 一致個別.Length   内容 = 一致個別.Value End If この場合、英字の大文字、小文字を区別しない ことは勿論、< td class = 'abc' > のように前後に 空白が入ったり、アポストロフィで囲まれる、又は class=abc のように直に指定した場合も検索が 可能です。 また、GlobalプロパティをTrueにすれば、一致する 部分を全て抜き出すことができます。 正規表現パターンはなかなか難しいのですが、 応用範囲が広く、JavaScriptやPHP、Java等でも 出てきますので、使用することを薦めます。 http://msdn.microsoft.com/ja-jp/library/cc392487.aspx http://msdn.microsoft.com/ja-jp/library/ae5bf541(v=VS.80).aspx

master817199
質問者

お礼

お返事遅くなりました。 おかげさまで問題解決できました。 ありがとうございます。

その他の回答 (2)

  • ss-ak
  • ベストアンサー率58% (23/39)
回答No.3

この件の目的、利用環境、本来の要件や想定ケースの範囲も何もわからない状況で「より有効な道具立て」にまで、言及はできないと思います。 cssクラスの複数指定ケース、他のタグ属性も含むケース等々、可能性を挙げたらきりがないですし。 検索したい文字列が決めうちで良いと判っている場合は、Instrの方がシンプルで良いでしょうし、HTMLとして汎用的な検索をしたいのでしたら、例えばXPathやCSSセレクタ等を使える手段を採用する方が、適切かもしれないわけで、要件等の前提もなしに「より有効な手段」は論じられない、ということです。 なお、サンプルコードまで出てしまっているので指摘しておきますが、正規表現オブジェクトで、大文字小文字の区別をしない場合は、ignoreCaseはTrueですね。

  • ss-ak
  • ベストアンサー率58% (23/39)
回答No.1

hogehoge = Instr(baf,"<td class=""abc"">") で、いかがでしょう。

関連するQ&A

  • VBAで別モジュールへの変数の受け渡し方法

    初歩的な質問で申し訳ありません、 googleでもどのように検索してよいのかわからないので教えてください。 Userformにて作成したコード内にhogehogeという変数を宣言したとします。 これをPublic Sub CommandButton1_Click()内でhogehogeに文字列abcを代入します。 そしてcall を使ってmodule1の処理を行うのですが、 module1内で変数hogehogeに文字列abcが既に代入されているものとして hogehogeを使いつつ、処理を続けるにはどのようにすればよいのでしょうか? callで呼ぶ際に変数hogehogeの受け渡しなどが必要なのでしょうか? (ちなみに全てPublic Subで書いております) 初心者なので質問がおかしいかもしれませんが よろしくお願いします。

  • INSTR

    こんにちわ。 なぜかオラクルシルバーという資格を取らなければいけないことになりました。 私パソコンなんて全然わからないのに・・。 今、翔泳社から出ている「オラクルマスター教科書 Silver」という本で勉強中ですが、わからない事がありますので教えていただけたら嬉しいです! 文字列関数のINSTRについてなんですが、教科書に例として INSTR('SYSTEMTECHNOLOGY-I','E',8,1) ----------------------------------- 9 と載っています。 INSTRの定義は、INSTR(char1,char2,n,m)で、 char1のn番目の文字からchar2の探索を開始し、char2がm番目に現れる位置を戻す、とあります。 なので、この例題の場合は、 'SYSTEMTECHNOLOGY-I'の8版目の文字列→E から E の探索を開始し、 E が 1 番目に現れる位置を戻すのですから、 答えは0だと思うのですが・・・・・・・ 私の考え方はどこが間違っているのでしょうか。 数学は苦手なんです~~~ 宜しくお願いします!!

  • 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

  • エクセルVBAでwebのソースコードを検索&取得

    webページのソースコードを検索して、検索した文字列に続く3文字を取得したいです webページのソースコードが下記だと仮定します (ソースコード)   AAA   ABC***   BBB   CCCAAA ABC という文字列を検索して、***という変数を取得したいです ***の部分は毎回変わる、英数字のランダムな文字です 説明が下手で申し訳ありません どの様に取得すればよいかわかりません どうぞよろしくお願い申し上げます

  • マクロのInstr()などでスペースが半角全角不明の時は?

    InstrやRight関数で文字列変数内のスペースを取得するとき、半角全角どちらでもOKにするにはどう記述しますか? Instr(myStr," " Or " ")はエラーになります。

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

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

  • VBAでIEのページの状態を取得する時に出るエラー

    今まで特に問題なく、データを取得できていたのに、 ここ最近データを取得できなくなってしまった為、お知恵を貸してください。 For Each obj3 In ie.document.getElementsByTagName("td") If InStr(obj3.innerHTML, "INPUT") Or InStr(obj3.innerHTML, "input") Then hiddenValue = ie.document.getElementById("hogehoge").Value Exit For End If Next VBAで上記のようなコードを記入し、 inputにある hogehogeのIDの値を取得するようなプログラムを書いています。 hiddenValue に値が入る場合と値が入らない場合があるのですが、 値がNULLになる時のHTMLソースを見ても、hogehogeのIDがある為、何が原因なのかが不明です・・・。 どなたかこのような状況になったことはないでしょうか?? お知恵を貸してください。

  • preg_match_all、余計な文字を消したい

    $source = "(・・・数千文字あるので省略します)" $data = '/<td class="c">\s*.*\s*<\/td>|<td>.*<\/td>/'; preg_match_all($data, $source, $data_matches); var_dump($data_matches); 上記、var_dumpの出力内容は(何故か二次元配列になってしまうんですが)、 array(1) { [0]=> array(80) { [0]=> string(72) "<td class="c"> hogehoge </td>" [1]=> string(21) "<td class="c">hogehoge</td>" [2]=> string(27) "<td>hogehoge</td>" [3]=> string(9) "<td>hogehoge</td>" [4]=> string(21) "<td class="c">hogehoge</td>" [5]=> string(9) "<td>hogehoge</td>" 上記の様に、欲しかったhogehogeの情報は取れているんですが、 <td class="c"></td>、<td></td>が邪魔です。。。 '/<td class="c">\s*.*\s*<\/td>|<td>.*<\/td>/'; 上記の正規表現は、hogehogeの場所を突き止めるのに必要だと思うんですが、 hogehogeのみ抽出したくて・・・。 $re = str_replace('<td class="c">', "", $data_matches); var_dump($re); 例えば上記の様にしても、<td class="c">が消えてくれません。。。 質問 1、何故、二次元配列になってしまうんでしょうか?問題ないのでしょうか?出来れば普通の配列にしたいんですが・・・。 2、どうすればhogehogeの場所を突き止め、そしてさらにhogehogeのみの情報を抽出出来るでしょうか?

    • 締切済み
    • PHP
  • VB6.0 特定の文字列の取得方法

    環境:WINDOWS 2000 Visual Basic 6.0 (1)htmlファイルをInbutB関数で読み込み、変数AAAに代入 (2)Instr関数を使用して Instr(htmlが格納された変数,"<td")などと特定の文字位置を検索 (3)mid関数などで特定の文字位置から文字位置を抜き出す  例:mid(AAA,<TD>開始位置A,文字列開始位置B) 上記のようなことをやりたいと考えています。 今回困っていることは<TD>開始タグの文字位置の検索です。 <td valign="top" align="right" width="600"> width="600"のtd開始タグの位置を検索したいと思っています。 ファイルは複数あり、<td と width="600" の間に入っているものも異なり、またシンプルに<td width="600>というパターンも存在します。 こういった場合、どの用に特定の条件を満たした<TD>タグの位置を検索すればよいでしょうか?

  • UWSCで、htmlソース取得

    htmソース内の、 ある文字列 "ABC"以降を 取得するには、 どのようなコードを書けば よろしいでしょうか?

専門家に質問してみよう