VBAの勉強を始めてみた

色々試しています。

Word 選択範囲の段落の先頭または末尾に指定文字を挿入する

文書の各段落の先頭や末尾に文字をまとめて追加したい場面ってありませんか?
「俺(私)にそんな場面はないっ!」って方には、ここから下の記事は無用の長物です。他の場所に GoTo して下さい。

ということで、今回は選択範囲内にある各段落(の先頭または末尾)にマクロを使って指定文字を挿入させてみようと思います。

実験に協力していただくのは次の文書です。

f:id:kouten0430:20181017131736j:plain

注:魂の叫びではありません。

 

目次

 

各段落の先頭に指定文字を挿入する

任意の範囲を選択した状態でマクロを実行。マクロ実行後に表示される InputBox で入力した文字が各段落の先頭に挿入されるようにします。

f:id:kouten0430:20181017131856j:plain

 

コードはこちらです。

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 で先頭に指定文字を挿入させています。これは簡単ですね。

 

 

各段落の末尾に指定文字を挿入する

考え方は先ほどと同じですが、今度は指定文字が各段落の末尾に挿入されるようにします。

f:id:kouten0430:20181017132919j:plain

 

コードはこちらです。

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 の指定文字ではなく、クリップボードの各行の文字を挿入させます。

f:id:kouten0430:20181017133409j:plain

 

コードはこちらです。

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 の指定文字ではなく、クリップボードの各行の文字を挿入させます。

f:id:kouten0430:20181017133534j:plain

 

コードはこちらです。

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で標準モジュールにコードを貼り付けてマクロを使用する方法はこちら