• ベストアンサー

セル内の一部文字列を消去のマクロ

Excelで A1セル~A100セルまでに文字列が  ****(**) (****)というように入っています。 なお*は任意の文字を表す (条件) ( )で囲まれた文字列群は2つある。 (したいこと)A1セル~A100セルまでを対象に2番目の( )で囲まれた文字列群を消去するマクロを作成したい。      どう記述すればいいか。        処理前 A1: ****(**) (****) A2:*****(**) (****) A3:****(**) (*****) 以下略 処理後 A1: ****(**)  A2:*****(**)  A3:****(**)  以下略

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

#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

taktta
質問者

お礼

ごていねいにありがとうございます。

taktta
質問者

補足

私の設定ミスでどちらも半角でいいです。 なお、自分の目的のためにはNO3の方の後ろの式で十分まにあいました。 なおマクロはマクロ自身の勉強のためです。

その他の回答 (6)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.7

#03です =LEFT(A9,FIND("@",SUBSTITUTE(A9,"(","@",2))-1) SUBSTITUTE(A9,"(","@",2) で二番目の「(」を一旦「@」に置き換えて、FIND関数で「@」が何文字目にあるかを求めています。左から(その文字数-1)文字分をLEFT関数で切り出したのが上記式です。 >右括弧の数と左括弧の数があいません。 合っていると思いますよ。SUBSTITUTE関数で置き換える文字"("の括弧も数えていませんか? この"("は数には入れません。

taktta
質問者

お礼

うまくいきました。ご回答どうもありがとうございました。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.6

左から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

taktta
質問者

お礼

うまくいきました。ご回答どうもありがとうございました。

taktta
質問者

補足

左から2つ目の "(" を含め それより右側を消去する という条件でいいです。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.5

一例ですが... 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

taktta
質問者

お礼

うまくいきました。ご回答どうもありがとうございました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

補足質問です 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)) のような関数でもできると思いますが… もしマクロを書くとしても上記式のロジックそのままになると思います

taktta
質問者

お礼

二つめの括弧の後ろに文字列がくることはありますか? →ありません。 二つめの括弧がない場合がありますか。 →ありませんが、その場合は何もしないでいてほしいです。 ご回答ありがとう、検証しています。まずはお礼まで。

taktta
質問者

補足

 =LEFT(A9,FIND("@",SUBSTITUTE(A9,"(","@",2))-1) 右括弧の数と左括弧の数があいません。 @はどういう意味でしょうか。 以上宜しくお願いします。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

関数でも可能。 =LEFT(A1,SEARCH(")",A1))

taktta
質問者

お礼

これもうまくいきました。 そうか、最初に見つかった左)までのデータをとりだせばいいのですからこうなるのですね。 シンプルでありがとうございます。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

一例 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

taktta
質問者

お礼

うまくいきました。ご回答どうもありがとうございました。

関連するQ&A