法律文書起案用MS Word用VBAマクロ

Office 2016 for Macがいつの間にか出ていた

 7月からOffice 2016 for Macが出ていたんですね。Office 365ユーザー向けで。気付いていませんでした。私(当事務所)はOffice 365 Businessを利用していますので、使えます。

良かったのでメインで使おうと思った

 早速、使ってみました。
 少し試してみたところ、弁護士用に配布されている書式(おそらくWindows版のMS Officeで作られたものでしょう)との互換性が、Office for Mac 2011と比べて良くなっているように思います。あと、UIが美しいです。
 私(当事務所)は他人が作った書式を利用するとき以外はLibreOfficeを使っていたのですが、これからはもうMS Officeをメインにしてもいいかな、と思いました。

私は今までLibreOfficeでマクロを使っていた

 LibreOfficeでは私はこういうマクロを作って(法律文書起案用mi文法定義スクリプトとOpenOffice系マクロ)使っていました。”第1 ”とか”1 ”とかの文字列に反応してインデントを自動設定するマクロです。まずテキストエディタ(具体的にはmi)で起案して(プレーンテキストですが、この際にもスクリプトで色分け表示されます)、それをLibreOfficeにコピペしてマクロでインデントをつけて提出するわけです。

VBAでMS Word用にマクロを作り直した

 MS Officeに移行するならVBAでマクロを作り直さないとな、と思って、昨日VBAの入門書を買ってきて勉強して、マクロを作ってみました。
 前回のLibreOffice用マクロでは”第1 ”等の文字列に反応してスタイルを指定するというものでした。しかし、それでは、テンプレートファイルと連携を取る必要があってちょっと使い勝手が悪く感じたので、今回はスタイルに依存せずに直接マクロからインデントを指定しています。あと前回は文書全体に処理をかけていましたが、今回は選択範囲だけです。
【2015年10月26日追記】
 LibreOffice用マクロの方を、この記事のMS Word用マクロとほぼ同じ仕様に書き換えました。
【2015年10月26日追記終わり】

ところが、今のバージョンでは使えなかった

 ところが!Office 2016 for MacではVBE(マクロの開発環境)周りを作り直そうとしているようですね。そしてまだ作っている途中のようで、今のバージョンのOffice 2016 for MacではVBEにほとんど機能がない状態です。それでも、一旦Office for Mac 2011でマクロを作って、それをコピペするなりしてOffice 2016 for Macに持ってくればいいんじゃないかな、と思って、Office for Mac 2011で作ってみたんですけど、なんか100行ぐらいしかペーストできなかったんですよね……。だから、一応作ったし機能は今までのLibreOffice用のやつより気に入っているんですが、まだ私は実務で使えていません。これからも当分使わないでしょう。なんだそれ。

仕様(平成27年10月25日に少し変更)

 一応説明しておきますが、”第1 ”とか”(1) ”とかで始まる段落とそれに続く全角スペース2個で始まる段落にはまあ法律文書として普通のインデントが付いて、フォントが12ポイントになります。段落頭のナンバリングは、原則として全角で、括弧は半角で、括弧内の英数字は半角です。
 全角又は半角の、スペースが2個で始まり1個で終わる段落は右に寄せられ、スペースが2個で始まり2個で終わる段落は真ん中に寄せられ、スペースが3個で始まり3個で終わる段落は真ん中に寄せられた上でフォントが14ポイントになり、スペースが4個で始まり4個で終わる段落は真ん中に寄せられた上でフォントが16ポイントになります。
 選択範囲が処理されます。

結語

 とりあえず当記事に置いておくので、参考にする人はしてください。
 私はまだ使っていないので、細かい調整は必要かもしれません。
 改良したらまたこの記事も書き直しに来ます。

【2015年10月25日追記】
 結局、このマクロ作って以来、MS Office for Mac 2011でこれを使って仕事しています。MS Office 2016 for MacのVBEはアップデートのたびに少しずつ機能が実装されているんですが、あまり多くの行を書けないのは直ってません。早く2016に完全移行したいです。

