Удалить текст, появляющийся между двумя символами - несколько экземпляров - 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"

Другие вопросы по тегам