« ウィンドウの分割とウィンドウ枠の固定 | トップページ | 大文字/小文字変換,全角/半角変換,ひらがな/カタカナ変換 »

2020年5月 3日 (日)

複数個の文字列を一括で置換する

Excelで置換をするには
ショートカットキーCtrl+Fで表示されるウィンドウで
検索する文字列と置換後の文字列を指定し,
[置換]をクリックします。
Vba20200503a

複数個の文字列を置換したい場合は
1つずつ文字列を入力して置換していくことになります。

VBAで複数個の文字列を一括で置換してみます。
大まかな手順は次の通りです。
名前が"複数置換"のシートを作成して
検索する文字列と置換後の文字列を手入力する。
入力された文字列に対して
VBAで1つずつ検索・置換をしていく。

まず,検索・置換する文字列を入力するシートを作成します。
シートを追加し名前を"複数置換"にします。
このシートのA5セル以降に検索する文字列を,
B5セル以降に置換後の文字列を入力していく仕様とします。
次の画像を参考にしてください。
Vba20200503b

次のコードは
シート名"複数置換"の5行から15行に入力された文字列を
アクティブシートで検索・置換をします。

複数個の文字列を一括で置換するコード:

Sub macro20200503a()
'複数個の文字列を一括置換する
'検索範囲はアクティブシート
   
    Dim i As Integer
    Dim msg As Integer
    Dim ad As String
    Dim sh1 As Worksheet
    Dim c As Range
    Dim s_word As String, r_word As String
   
    '目的のシートか確認する
    msg = MsgBox("現在のシートで検索・置換を行いますか?", vbOKCancel)
    If msg <> 1 Then
        Exit Sub
    End If
   
    Set sh1 = Sheets("複数置換")
   
    '文字列を1個ずつ検索・置換する
    For i = 5 To 15
        s_word = sh1.Cells(i, 1) '検索する文字列
        r_word = sh1.Cells(i, 2) '置換する文字列
       
        '文字列が空の場合,次の文字列へ
        If s_word = "" Or r_word = "" Then
            GoTo Line100
        End If
       
        'A1セルからアクティブシートの検索開始
        '変数cに検索結果の範囲を格納
        Set c = Cells.Find(What:=s_word, After:=Range("A1"), _
            LookIn:=xlValues, LookAt:=xlPart, _
            SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, MatchByte:=False, _
            SearchFormat:=False)
       
        '一番最初に見つかったセルを変数adに格納する
        If Not (c Is Nothing) Then
            ad = c.Address
        End If
       
        '検索結果がNothingにならない限り検索・置換を続ける
        Do While Not (c Is Nothing)
            c.Activate
            c.Interior.Color = RGB(200, 255, 255)
            c.Replace What:=s_word, Replacement:=r_word, _
                LookAt:=xlPart, SearchOrder:=xlByRows, _
                MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
           
            Set c = Cells.FindNext(After:=c)
           
            '検索結果が一巡したらcをNothingにしてLoopを終了
            If Not (c Is Nothing) Then
                If c.Address = ad Then
                    Set c = Nothing
                End If
            End If
        Loop
       
Line100:
    Next i
   
    MsgBox "検索終了"
   
End Sub

コードの説明をしていきます。

検索・置換する対象はアクティブシートです。
VBAで置換したらものは元に戻せないので,
コード実行前に
目的のシートが選択されているか確認するための
MsgBoxを表示させます。
[キャンセル]がクリックされると検索をしないでコードを終了します。

検索する文字列は変数s_word,
置換する文字列は変数r_wordに入れます。
For文を使って
5行から15行まで文字列を入れ替えていきます。
ある行の文字列が空の場合,検索をしないで次の行に行きます。

検索はFindメソッドを使用します。
What引数に検索したい文字列を指定します。
After引数に検索を開始するセルを指定します。
その他の引数は下記リンク先を参照ください。
Range.Find メソッド (Excel)

Findメソッドで見つかったセルは変数cに格納します。
検索結果がない場合cはNothingになります。
cがNothingでなければ,
検索した文字列が見つかったことがわかります。

最初に見つかったセルのアドレスを
変数adに入れておき,検索の終了の目標とします。

置換はReplaceメソッドを使用します。
詳しくは下記リンク先を参照ください。
Range.Replace メソッド (Excel)

[次を検索]は,FindNextメソッドを使用します。

[置換]と[次を検索]を
Do...While文を使って
変数cがNothingにならない限り続けます。

[置換]と[次を検索]の繰り返しの終了は
検索結果が一番最初のセルに戻った時,
また変数cがNothingになった時です。
この状態になったら
次の行の文字列を検索・置換していきます。
最終行までこの繰り返しです。

使用Ver:Win10, Excel For Office365

|

« ウィンドウの分割とウィンドウ枠の固定 | トップページ | 大文字/小文字変換,全角/半角変換,ひらがな/カタカナ変換 »

コメント

この記事へのコメントは終了しました。