更新履歴

・2015年8月11日22時頃
 段落が何とも一致しなかった場合の処理を、最初に一律でやってしまうのではなく、一致があったかどうかをBoolean型の変数で管理して一致がなかった場合にだけ最後にやることにしました。
・2015年8月12日2時30分頃
 WordWrapの設定を追加することで、中央揃えにした時に文字が中央に来ない不具合を直しました。
・2015年10月25日22時頃
 Like演算子というものを今日知ったので、それで全面的に書き直しました。ついでに、何とも一致しなかった場合にデフォルトの段落になるようにして、段落頭に全角スペースが2つ並ぶと前段落と同じインデントがつく(前段落「第n 」の場合を除く)という仕様に変更しました。
・2015年10月26日2時頃
 Like演算子を使って最後の方の「Align等をスペースで指定する場合」を書き直して処理が無駄なく速くなるようにしました。
・2015年10月27日1時30分頃
 ElseIfを使って書き直しました。
・2015年10月27日19時20分頃
 「2(1) 」や「(3)ア 」等の表現に対応しました。
 「① 」〜「⑨ 」が列挙される際、①の前の段落と比較して1字下がるようにしました。
・2015年10月28日13時頃
 「① 」〜「⑨ 」が列挙された後、頭が「  」の段落に続くと、「① 」〜「⑨ 」が列挙される前のインデントに戻るようにしました。
・2015年10月29日22時30分頃
 スペースで指定する箇所のバグフィックス。


Sub Kian()

Dim para  As Paragraph
Dim paraStr As String

