- ベストアンサー
セル内の一部文字列を消去のマクロ
Excelで A1セル~A100セルまでに文字列が ****(**) (****)というように入っています。 なお*は任意の文字を表す (条件) ( )で囲まれた文字列群は2つある。 (したいこと)A1セル~A100セルまでを対象に2番目の( )で囲まれた文字列群を消去するマクロを作成したい。 どう記述すればいいか。 処理前 A1: ****(**) (****) A2:*****(**) (****) A3:****(**) (*****) 以下略 処理後 A1: ****(**) A2:*****(**) A3:****(**) 以下略
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 先ほどの回答は、提示された例の通り、最初の()が全角、後ろの()が半角として記述しましたが、ひょっとして全角半角が混在する場合もあるのかと考えなおし、修正します。 以下のコードは全角半角を問いません。 Sub test01() Dim i As Integer, x As Integer, m As String For i = 1 To 100 m = StrConv(Cells(i, 1).Value, vbNarrow) x = InStr(m, ")") If x > 0 Then Cells(i, 1).Value = Left(Cells(i, 1).Value, x) End If Next End Sub
その他の回答 (6)
- zap35
- ベストアンサー率44% (1383/3079)
#03です =LEFT(A9,FIND("@",SUBSTITUTE(A9,"(","@",2))-1) SUBSTITUTE(A9,"(","@",2) で二番目の「(」を一旦「@」に置き換えて、FIND関数で「@」が何文字目にあるかを求めています。左から(その文字数-1)文字分をLEFT関数で切り出したのが上記式です。 >右括弧の数と左括弧の数があいません。 合っていると思いますよ。SUBSTITUTE関数で置き換える文字"("の括弧も数えていませんか? この"("は数には入れません。
お礼
うまくいきました。ご回答どうもありがとうございました。
- ja7awu
- ベストアンサー率62% (292/464)
左から2つ目の "(" を含め それより右側を消去する という条件で宜しければ、 こんな感じで如何でしょうか。 (Excel97も 対応) Sub test() Dim Pt As Integer Dim Rng As Range For Each Rng In Range("A1:A100") Pt = InStr(InStr(Rng.Value, "(") + 1, Rng.Value, "(") If Pt > 0 Then Rng.Value = Left(Rng.Value, Pt - 1) Next End Sub
お礼
うまくいきました。ご回答どうもありがとうございました。
補足
左から2つ目の "(" を含め それより右側を消去する という条件でいいです。
- mshr1962
- ベストアンサー率39% (7417/18945)
一例ですが... SUB MACRO1() For Each RG In Range("A1:A100") If LEN(RG) = 0 Then Goto RGEND RX = Strreverse(RG) '文字反転 RY = Instr(1,RX,"(") '開始の"("を検索 RZ = Mid(RX,RY+1,LEN(RX)-RY) '"("以前を除去 RANGE(RG.Address) = Strrevaerce(RZ) '再度反転してセット RGEND: Next RG End Sub
お礼
うまくいきました。ご回答どうもありがとうございました。
- zap35
- ベストアンサー率44% (1383/3079)
補足質問です aaaaa(bb)(cccc)dd のように二つめの括弧の後ろに文字列がくることはありますか? またaaaaa(bb) のように二つめの括弧がない場合がありますか。 またマクロがよいのですか aaaaa(bb)(cccc) を aaaaa(bb)にするだけなら =LEFT(A9,FIND("@",SUBSTITUTE(A9,"(","@",2))-1) 二つめの括弧がない場合を考慮すると =IF(ISERROR(FIND("@",SUBSTITUTE(A9,"(","@",2))),A9,LEFT(A9,FIND("@",SUBSTITUTE(A9,"(","@",2))-1)) のような関数でもできると思いますが… もしマクロを書くとしても上記式のロジックそのままになると思います
お礼
二つめの括弧の後ろに文字列がくることはありますか? →ありません。 二つめの括弧がない場合がありますか。 →ありませんが、その場合は何もしないでいてほしいです。 ご回答ありがとう、検証しています。まずはお礼まで。
補足
=LEFT(A9,FIND("@",SUBSTITUTE(A9,"(","@",2))-1) 右括弧の数と左括弧の数があいません。 @はどういう意味でしょうか。 以上宜しくお願いします。
- hana-hana3
- ベストアンサー率31% (4940/15541)
関数でも可能。 =LEFT(A1,SEARCH(")",A1))
お礼
これもうまくいきました。 そうか、最初に見つかった左)までのデータをとりだせばいいのですからこうなるのですね。 シンプルでありがとうございます。
- merlionXX
- ベストアンサー率48% (1930/4007)
一例 Sub test01() Dim i As Integer, x As Integer For i = 1 To 100 x = InStr(Cells(i, 1).Value, "(") If x > 0 Then Cells(i, 1).Value = Left(Cells(i, 1).Value, x - 1) End If Next End Sub
お礼
うまくいきました。ご回答どうもありがとうございました。
お礼
ごていねいにありがとうございます。
補足
私の設定ミスでどちらも半角でいいです。 なお、自分の目的のためにはNO3の方の後ろの式で十分まにあいました。 なおマクロはマクロ自身の勉強のためです。