正規表現を用いてHTTPタグを除去するVBAを記述する
フィードのデータは、ブラウザ表示用にHTML形式になっている場合があります。Excelでは、HTMLタグがそのまま表示されてしまいますので、<~>
の形の文字列を削除する必要があります。VBA単独では、*などのワイルドカードを使った置換もできませんが、VBScriptのモジュールによって、正規表現を利用できます。
正規表現とは、ワイルドカードよりも強力な検索機能で、下表のように様々なパターンを表現することができます。正規表現はテキストエディタなどで、文字列を一括変換する際にも利用できますので、覚えておくとお得です。
表3.正規表現の主なパターン
表現 | 意味 | 表現例 | 一致する文字列 | 一致しない文字列 |
---|---|---|---|---|
* | 直前の文字0字以上 | "fe*d" | "feed"、"fd" | "fee" |
+ | 直前の文字1字以上 | "fe+d" | "feed"、"fed" | "fd" |
? | 直前の文字0字または1字 | "fe?d" | "fd"、"fed" | "feed" |
. | 任意の1文字 | "f.+d" | "feed"、"food"、"find" | "fee" |
(パターン) | パターン文字列 | "(fed)" | "fed" | "feed" |
x|y | xとyのどちらか | "f(e|o)*d" | "fed"、"food" | "find" |
{n} | 直前の文字n字 | "fe{1}d" | "fed" | "feed"、"fd" |
{n,} | 直前の文字n字以上 | "fe{2,}d" | "feed"、"feeed" | "fed" |
{n,m} | 直前の文字n字以上m字以下 | "fe{1,2}d" | "fed"、"feed" | "fd"、"feeed" |
[xyz] | x,y,zのいずれか | "beg[iau]n" | "begin"、"began"、"begun" | "begon" |
[^xyz] | x,y,z以外の文字 | "s[^eou]t" | "sit"、"sat" | "set" |
[x-z] | xからzまでの文字 | "sa[k-n]e" | "sale"、"same" | "safe"、"save" |
[^x-z] | xからz以外の文字 | "sa[^k-n]e" | "safe"、"save" | "sale"、"same" |
\d | 数字。[0-9]と同じ | "W\dC" | "W3C" | "WBC" |
\D | 数字以外。[^0-9]と同じ | "W\DC" | "WBC" | "W3C" |
\w | 英数字とアンダーバー。[A-Za-z0-9_]と同じ | "W\wC" | "W3C"、"WBC" | "W C" |
\W | 英数字とアンダーバー以外。[^A-Za-z0-9_]と同じ | "W\WC" | "W C" | "W3C"、"WBC" |
この他、制御文字のパターンとしては、\t(タブ文字)、\n(改行文字)、\r(キャリッジ リターン文字)、\s(スペース、タブなどの空白文字、[ \f\n\r\t\v]
と同じ)、\S(空白文字以外、[^ \f\n\r\t\v
]"と同じ)などがあります。詳しくは、下記のURLも参考にしてください。
http://msdn.microsoft.com/ja-jp/library/cc392403.aspx
VBScriptの正規表現モジュールを利用しますので、「Microsoft VBScript Regular Expressions 1.0」の参照設定を追加しておいてください。
[リスト2]HTMLタグを除去するユーザ定義関数
Private Function cdataConv(str As String) As String
Dim regEx As New RegExp
regEx.Pattern = "<[^>]*>"
regEx.Global = True
cdataConv = regEx.Replace(str, "")
End Function
まず、正規表現を利用するためのRegExpオブジェクトを生成したら、HTMLタグの<~>パターンとしてPatternプロパティに"<[^>]*>"
を設定します。
任意の文字の0文字以上、ということで"<.*>"
でも良さそうですが、"."は>
にも合致するため、例えば「<P>あいうえお</P>」
全体にも合致してしまいます。<P>と</P>
だけに合致させるには、間の文字すべてが>でない条件が必要で、これは[^>]
と表されます。
なお、^は[]、
()内で用いると否定の意味になりますが、単独だと行頭を表すパターンになりますので[]
も必要です。
次に、globalプロパティにTrueを設定します。これを省略すると、最初の1パターンにしか合致しません。
最後に、Replaceメソッドを用いて、元の文字列<~>のパターンをすべて、""(空文字)に置換します。
以上で完成です。「更新する」ボタンをクリックして、更新データが表示されれば成功です(完全なコードは、ここからダウンロードしてください)。
まとめ
ExcelによるRSS1.0形式のフィードの読み込みはいかがでしたか。RSS1.0またはRSS2.0形式であれば、URLを変更することにより、様々なニュース配信サイトの情報を収集できます。
WINGSプロジェクト 遠藤 存著/山田祥寛監修
WINGS プロジェクトについて
テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。2011年5月時点での登録メンバは35名で、現在も一緒に執筆をできる有志を募集中。