Word 選択範囲の段落の先頭または末尾に指定文字を挿入する
文書の各段落の先頭や末尾に文字をまとめて追加したい場面ってありませんか?
「俺(私)にそんな場面はないっ!」って方には、ここから下の記事は無用の長物です。他の場所に GoTo して下さい。
ということで、今回は選択範囲内にある各段落(の先頭または末尾)にマクロを使って指定文字を挿入させてみようと思います。
実験に協力していただくのは次の文書です。
注:魂の叫びではありません。
目次
各段落の先頭に指定文字を挿入する
任意の範囲を選択した状態でマクロを実行。マクロ実行後に表示される InputBox で入力した文字が各段落の先頭に挿入されるようにします。
コードはこちらです。
Sub 選択中の段落の先頭に指定文字を挿入する() Dim 指定文字 As String Dim 段落 As Paragraph 指定文字 = InputBox("先頭に挿入する文字を入力して下さい。") If 指定文字 = "" Then Exit Sub End If For Each 段落 In Selection.Paragraphs 段落.Range.InsertBefore 指定文字 Next End Sub
選択範囲内の段落すべてに For Each ~Next でループ処理を行うようにします。
ループ内では、一つの段落の範囲に対して InsertBefore で先頭に指定文字を挿入させています。これは簡単ですね。
各段落の末尾に指定文字を挿入する
考え方は先ほどと同じですが、今度は指定文字が各段落の末尾に挿入されるようにします。
コードはこちらです。
Sub 選択中の段落の末尾に指定文字を挿入する() Dim 指定文字 As String Dim 段落 As Paragraph 指定文字 = InputBox("末尾に挿入する文字を入力して下さい。") If 指定文字 = "" Then Exit Sub End If For Each 段落 In Selection.Paragraphs ActiveDocument.Range(0, 段落.Range.End - 1).InsertAfter 指定文字 '改行の手前に挿入するのがポイント Next End Sub
先ほどのコードを、 InsertBefore から InsertAfter に変えるだけでは上手くいかないので若干工夫が必要です。
そのまま InsertAfter にすると改行の後ろ(つまり次の段落の先頭)に文字が挿入されてしまいます。なので Range.End から-1文字の位置(つまり改行の前)に挿入させましょう。この時、段落の Range は引数指定できないので、 ActiveDocument.Range を使用します。
各段落の先頭にクリップボードの各文字を挿入する
ここからはおまけです。
各段落の先頭に InputBox の指定文字ではなく、クリップボードの各行の文字を挿入させます。
コードはこちらです。
Sub 選択中の段落の先頭にクリップボードのデータを貼り付け() Dim myLib As Object Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '参照設定なしでDataObjectのインスタンスを生成する Dim 全文字列 As String Dim 分割文字列 As Variant Dim i As Integer Dim 段落 As Paragraph myLib.GetFromClipboard On Error Resume Next 全文字列 = myLib.GetText On Error GoTo 0 If 全文字列 <> "" Then 分割文字列 = Split(全文字列, vbCrLf) '全文字列を改行で分割し配列に格納する i = 0 For Each 段落 In Selection.Paragraphs If i <= UBound(分割文字列) Then 段落.Range.InsertBefore 分割文字列(i) i = i + 1 Else Exit For End If Next Else MsgBox "クリップボードにデータがありません!" End If End Sub
各段落の末尾にクリップボードの各文字を挿入する
各段落の末尾に InputBox の指定文字ではなく、クリップボードの各行の文字を挿入させます。
コードはこちらです。
Sub 選択中の段落の末尾にクリップボードのデータを貼り付け() Dim myLib As Object Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '参照設定なしでDataObjectのインスタンスを生成する Dim 全文字列 As String Dim 分割文字列 As Variant Dim i As Integer Dim 段落 As Paragraph myLib.GetFromClipboard On Error Resume Next 全文字列 = myLib.GetText On Error GoTo 0 If 全文字列 <> "" Then 分割文字列 = Split(全文字列, vbCrLf) '全文字列を改行で分割し配列に格納する i = 0 For Each 段落 In Selection.Paragraphs If i <= UBound(分割文字列) Then ActiveDocument.Range(0, 段落.Range.End - 1).InsertAfter 分割文字列(i) '改行の手前に挿入するのがポイント i = i + 1 Else Exit For End If Next Else MsgBox "クリップボードにデータがありません!" End If End Sub
※コードの使用方法
- SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存し、やり直しのできる状態にしておいて下さい。Wordで標準モジュールにコードを貼り付けてマクロを使用する方法はこちら。