Удалить текст, появляющийся между двумя символами - несколько экземпляров - Excel
В файле Microsoft Excel у меня есть текст в строках, который выглядит следующим образом:
1. Rc8 {[%emt 0:00:05]} Rxc8 {[%emt 0:00:01]} 2. Rxc8 {[%emt 0:00:01]} Qxc8 {} 3. Qe7# 1-0
Мне нужно удалить любой текст в цветочных скобках {
а также }
, включая сами скобки.
В приведенном выше примере есть три экземпляра таких цветочных скобок. Но некоторые строки могут иметь больше, чем это.
Я старался =MID(LEFT(A2,FIND("}",A2)-1),FIND("{",A2)+1,LEN(A2))
Это приводит к: {[%emt 0:00:05]}
, Как вы видите, это самый первый экземпляр текста между этими цветочными скобками.
И если мы используем это с точностью до ЗАМЕНЫ, как это: =SUBSTITUTE(A2,MID(LEFT(A2,FIND("}",A2)),FIND("{",A2),LEN(A2)),"")
Я получаю вывод, как это:
1. Rc8 Rxc8 {[%emt 0:00:01]} 2. Rxc8 {[%emt 0:00:01]} Qxc8 {} 3. Qe7# 1-0
Если вы заметили, удаляется только один экземпляр. Как мне заставить это работать для всех случаев? Благодарю.
3 ответа
Это не так просто без VBA, но есть еще способ.
Либо (как предлагает yu_ominae) просто используйте формулу, подобную этой, и заполните ее автоматически:
=IFERROR(SUBSTITUTE(A2,MID(LEFT(A2,FIND("}",A2)),FIND("{",A2),LEN(A2)),""),A2)
Другим способом были бы итеративные вычисления (зайдите в настройки -> формулы -> отметьте кнопку "включить итеративные вычисления")
Чтобы сделать это сейчас в одной ячейке, вам нужна 1 вспомогательная ячейка (для моего примера мы будем использовать C1
) и используйте формулу как это в B2 и автозаполнение:
=IF($C$1,A2,IFERROR(SUBSTITUTE(B2,MID(LEFT(B2,FIND("}",B2)),FIND("{",B2),LEN(B2)),""),B2))
Поместите "1" в C1, и все формулы в B:B покажут значения A:A. Теперь перейдите к C1 и нажмите клавишу Del несколько раз (вы увидите "{}"- части исчезают), пока все не будет выглядеть так, как вы этого хотите.
РЕДАКТИРОВАТЬ: Чтобы сделать это через VBA, но без регулярных выражений, вы можете просто поместить это в модуль:
Public Function DELBRC(ByVal str As String) As String
While InStr(str, "{") > 0 And InStr(str, "}") > InStr(str, "{")
str = Left(str, InStr(str, "{") - 1) & Mid(str, InStr(str, "}") + 1)
Wend
DELBRC = Trim(str)
End Function
а затем в рабочем листе непосредственно используйте:
=DELBRC(A2)
Если у вас остались какие-либо вопросы, просто спросите;)
Выделите все. Идите, чтобы заменить, введите {*} в тексте, чтобы заменить, оставьте заменить пустым.
Это должно заменить все цветочные скобки и все, что между ними
Попробуйте пользовательскую функцию. В VBA создайте ссылку на "Регулярные выражения Microsoft VBScript 5.5". Затем добавьте этот код в модуль.
Function RemoveTags(ByVal Value As String) As String
Dim rx As New RegExp
rx.Global = True
rx.Pattern = " ?{.*?}"
RemoveTags = Trim(rx.Replace(Value, ""))
End Function
На листе в ячейку введите: =RemoveTags(A1)
или любой другой адрес, по которому вы хотите удалить текст.
Если вы хотите проверить это в VBA:
Sub test()
Dim a As String
a = "Rc8 {[%emt 0:00:05]} Rxc8 {[%emt 0:00:01]}"
Debug.Print RemoveTags(a)
End Sub
Выходы "Rc8 Rxc8"