t-hom’s diary

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

VBA ソースコードをカラーで印刷するWordマクロ

同じコードでもキーワードに着色されているだけで、ずいぶん見やすくなる。
f:id:t-hom:20160116233630p:plain

しかし残念なことに、VBエディタの印刷機能ではソースコードをカラー印刷できない。

コピーしてWordに張り付けても、元がただのテキストなので黒一色になってしまう。
そこで今回は、キーワードを自動判別して着色してくれるWordマクロを作成してみた。

Sub KeyWordsHighLight()
    Dim p As Range
    For Each p In ActiveDocument.Words
        Dim Keyword As Variant
        For Each Keyword In Split( _
            "And Append As Assert Base Binary ByRef ByVal Call Case " & _
            "Compare Declare Debug Dim Do DoEvents Each Else ElseIf Empty " & _
            "End Error Exit Explicit False For Friend Function Get GoSub " & _
            "GoTo If In Input Is Let Lock Loop New Next Not Nothing Null Open " & _
            "Option Optional Output Or On ParamArray Print Private Private Property " & _
            "Public Random Read Resume Seek Select Set Shared Static Static Step " & _
            "Sub Then To True With WithEvents Write Xor")
            
            If Trim(p.Text) = Keyword Then
                On Error Resume Next
                
                'Select文と、Range("A1").SelectのSelectが両方キーワード扱いになるため、
                '前の文字がドットなら除外。ただし、Debug.PrintとDebug.Assertは例外。
                If Not p.Previous(WdUnits.wdCharacter, 1).Text = "." Or _
                        Trim(p.Text) = "Print" Or _
                        Trim(p.Text) = "Assert" Then
                    p.Select
                    Selection.Font.ColorIndex = wdBlue
                End If
                On Error GoTo 0
            End If
        Next
    Next
End Sub

コードはやっつけ仕事なので色々と粗が目立つ。
特にソースコード中にコメントを書いた部分の処理は本当はもっとスマートなやり方があるはずだけれど、面倒くさかったので強引にIf文で判定させた。

実行するとこのとおり、キーワードが青色に着色される。
f:id:t-hom:20160116234244p:plain

このマクロは文字列の中にある単語もキーワード判定するので注意。
したがって、上記コードをWordの本文に張り付けて、マクロを実行すると、以下のように文字列中のキーワードが真っ青になってしまう。

f:id:t-hom:20160116234625p:plain

まあ、メタプログラミング系を扱わなければ、だいたいうまく動作するし、個別の色は少しくらいWordで手直ししてもたかだかしれているのでこれで良しとする。

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