[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『削除候補を複数個指定して文字列から削除する方法』(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.