• ベストアンサー

置換のVBA

エクセルのあるシート内の「abc」という文字列を「abc20」に置換するには以下で可能ですが、 Sub chikan() Cells.Replace What:="abc", Replacement:="abc" & "20", _ LookAt:=xlPart,SearchOrder:=xlByRows, MatchCase:=False End Sub 「abc」という文字列を連番で「abc20」「abc21」「abc22」・・・・・というふうに置換するにはどうすればいいでしょうか?

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

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

こんな感じで作ってみました。こんなもので如何でしようか。 「部分一致」と「完全一致」の両方準備しましたので、切り替えてください。 Sub chikan() Dim Rng As Range Dim Fst As String Dim N As Integer Set Rng = Cells.Find("abc") If Not Rng Is Nothing Then   Fst = Rng.Address   N = 20   Do '---------------------------------------------------------部分一致     Rng.Value = Replace(Rng.Value, "abc", "abc" & N)     N = N + 1 '---------------------------------------------------------完全一致 '    If Rng.Value = "abc" Then '      Rng.Value = "abc" & N '      N = N + 1 '    End If '---------------------------------------------------------     Set Rng = Cells.FindNext(Rng)   Loop Until Rng Is Nothing Or Rng.Address = Fst End If Set Rng = Nothing End Sub

yusari
質問者

お礼

ありがとうございました。 部分一致の方を求めていました! (A1が一番最後に処理されますが、それほど大きな問題ではないです)

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

Sub test01() Dim a As Range Cells.Find(What:="abc", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _ .Activate p01: p = InStr(ActiveCell, "abc") l = Len(ActiveCell) ActiveCell = Mid(ActiveCell, 1, p + 2) & Trim(Str(20 + i)) _ & Mid(ActiveCell, p + 3, l - (p + 2)) Set a = Cells.FindNext(After:=ActiveCell) ' MsgBox a.Address If a.Address < m Then Exit Sub i = i + 1 m = a.Address a.Activate GoTo p01 End Sub

yusari
質問者

お礼

ありがとうございました。

  • HELL_MET
  • ベストアンサー率47% (16/34)
回答No.1

下記URLで私がお答えしているものをちょっと改造したものです。 やはり件数が多いと処理が重くなります。 もう少し効率のいいやり方があると思いますが、とりあえず。 OS:Windows95 CPU:MMX200 MEMORY:96MB のマシンで3000件処理をすると20~25秒ほどかかりました。 Sub Macro1() Dim ActCell As Range Dim ActObj As Range Dim ActADR As String Dim cnt As Integer Set ActCell = Selection.SpecialCells(xlCellTypeConstants) Range("A1").Select cnt = 20 For Each ActObj In ActCell On Error GoTo ER ActADR = ActObj.Address Range(ActADR).Activate If Range(ActADR) = "abc" Then Range(ActADR).Value = Range(ActADR).Value & cnt cnt = cnt + 1 End If Next ER: Range("A1").Select End Sub

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=415340
yusari
質問者

お礼

ありがとうございました。 早速実行してみました。 「abc」が単独の場合のみ可能でした。 「 abc」、「cdc abc」、「abcde」等は置換されないみたいです。

関連するQ&A