'選択範囲の各段落を取り出す
For Each para In Selection.Paragraphs
    
    paraStr = Left(para.Range, Len(para.Range) - 1)

    '段落頭がスペース2つで始まる場合は前段落と同じ状態にする
    If Left(paraStr, 2) = "  [! ]" And Right(paraStr, 1) Like "[! ]" Then
        para.FirstLineIndent = -12
        para.LeftIndent = para.Previous.LeftIndent
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True
    
    '段落頭文字と一致した場合の処理
    ElseIf Left(paraStr, 3) Like "第[1-9] " Or Left(paraStr, 4) Like "第[0-9][0-9] " Then
        para.FirstLineIndent = -24
        para.LeftIndent = 24
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True

    ElseIf Left(paraStr, 2) Like "[0-9] " Or Left(paraStr, 3) Like "[0-9][0-9] " Then
        para.FirstLineIndent = -12
        para.LeftIndent = 24
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True
    
    ElseIf Left(paraStr, 5) Like "[0-9]([0-9]) " Or Left(paraStr, 6) Like "[0-9]([0-9][0-9]) " Or Left(paraStr, 6) Like "[0-9][0-9]([0-9]) " Or Left(paraStr, 7) Like "[0-9][0-9]([0-9][0-9]) " Then
        para.FirstLineIndent = -24
        para.LeftIndent = 36
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True

    ElseIf Left(paraStr, 4) Like "([0-9]) " Or Left(paraStr, 5) Like "([0-9][0-9]) " Then
        para.FirstLineIndent = -12
        para.LeftIndent = 36
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True
        
    ElseIf Left(paraStr, 5) Like "([0-9])[ア-ン] " Or Left(paraStr, 6) Like "([0-9][0-9])[ア-ン] " Then
        para.FirstLineIndent = -24
        para.LeftIndent = 48
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True

    ElseIf Left(paraStr, 2) Like "[ア-ン] " Then
        para.FirstLineIndent = -12
        para.LeftIndent = 48
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True
        
    ElseIf Left(paraStr, 5) Like "[ア-ン]([ア-ン]) " Then
        para.FirstLineIndent = -24
        para.LeftIndent = 60
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True

    ElseIf Left(paraStr, 4) Like "([ア-ン]) " Then
        para.FirstLineIndent = -12
        para.LeftIndent = 60
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True
        
    ElseIf Left(paraStr, 5) Like "([ア-ン])[a-z] " Then
        para.FirstLineIndent = -24
        para.LeftIndent = 72
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True

    ElseIf Left(paraStr, 2) Like "[a-z] " Then
        para.FirstLineIndent = -12
        para.LeftIndent = 72
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True
        
    ElseIf Left(paraStr, 5) Like "[a-z]([a-z]) " Then
        para.FirstLineIndent = -24
        para.LeftIndent = 84
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True

    ElseIf Left(paraStr, 4) Like "([a-z]) " Then
        para.FirstLineIndent = -12
        para.LeftIndent = 84
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True
        
    '段落頭が「① 」ないし「⑨ 」の場合は前段落より1字下げる
    ElseIf Left(paraStr, 2) = "① " Then
        para.FirstLineIndent = -12
        para.LeftIndent = para.Previous.LeftIndent + 12
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True
        
    ElseIf Left(paraStr, 2) Like "[②-⑨] " Then
        para.FirstLineIndent = -12
        para.LeftIndent = para.Previous.LeftIndent
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True

    '契約書用条文番号
    ElseIf Left(paraStr, 3) Like "第[0-9]条" Or Left(paraStr, 4) Like "第[0-9][0-9]条" Then
        para.FirstLineIndent = -12
        para.LeftIndent = 12
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True

    'Align等を半角スペースで指定する場合
    ElseIf Left(paraStr, 3) Like "  [! ]" And Right(paraStr, 2) Like "[! ] " Then
        para.FirstLineIndent = 0
        para.LeftIndent = 0
        para.Alignment = wdAlignParagraphRight
        para.Range.Font.Size = 12
        para.WordWrap = True

    ElseIf Left(paraStr, 3) Like "  [! ]" And Right(paraStr, 3) Like "[! ]  " Then
        para.FirstLineIndent = 0
        para.LeftIndent = 0
        para.Alignment = wdAlignParagraphCenter
        para.Range.Font.Size = 12
        para.WordWrap = False

    ElseIf Left(paraStr, 4) Like "   [! ]" And Right(paraStr, 4) Like "[! ]   " Then
        para.FirstLineIndent = 0
        para.LeftIndent = 0
        para.Alignment = wdAlignParagraphCenter
        para.Range.Font.Size = 14
        para.WordWrap = False

    ElseIf Left(paraStr, 5) Like "    [! ]" And Right(paraStr, 5) Like "[! ]    " Then
        para.FirstLineIndent = 0
        para.LeftIndent = 0
        para.Alignment = wdAlignParagraphCenter
        para.Range.Font.Size = 16
        para.WordWrap = False

    'Align等を全角スペースで指定する場合
    ElseIf Left(paraStr, 3) Like "  [! ]" And Right(paraStr, 2) Like "[! ] " Then
        para.FirstLineIndent = 0
        para.LeftIndent = 0
        para.Alignment = wdAlignParagraphRight
        para.Range.Font.Size = 12
        para.WordWrap = True

    ElseIf Left(paraStr, 3) Like "  [! ]" And Right(paraStr, 3) Like "[! ]  " Then
        para.FirstLineIndent = 0
        para.LeftIndent = 0
        para.Alignment = wdAlignParagraphCenter
        para.Range.Font.Size = 12
        para.WordWrap = False

    ElseIf Left(paraStr, 4) Like "   [! ]" And Right(paraStr, 4) Like "[! ]   " Then
        para.FirstLineIndent = 0
        para.LeftIndent = 0
        para.Alignment = wdAlignParagraphCenter
        para.Range.Font.Size = 14
        para.WordWrap = False

    ElseIf Left(paraStr, 5) Like "    [! ]" And Right(paraStr, 5) Like "[! ]    " Then
        para.FirstLineIndent = 0
        para.LeftIndent = 0
        para.Alignment = wdAlignParagraphCenter
        para.Range.Font.Size = 16
        para.WordWrap = False

    '何とも一致しなかった場合はデフォルトの段落
    Else
        para.FirstLineIndent = 0
        para.LeftIndent = 0
        para.Alignment = wdAlignParagraphLeft
        para.Range.Font.Size = 12
        para.WordWrap = True

    End If
    
    '段落頭が「① 」ないし「⑨ 」の段落が終わった後の段落頭が「  」の段落のインデントをその前の状態に戻す
    If Not para.Previous Is Nothing Then
        If Left(paraStr, 3) Like "  [! ]" And Right(paraStr, 1) Like "[! ]" And Left(para.Previous.Range, 2) Like "[①-⑨] " Then
            If Not Left(para.Previous.Previous.Range, 2) Like "[①-⑨] " Then
                para.FirstLineIndent = -12
                para.LeftIndent = para.Previous.Previous.LeftIndent
                para.Alignment = wdAlignParagraphLeft
                para.Range.Font.Size = 12
                para.WordWrap = True
            ElseIf Not Left(para.Previous.Previous.Previous.Range, 2) Like "[①-⑨] " Then
                para.FirstLineIndent = -12
                para.LeftIndent = para.Previous.Previous.Previous.LeftIndent
                para.Alignment = wdAlignParagraphLeft
                para.Range.Font.Size = 12
                para.WordWrap = True
            ElseIf Not Left(para.Previous.Previous.Previous.Previous.Range, 2) Like "[①-⑨] " Then
                para.FirstLineIndent = -12
                para.LeftIndent = para.Previous.Previous.Previous.Previous.LeftIndent
                para.Alignment = wdAlignParagraphLeft
                para.Range.Font.Size = 12
                para.WordWrap = True
            ElseIf Not Left(para.Previous.Previous.Previous.Previous.Previous.Range, 2) Like "[①-⑨] " Then
                para.FirstLineIndent = -12
                para.LeftIndent = para.Previous.Previous.Previous.Previous.Previous.LeftIndent
                para.Alignment = wdAlignParagraphLeft
                para.Range.Font.Size = 12
                para.WordWrap = True
            ElseIf Not Left(para.Previous.Previous.Previous.Previous.Previous.Previous.Range, 2) Like "[①-⑨] " Then
                para.FirstLineIndent = -12
                para.LeftIndent = para.Previous.Previous.Previous.Previous.Previous.Previous.LeftIndent
                para.Alignment = wdAlignParagraphLeft
                para.Range.Font.Size = 12
                para.WordWrap = True
            ElseIf Not Left(para.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Range, 2) Like "[①-⑨] " Then
                para.FirstLineIndent = -12
                para.LeftIndent = para.Previous.Previous.Previous.Previous.Previous.Previous.Previous.LeftIndent
                para.Alignment = wdAlignParagraphLeft
                para.Range.Font.Size = 12
                para.WordWrap = True
            ElseIf Not Left(para.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Range, 2) Like "[①-⑨] " Then
                para.FirstLineIndent = -12
                para.LeftIndent = para.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.LeftIndent
                para.Alignment = wdAlignParagraphLeft
                para.Range.Font.Size = 12
                para.WordWrap = True
            ElseIf Not Left(para.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Range, 2) Like "[①-⑨] " Then
                para.FirstLineIndent = -12
                para.LeftIndent = para.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.LeftIndent
                para.Alignment = wdAlignParagraphLeft
                para.Range.Font.Size = 12
                para.WordWrap = True
            ElseIf Not Left(para.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Range, 2) Like "[①-⑨] " Then
                para.FirstLineIndent = -12
                para.LeftIndent = para.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.Previous.LeftIndent
                para.Alignment = wdAlignParagraphLeft
                para.Range.Font.Size = 12
                para.WordWrap = True
            End If
        End If
    End If
    
Next

End Sub

このエントリーをはてなブックマークに追加

「法律文書起案用MS Word用VBAマクロ」への2件のフィードバック

コメントは停止中です。