• ベストアンサー

エクセル 点在する ある文字列の8文字目を置換する方法について

エクセルで表を作っています(A4サイズ) ここには、いくつか不規則に TRC-000400-L という文字列が、点在しています。 この文字列の8桁めの4を8に変えたいとき、どうしたらいいのでしょうか。 ただし、0の部分は、数値がいろいろ入りますので、 頭にTRC-がついている場合に、8桁目の4を8に変えたいのです。 自分で、記録のマクロを加工して Cells.Find(What:="TRXS-*").Activate 'REPLACE(ActiveCell,8,1,5) Cells.Replace What:="TRXS-*", Replacement:=(LeftActiveCell, 8) = 5) などと作ってみましたが、FALSEの値が帰ってきました。 どのようにするといいのでしょうか どうかお知恵をおかしください よろしくお願いいたします

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

  • ベストアンサー
  • FEX2053
  • ベストアンサー率37% (7991/21371)
回答No.1

基本的にはこんな感じで行けるはずです。 Sub CONV_F() Dim DAT As Range Dim CAR As String For Each DAT In Selection CAR = CStr(DAT) If Right(CAR, 4) = "TRC-" Then CAL = Right(CAR, 8) & "8" & Left(CAR, 4) DAT.Value = CAR EndIf Next End Sub これで、選択した範囲のみ処理します。 文字列の変換は"Then"以下に入ります。ここ、やっつけで作ってます ので、適宜作り直してください。あなたの実力なら可能だと思います。 こういうときに使うのが For Each です。

dengennao
質問者

お礼

For Each In、 新しい技を知ることができて勉強になります 利用させていただきます ありがとうございました

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

こんな感じですかね。 Sub 変更() Dim 片, 前, 字$, 正, 集, 素 '★正規表現で"TRC-"+数字×3+"4"+数字×2+"-L" Set 正 = CreateObject("VBScript.RegExp") 正.Global = True 正.Pattern = "TRC-\d{3}4\d{2}-L" '★先頭のセルを検索 Set 片 = Cells.Find(What:="TRC-*", After:=Cells(1, 1)) Do Until 片 Is Nothing   '★検索したセルを記録   Set 前 = 片   字 = 片.Value   '★セルの中から正規表現に一致する集団を取得   Set 集 = 正.Execute(字)   For Each 素 In 集     '★先頭から8番目の字を"8"に代える     Mid(字, 素.FirstIndex + 8, 1) = "8"   Next   片.Value = 字   '★次のセルを検索   Set 片 = Cells.FindNext(After:=前)   '★検索位置が前回より前なら終了する   If 片.Row < 前.Row Then Exit Do   If 片.Row = 前.Row Then     If 片.Column <= 前.Column Then Exit Do   End If Loop End Sub

dengennao
質問者

お礼

すごい… これをきちんと理解できれば、とても面白い! のですが、書き忘れていましたが、ヨチヨチ程度の私には 変数の理解さえも混乱してしまいました…。おはずかしい。 でも、正規表現の部分など興味深く思いましたので この仕事が落ち着いたら、復習させていただきます ありがとうございました

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

細かな条件が不明ですが、こんな感じ? Sub test() Dim c As Range, faddress As String, st As String Const key = "TRC-" Set c = Cells.Find(What:=key, LookIn:=xlValues, LookAt:=xlPart) If Not c Is Nothing Then  faddress = c.Address  Do   st = c.Value   If Left(st, 4) = key And Len(st) > 7 Then    c.Value = Left(st, 7) & "8" & Right(st, Len(st) - 8)   End If   Set c = Cells.FindNext(c)  Loop While c.Address <> faddress End If End Sub

dengennao
質問者

お礼

次回からは、きちんと条件を表現できるよう気をつけます LeftとRightを組合わせて一つの文字列にできるんですね 勉強になります ありがとうございました

関連するQ&A