VBAの勉強を始めてみた

色々試しています。

Word 左からの文字数指定で置換する

前回は段落の両端に対しての処理でしたが、今回は段落の内側にアプローチしてみたいと思います。
ということで、左からの文字数指定で各段落の内側を置換するマクロを作ってみました。

 

前回と同じように任意の範囲を選択します。
仮に左から5文字目を置換開始位置にし、そこから3文字分を ヽ(‘ ∇‘ )ノ に置換してみます。

f:id:kouten0430:20181021110734j:plain

 

f:id:kouten0430:20181020125923j:plain

 

範囲選択してからマクロ実行。InputBox の指示に従い、置換開始位置、置換開始位置からの文字数、指定文字を入力するだけで使えます。

コードはこちら。

Sub 左からの文字数指定で置換する()
    '選択範囲内にある各段落に対して処理します
    'ReplaceEndが0指定のときは、置換開始位置の左側に挿入されます
    Dim ReplaceStart As Integer
    Dim ReplaceEnd As Integer
    Dim 指定文字 As String
    Dim SelectionStart As Integer
    Dim SelectionEnd As Integer
    Dim 段落 As Paragraph
    
    ReplaceStart = InputBox("左から何文字目を置換開始位置にしますか?")
        If ReplaceStart < 1 Then
            ReplaceStart = 1
        End If
    ReplaceEnd = InputBox("開始位置から何文字分を置換しますか?")
        If ReplaceEnd < 0 Then
            ReplaceEnd = 0
        End If
    
    指定文字 = InputBox("置換後の文字を入力して下さい。")
        If 指定文字 = "" Then
            Exit Sub
        End If

    'Textプロパティで選択が解除されるので、選択範囲を記憶させる
    SelectionStart = Selection.Start
    SelectionEnd = Selection.End
    
    For Each 段落 In ActiveDocument.Range(SelectionStart, SelectionEnd).Paragraphs
        If 段落.Range.Start + ReplaceStart - 1 < 段落.Range.End - 1 Then    '開始位置が段落の文字数を超過している場合は処理しない
            If 段落.Range.Start + ReplaceStart + ReplaceEnd - 1 <= 段落.Range.End - 1 Then
                ActiveDocument.Range(段落.Range.Start + ReplaceStart - 1, _
                段落.Range.Start + ReplaceStart + ReplaceEnd - 1).Text = 指定文字
            Else    '開始位置からの文字数が段落の範囲を超える場合、強制的に範囲内で収める
                ActiveDocument.Range(段落.Range.Start + ReplaceStart - 1, _
                段落.Range.End - 1).Text = 指定文字
            End If
        End If
    Next
    
End Sub

 

※コードの大まかな流れ

  • まず左から何文字目を開始位置にするか、開始位置から何文字分を置換するか、置換後の文字を何にするか InputBox で指定します。
  • 現在の選択範囲の開始位置と終了位置を変数に入れておきます(処理中に選択が解除されてしまうため)。
  • For Each ~Next で、選択範囲内の段落すべてにループ処理を行います。
  • ループ内の処理:置換開始位置から指定文字分を Text プロパティで置換します。(条件分岐では、各段落の末端位置よりも置換開始位置が超過していた場合は処理をパスし、指定文字数が超過していた場合はマイナス補正〔末端位置まで〕をかけています。)

 

※コードの使用方法

  • SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存し、やり直しのできる状態にしておいて下さい。Wordで標準モジュールにコードを貼り付けてマクロを使用する方法はこちら