#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 — лучшее решение.