Заменять только последнее вхождение совпадения в строке в VBA

#string #vba #excel #replace

#строка #vba #excel #заменить

Вопрос:

У меня есть строка, подобная этой

«C://Documents/TestUser/WWW/Help/Files/Move_Help.txt »

и должны заменить Move_Help.txt на Move_Job.txt

Я использую приведенный ниже код в VBA EXCEL

 str = "C://Documents/TestUser/WWW/Help/Files/Move_Help.txt"
rlpStr = Replace(str, 'Help', 'Job')
  

Я получаю

 "C://Documents/TestUser/WWW/Job/Files/Move_Job.txt"
  

Ожидаемый

 "C://Documents/TestUser/WWW/Help/Files/Move_Job.txt"
  

Не могли бы вы помочь в этом.

К вашему сведению: я не могу сопоставить Move_Help с Move_Job (Move_ не является константой. Это может быть любая строка)

Комментарии:

1. Соответствует ли подчеркивание? Если это так, вы можете использовать rlpStr = Replace(str, "_Help", "_Job") .

2. Это не так. Это может быть любой символ.

Ответ №1:

Для этого есть однострочное решение:

 rlpStr = StrReverse(Replace(StrReverse(str), StrReverse("Help"),  StrReverse("Job"), , 1))
  

Технически это немного менее эффективно, чем объединение InStr и Replace , но при необходимости его можно использовать внутри другого выражения. Кроме того, мне нравятся однострочные решения, если они понятны.

Ответ №2:

Будет ли метод в приведенном ниже коде соответствовать вашим требованиям?

Начальное значение Str равно:

  C://Documents/TestUser/WWW/Help/Files/Move_Help.txt
  

Конечное значение:

  C://Documents/TestUser/WWW/Help/Files/Move_Job.txt
  

Код использует InStrRev для поиска последнего вхождения ValueCrnt , если таковое имеется, если ValueCrnt присутствует, он заменяет это последнее вхождение на ValueNew .

 Option Explicit
Sub Demo()

  Dim Pos As Long
  Dim Str As String
  Dim ValueCrnt As String
  Dim ValueNew As String

  Str = "C://Documents/TestUser/WWW/Help/Files/Move_Help.txt"

  ValueCrnt = "Help"
  ValueNew = "Job"

  Pos = InStrRev(Str, ValueCrnt)

  If Pos > 0 Then
    Str = Mid(Str, 1, Pos - 1) amp; Replace(Str, ValueCrnt, ValueNew, Pos)
  End If

  Debug.Print Str

End Sub
  

Ответ №3:

Str = «C://Documents/TestUser/WWW/Help/Files/Move_Help.txt «

ValueCrnt = «Справка» ValueNew = «Задание»

Pos = InStrRev(Str, ValueCrnt)

Если Pos> 0, то Str = Mid(Str, 1, Pos — 1) amp; Replace(Str, ValueCrnt, ValueNew, Pos) End Если

Wscript.Echo Str

Комментарии:

1. Вместо того, чтобы публиковать ответы только для кода, пожалуйста, добавьте некоторое объяснение того, что означает код.