[[20220115111625]] 『削除候補を複数個指定して文字列から削除する方法』(Inoue) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『削除候補を複数個指定して文字列から削除する方法』(Inoue)

最下部は、指定文字を削除をする場合のコードです。

削除予定の文字は、Replace_Mojiに一文字だけ取り込まれますが、
事前に削除候補を複数個指定することはできますか ?

イメージとしては、

    Replace_Mojis="moji1,moji2,moji3,moji4"
    Cells(i, "B") = Replace(Cells(i, "A"), Replace_Mojis "", 1, 1, 1)

Replace_Mojiを何度か必要数指定して

    Forでその都度書き出す列を右側に指定していけば出来そうですが
    列を複数使用事になり無駄が多いです。

具体的には

    A列にオリジナル処理対象文字列
    1回目の指定文字指定でB列に削除後の文字列を書き出す

    B列を処理対象文字列
    2回目の指定文字指定でC列に削除後の文字列を書き出す

    C列を処理対象文字列
    3回目の指定文字指定でD列に削除後の文字列を書き出す

    (後同じ処理を必要回数実行する。)


Replace_Moji = InputBox("置換する文字列を指定してください。" & Chr(13) & _

                "既定値は、最初の「(」のみを削除するようにしています。" & Chr(13) & _
                Chr(13) & _
                "「(」を指定の場合、2回めの「(」は削除対象外です。", "Replace", "(")

'「キャンセル」がクリックされた場合
If Replace_Moji = "" Then

    MsgBox "「キャンセル」が選択されました。" & Chr(13) & _
            "処理を中止します。"
    Exit Sub
End If

For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row

    Cells(i, "B") = Replace(Cells(i, "A"), Replace_Moji, "", 1, 1, 1)
Next

< 使用 Excel:Office365、使用 OS:Windows10 >


 変換前と変換後の例をいくつか挙げた方が宜しいかと思います。

 Sub sample()
    With CreateObject("VBScript.RegExp")
        .Pattern = "[月水金]"   '削除する文字セット
        .Global = True
        Debug.Print .Replace("日月火水木金土", "")
    End With
 End Sub
(炬燵) 2022/01/15(土) 11:59

>その都度書き出す列を右側に指定していけば

同じ列でもいいと思いますが?

(わからん) 2022/01/15(土) 12:03


 複数あるなら、配列に入れて、ループさせて順次置き換えればいいんじゃないですか。

 しかし、仕様がちょっと不明瞭な印象を受けます。
 「(」だけ特別な処理にするんですか?

(半平太) 2022/01/15(土) 12:10


皆さん回答ありがとうございます。

炬燵さんの回答は、今の私のスキルでは難しくて手を付けられません。

半平太さんの
>複数あるなら、配列に入れて、ループさせて順次置き換えればいいんじゃないですか。

配列に入れると言うので以下のように考えましたが
一応処理はエラー無く処理できていますが
アドバイスあればお願いします。
(初心者なので分かりやすさを第一に考えたので無駄が多いと思います。)

Option Explicit

Sub test()
Dim i As Long
Dim n As Long
Dim sum As Long
Dim Replace_moji(10) As String

For i = 1 To 10
Replace_moji(i) = InputBox("No : " & i & Chr(13) & _

                Chr(13) & _
                "削除文字を指定してください。" & Chr(13) & _
                "既定値は、最初の「(」のみを削除するようにしています。" & Chr(13) & _
                Chr(13) & _
                "「(」を指定の場合、2回めの「(」は削除対象外です。", "Replace", "(")

sum = i

'「キャンセル」がクリックされた場合
If Replace_moji(i) = "" Then

    MsgBox "「キャンセル」が選択されました。" & Chr(13) & _
            sum - 1 & "文字を削除します。"
    GoTo Loop_End
End If

Next

Loop_End:

'配列チェック
'For i = 1 To sum - 1
' MsgBox "No:" & i & Chr(13) & _
' Replace_moji(i)
'Next

'削除文字を削除して書き出し
For n = 1 To Cells(Rows.Count, "A").End(xlUp).Row

    For i = 1 To sum - 1
        If i = 1 Then
            Cells(n, "B") = Replace(Cells(n, "A"), Replace_moji(i), "", 1, 1, 1)
        Else
            Cells(n, "B") = Replace(Cells(n, "B"), Replace_moji(i), "", 1, 1, 1)
        End If
    Next
Next

End Sub

(Inoue) 2022/01/15(土) 14:17


 旨く行っているならそれでいい気もしますけど。

 こちらは仕様が明確じゃないので具体的な検討はできません。
 指定文字全てで「最初に出てくるものだけ」消すんですか?

 ユーザーへのガイド文からは、記号の"("だけと読めるんですが、

 例えば、他に「a」も指定したとして、複数のaを含んでいる文字列に対して
 1つ目の「a」だけ消去なのですか?

(半平太) 2022/01/15(土) 15:06


>指定文字全てで「最初に出てくるものだけ」消すんですか?

  そうです。

>記号の"("だけと読めるんですが、

  "("は、気にしないでください。
  単なる既定値と思ってください。

>1つ目の「a」だけ消去なのですか?

  いろはやアルファベット及び数字が候補に上がることはないです。

(Inoue) 2022/01/15(土) 15:52


 好みの問題ですが、私は複数の指定ワードをカンマ区切りで入れて貰って、
 Split関数で配列に入れる方式にします。

 Sub test()
     Dim i As Long
     Dim n As Long
     Dim Buf As Variant
     Dim Replace_moji As Variant

     Replace_moji = InputBox("置換する文字列をカンマ区切りで指定してください。" & Chr(13) & _
                             "既定値は、最初の「(」のみを削除するようにしています。" & Chr(13) & Chr(13) & _
                             "「(」を指定の場合、2回めの「(」は削除対象外です。", "Replace", "(")

     '「キャンセル」がクリックされた場合
     If Replace_moji = "" Then
         MsgBox "「キャンセル」が選択されました。" & Chr(13) & _
         "処理を中止します。"
         Exit Sub
     Else
         Replace_moji = Split(Replace_moji & ",", ",") 'カンマを末尾に付けてから分割
     End If

     For n = 1 To Cells(Rows.Count, "A").End(xlUp).Row
         Buf = Cells(n, "A")

         For i = 0 To UBound(Replace_moji) - 1
             Buf = Replace(Buf, Replace_moji(i), "", 1, 1, 1)
         Next i

         Cells(n, "B") = Buf
     Next n
 End Sub

(半平太) 2022/01/15(土) 16:31


半平太さんありがとうございます。

一度に複数の指定文字をセットできるのでこちらの方が使い勝手が良く
大変便利な仕様になりました。

(Inoue) 2022/01/15(土) 17:03


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.