t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 文書をまともなHTMLに変換するWordマクロ

最近、メインサイト(以下)の更新が滞っている。
トップページ - You.Activate

当初はhtmlの学習も兼ねてテキストエディタで作ったサイトなのだが、ブログの快適さに慣れた後では記事を一本上げるだけでも結構面倒くさい。

かといってWordpressを導入するにはレンタルサーバーのプランをアップグレードしないといけないし、仮に導入したとしてテンプレートをカスタマイズして思い通りのデザインを作り上げるには本格的に勉強しないといけない。

どうしたものかと悩んだ挙句、「そうだ、Word VBAを使おう」という結論に至った。

Word自身、html出力機能はいちおう付いているが、Wordが吐き出すhtmlコードは次のようにごちゃごちゃしており、非常に残念なコードである。タイトルで「まともな」と謳ったのは、標準のhtml保存機能で吐き出されコードがまともじゃないからである。
f:id:t-hom:20160116185605p:plain

私のサイトは次のような見出し構造になっている。
f:id:t-hom:20160116183343p:plain

記事部分のソースは次のように各段落をh2、h3、pタグで括っているだけで、文字の強調にはemタグを使用しているシンプルなものだ。
f:id:t-hom:20160116184413p:plain

今回はWord VBAを使って、Word文書をこのようなシンプルなhtmlコードに変換してみようと思う。

さて、まずWordで記事を作成する。
このとき、個別に書式は設定せず、必ず既存のスタイルを使用する。
f:id:t-hom:20160116185158p:plain

スタイルセットは何でも良いが「シンプル」を選んだ。どのみちスタイルはCSSで指定するので、Word上の見栄えはここでは関係ない。
f:id:t-hom:20160116185304p:plain

各段落に対し、スタイルを割り当てていく。
f:id:t-hom:20160116185109p:plain

そしてWordのNormalテンプレートに標準モジュールを追加し、次のコードを書く。

Sub WordParagraphToHTML()
    Dim p As Paragraph
    Dim Bold As Boolean
    For Each p In ActiveDocument.Paragraphs
        Select Case p.Style
        Case "見出し 1"
            Debug.Print
            Debug.Print "<h3>";
        Case "表題"
            Debug.Print "<h2>";
        Case Else
            Debug.Print "<p>";
        End Select
        Dim c As Range
        For Each c In p.Range.Characters
            If Not Bold And c.CharacterStyle = "強調太字" Then
                Debug.Print "<em>";
                Bold = True
            ElseIf Bold And c.CharacterStyle <> "強調太字" Then
                Debug.Print "</em>";
                Bold = False
            End If
            If Not c = vbCr Then Debug.Print c;
        Next
        Select Case p.Style
        Case "見出し 1"
            Debug.Print "</h3>"
        Case "表題"
            Debug.Print "</h2>"
        Case Else
            Debug.Print "</p>"
        End Select
    Next
End Sub

これを実行すると、イミディエイトウインドウにアクティブな文書に対するhtmlが出力される。

<h2>マクロとVBA</h2>

<h3>マクロについて</h3>
<p>マクロの正式名称は、Macro Instruction…直訳すると、大きな命令という意味になります。その名のとおり、<em>いくつかの小さな命令を集めて、ひとつの大きな命令として扱えるようにしたもの</em>がマクロです。</p>
<p>現実世界にも似た例はあります。たとえば洗濯機だと、水を注ぐ、洗う、すすぐ、脱水するという4つの命令が、洗濯するという1つの命令に集約されています。洗濯マクロとは呼びませんが、考え方は似ています。</p>

<h3>VBAについて</h3>
<p>マクロは小さな命令の集まりであると書きましたが、Excelに日本語で命令しても動かないので、Excelに理解できる言葉で書いてあげる必要があります。その<em>マクロを記述するための言葉</em>がVBA言語です。</p>
<p>Excelにマクロの記録という機能がありますが、あれはエクセルの操作を自動的にVBA言語で記録してくれる機能であって、その機能だけを指してマクロと呼ぶのは間違いです。</p>

<h3>VBA言語と、Excel VBA</h3>
<p>Excel VBAは、純粋なVBA言語とExcelの操作に大別できます。一般的にはこれらをあわせてExcel VBAと呼びますが、セルの操作などは純粋なVBAの命令ではなく、Excelがもともと備えている機能をVBAから呼び出しているに過ぎません。</p>
<p>/</p>
<p>Excel関連の命令はExcel操作の種類の数だけありますので、全部覚えることはできませんし、その必要もありません。</p>
<p>対して純粋なVBAは、覚えることは数えるほどしか無く、あとはそれらをどう組み合わせるかを考えることがメインになってきます。これは日本語の「てにをは」に相当するくらい基本的な部分で、まずVBAを覚えないと役に立つマクロは作れません。</p>
<p><em>覚えなければいけないのはVBAの方で、Excelの操作は都度調べるものである</em>と割り切ってください。Excelの操作は、よく使うものは自然に覚えますので問題ありません。</p>
<p>このサイトで配布している入門教材では主に純粋なVBA言語について解説しています。</p>

あと改良するなら、テキストへ直接出力したり、セクション外のコードをテキストテンプレートから読み込んだりといったことができるが、とりあえずやりたいことはできたので以上でおしまい。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。