Заменить переменную строку в VBA

#vba #string #excel #replace

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

Вопрос:

Мне нужно что-то заменить в строке, но то, что заменять, может отличаться. Это может быть

 XY - test
XXxY-test
XXyyXx-TEST
yXyy     -Test
  

и практически любую другую комбинацию пробелов и регистров из приведенных выше.

Мне нужно заменить часть «-test» и оставить «XXX» в покое. Итак, при использовании простой замены

 Replace("XXX  -test", "- test", "")
  

Очевидно, что это не сработает. Итак, мне нужна более сложная версия Replace, которая могла бы справиться с этой задачей. Есть ли что-нибудь, что я мог бы использовать, или я должен написать это самостоятельно?

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

1. Регулярное выражение ( смотрите это ) может сработать для вас. Я не уверен, как будет выглядеть ваша строка шаблона, но есть много сайтов для их написания.

Ответ №1:

Если вам нужна большая гибкость, чем та, которая обеспечивается методом mj82 (например, вы можете не знать длину исходного выражения), вы можете использовать регулярное выражение. Например:

 Regex.Replace("XXX  -test", "s*-s*test", "", RegexOptions.IgnoreCase)
  

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

1. Я пытаюсь использовать вашу функцию и получаю сообщение об ошибке «объект не существует». Когда я добавляю наблюдение за «регулярным выражением», оно говорит, что объект пуст. Есть идеи, почему это происходит? Нужно ли мне загружать библиотеку? Я в Excel 2010

2. Вам нужно добавить Microsoft VBScript Regular Expressions к вашим ссылкам (текущая версия, я думаю, 5.5), затем объявить переменную, используя: Dim Regex as New Regexp .

Ответ №2:

Это дополняет ответ eggyal. Это функция VBA regexreplace, так что вы можете использовать его ответ. Вы заметите, что я добавил ignore_case в качестве опции для гибкости, поэтому ваш вызов будет:

 =RegexReplace(cell, "s*-s*test", "", TRUE)
  

Вот функция, я надеюсь, вы найдете ее полезной:

 ' -------------------------------------------------------------------
' Search and Replace using a regular expression
' -------------------------------------------------------------------

Function RegexReplace(ByVal text As String, _
                      ByVal replace_what As String, _
                      ByVal replace_with As String, _
                      Optional ByVal ignore_case As Boolean = False) As String

Dim RE As Object
Set RE = CreateObject("vbscript.regexp")

RE.ignorecase = ignore_case
RE.pattern = replace_what
RE.Global = True
RegexReplace = RE.Replace(text, replace_with)

End Function
  

Ответ №3:

Если первым стоит значение XXX, вы можете использовать функцию Left(строка; 3), чтобы вырезать 3 буквы (или любой необходимой вам длины) с левой стороны, тогда вам все равно, что за ней.

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

1. Хорошо, я забыл уточнить это в вопросе. XXX также является переменной любого символа (возможно, даже включающей «test» и тому подобное)

2. Если вы можете вырезать до знака «-» (а этого не может быть в выражении XXX), то это может помочь: Left(mystr, InStr(mystr, «-«) — 1), это сокращает все буквы до первого появления «-«. В противном случае — Regex — лучшее решение.