pagetaka

写真、PC、ネット、岡山、旅の話題をお届けします

WordVBA:正規表現でHTML・imgタグのalt属性値からtitle属性値を自動作成

HTMLファイルをWordに貼り付け、その中のalt属性からtitle属性をつくりだそうという妄想の結果物です。

これまで、チカラ技でできていたのを、少しばかり「正規表現」などというスマートなやり方にできないものかと、ちょっと妄想しました。

alt="写真説明" を VBA正規表現で一般的に表すと "alt=""[^""]*"""

なにか普段見ることない文字並びです。「"」が3個続いていたりして、わかりにくいといったらありません。一番外側は、普段使う囲みです。でメンドウなのがその内側にあるいくつかの「"」です。
正規表現」をしかと勉強したものではありませんので、ひょっとして条件が異なれば、うまくいかないかも…ビェーン。
alt属性内の「写真説明」は具体的なのですが、それを対象にして1回だけ置換するというのであれば簡単です。しかし、一般的に考えると、その「写真説明」に該当する部分は「[^""]*」(赤字部分が該当部分)です。つまり、属性値となる「"」以外の文字列があるやなしや続いた後、次に出てきた「"」(属性値終了側の「"」)までを変数に取り込む、というようなことになるみたいです。結果的にそうなっているので、どうもこれが正解なのか、もっと厳密な書き方があるのか、爺にはわかりませぬ…。どなたかお教えください…。

正規表現でマッチした回数分、必要な置換作業をRePlaceで実行

Sub タグ属性置換()
'alt属性を利用して、title属性をつくる:正規表現利用
'全文を変数wStoryに格納
Dim wStory As String
    Selection.WholeStory
    wStory = Selection.range.Text
    
'正規表現の用意
Dim re As RegExp
Set re = New RegExp
re.Pattern = "alt=""[^""]*"""   '正規表現:alt属性のダブルクォーテーション内を検索対象にする
re.Global = True                '該当全件対象
Dim i As Integer                '循環用
Dim mc As MatchCollection       '検索マッチコレクションの宣言
    Set mc = re.Execute(wStory) '検索対象文字全文の設定
Dim m As Match                  '検索マッチの宣言
Dim outputTxt As String         '出力文字列格納変数

For i = 0 To mc.Count - 1   '循環==開始
    Set m = mc.Item(i)          'mcの内容をmに代入
    '↓変数reのwStoryのなかで、変数mの文字列をキーとして検索し、
    '↓ヒットしたら、mの内容を複製しtitle属性として加え、結果をoutputTxtに収める
    outputTxt = re.Replace(wStory, m.Value & " title" & Right(m.Value, Len(m.Value) - 3))
Next                        '循環==終了

'置換結果の貼り付け
    Selection.range.Text = outputTxt
'解放
    Set re = Nothing
    Set mc = Nothing
    Set m = Nothing
Selection.HomeKey
End Sub

まあ、なんとなくできた、という感じです。変数wStoryに読み込んだなかを、検索マッチした位置に焦点をあて、その文字列を 検索マッチ文字列からとりだし、title属性などを仕立てあげて、置換し、変数outputTxtに格納する、という流れです。

あのぉ~、かなりへっぴり腰で作ったです。きっともっとスマートなやり方があるでしょうね。よろしかったら、お教えください。ペコリ

事前に正規表現を使うのを設定しなければ…

開発→VBE→ツール→参照設定→Microsoft VBScript Regular Expressions 5.5 にチェックを入れる

それから、わかっている人にはどうでもいいことですが、空白のalt属性値だったら、とか、すでにtitle属性が記入されている場合、ファイルを次々と巡回する、などなど、本来気にする必要のあることをスルーしてます。すみません…。

GREEN HOUSE SATA - eSATA/USB変換ケーブル GH-USES-SATA

GREEN HOUSE SATA - eSATA/USB変換ケーブル GH-USES-SATA