- ベストアンサー
VBAでの文字列操作
VBAでsの文字列からtの文字列を削除したssの文字列を生成したいのですが どのようにすれば、いいのでしょうか? s = "AAABBBCCCDDDEEE" t = "BBCC" 'を取り除いて ss = "AAABCDDDEEE" としたいです。tは "AAA"だったり、"ABBB"だったりしても その文字を省いた文字列を生成したいです。 VBAの文字列処理でInStrは使われるのでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 例えば、AAABBBCCCDDDEEE-BBCC なら最初の BBCC だけ取り除いて AAABCDDDEEE-BBCC となれば良いのですか? Replace 関数の名前付引数 count に 1 を指定すれば良いのでは? Replace(expression, find, replace[, start[, count[, compare]]]) こんな感じ。 Dim s1 As String Dim s2 As String s1 = "AAABBBCCCDDDEEE-BBCC" s2 = "BBCC" MsgBox Replace(s1, s2, "", , 1)
その他の回答 (6)
- n-jun
- ベストアンサー率33% (959/2873)
Sub try() Dim RegExp As Object Dim s As String Dim t As String Dim ss As String Set RegExp = CreateObject("VBScript.RegExp") RegExp.Global = False s = "AAABBBCCCDDDEEE" t = "BBCC" 'を取り除いて RegExp.Pattern = t ss = RegExp.Replace(s, "") MsgBox ss Set RegExp = Nothing End Sub ご参考になれば幸いです。
- merlionXX
- ベストアンサー率48% (1930/4007)
失礼、No4の回答に誤りがありました。 定義もしていない変数をつかっていました。 修正です。 Sub test02() s = "AAABBBCCCDDDEEE" t = "BBCC" For i = 1 To Len(s) If i < InStr(s, t) Or i > (InStr(s, t) - 1 + Len(t)) Then ns = ns & Mid(s, i, 1) End If Next MsgBox ns End Sub
- merlionXX
- ベストアンサー率48% (1930/4007)
> 最初の1か所もしくはすべての中の1回だけが条件です。 merlionXXです。 そういう条件の後出しはマナー違反でしょう。 回答者に無駄な労力を使わせます。 で、もっとスマートなやりかたもあるとは思いますが質問文のInStrを使いました。 Sub test02() s = "AAABBBCCCDDDEEE" t = "BBCC" For i = 1 To Len(s) If i < InStr(s, t) Or i > (f - 1 + Len(t)) Then ns = ns & Mid(s, i, 1) End If Next MsgBox ns End Sub
- mt2008
- ベストアンサー率52% (885/1701)
No.1です。 > 同じ文字列が1つ以上あった場合、すべて置換されてしまうので、 > 最初の1か所もしくはすべての中の1回だけが条件です。 それでInStrが云々と言う話なのですね。納得。 それじゃ、こんな感じで Sub Sample() s = "AAABBBCCCDDDEEE" t = "BBCC" 'を取り除いて n = InStr(s, t) ss = s If n > 0 Then ss = Right(s, n - 1) & Left(s, Len(s) - n - Len(t)) End If MsgBox (ss) End Sub
- merlionXX
- ベストアンサー率48% (1930/4007)
Sub test01() s = "AAABBBCCCDDDEEE" t = "BBCC" MsgBox Replace(s, t, "") End Sub では?
補足
言葉足らずでした。 同じ文字列が1つ以上あった場合、すべて置換されてしまうので、 最初の1か所もしくはすべての中の1回だけが条件です。
- mt2008
- ベストアンサー率52% (885/1701)
Replace関数をHELPで調べましょう Sub Sample() s = "AAABBBCCCDDDEEE" t = "BBCC" 'を取り除いて ss = Replace(s, t, "") MsgBox (ss) End Sub
補足
すみません、言い忘れていました。 replaceを使うと1回だけでなく、sに同じ文字列があった場合すべて削除されます。
お礼
この方法も、今後考えます。 ありがとうございました。