masato日記

勉強ノート

書きためたVBAマクロをだす その1 Word 箇条書き番号テキスト化

職場でWordとかExcelとかをよくつかっていて、それなりにマクロを書きためている。のだが、管理がずさんなため、いつか一度かいたはずのコードがいざというときに出てこなくてあたふたすることがよくある。このままだと、この状況は一向によくならない。そこで、ブログに出すと同時にGithubのレポに上げるようにすれば、記憶とコードの整理が一挙にできてよいのではないかと思いいたった。

第一回は、Wordの箇条書き記号(・とか1. 2. 3..とか)を素のテキストに変換するマクロを紹介したい。紹介するというか、たくさんのところで使われている処理ではある。しかしこのコードは、テキスト変換処理を複数のドキュメントに適用できるようにじゃっかんの拡張をほどこしてある。これは章ごとにファイルが別けられているケースなので便利だと思う。たとえば20ファイルあったときに、20回マクロを実行するのは、それなりに骨が折れるのだ。

コード

メインルーチンとサブルーチンにわける。メインでどのサブルーチンを実行させるかを、ユーザーインプットに応じて分岐させる。サブルーチンの種類というのは、処理範囲を単独ないしはすべてのドキュメントのどちらにするかという選択にもとづいておこなう。

メインルーチン

かんたんにinputboxに1とか2とかを入力することで、範囲を指定できるようにする。

Sub 箇条書き番号テキスト化()
    Dim f
    f = InputBox("箇条書き番号をテキスト化します。処理範囲を指定してください。1=現在の文書、2=すべての文書")
    If f = "" Then
        MsgBox "キャンセルしました", vbOKOnly + vbInformation
        Exit Sub
    End If
    
    Select Case f
        Case 1
            Call ConvertNumbersToTextSingleDocument
        Case 2
            Call ConvertNumbersToTextAllDocuments
    End Select
    
End Sub

サブルーチン

全ドキュメントを処理するばあいは、ドキュメントのオブジェクト変数をループさせる。それ以外は、どっちも同じで、単純にコピペしている。 Lst.ConvertNumbersToTextが箇条書き記号を素のテキストに変換するVBAの組み込みメソッドだ。

Private Sub ConvertNumbersToTextAllDocuments()
    Dim Lst As List
    Dim doc As Document
    
    For Each doc In Documents
        For Each Lst In doc.Lists
            Lst.ConvertNumbersToText
        Next Lst
    Next doc
    MsgBox "完了", vbOKOnly + vbInformation
End Sub

Private Sub ConvertNumbersToTextSingleDocument()
    Dim Lst As List
        
    For Each Lst In ActiveDocument.Lists
        Lst.ConvertNumbersToText
    Next Lst
    MsgBox "完了", vbOKOnly + vbInformation
End Sub

基本的に、これでだいたいうまくいくはず。 Githubへのアップはまた今度やる。