2016-04-25 5 views
1

В файле Microsoft Excel, у меня есть текст в строках, который появляется как это:Удалить текст, появляющийся между двумя символами - несколько экземпляров - 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 так: =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

Если вы заметили, только один экземпляр удаляется. Как заставить его работать для всех экземпляров? Благодарю.

+0

Вы открыты для использования VBA, чтобы написать пользовательскую функцию, чтобы сделать это? В качестве альтернативы, можете ли вы повторить свою функцию столько раз, сколько необходимо на листе, чтобы удалить все строки? –

+0

Есть несколько тысяч строк. Я думаю, что пользовательская функция может быть лучше. Я использовал функцию @ dirk-reichel, и она отлично работает. –

ответ

1

это не так просто, без VBA, но есть стил Я в порядке.

Либо (как это было предложено yu_ominae) просто использовать формулу, как это и автоматическое заполнение его:

=IFERROR(SUBSTITUTE(A2,MID(LEFT(A2,FIND("}",A2)),FIND("{",A2),LEN(A2)),""),A2) 

Другим способом итерационных вычисления (перейти к опции -> формула -> проверить «включить итеративными кнопка вычисления»)
Чтобы сделать это сейчас в одной ячейке, необходимо 1 хелперов-элементная (для моего примера мы будем использовать C1) и использовать формулу, как это в В2 и автоматического заполнения вниз:

=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-key (вы увидите, что «{}» - части исчезают), пока все не похоже, что вы этого хотите.

EDIT: Для того, чтобы сделать это с помощью 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) 

Если вы все еще есть какие-либо вопросы, просто спросите;)

0

Попробуйте пользовательскую функцию. В VBA создать ссылку на «Microsoft VBScript Regular Expressions 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"

0

Выделить все Перейти на замену Ввести {*} в тексте заменить оставить заменить пустой

Это должно заменить все цветочные скобки и ничего между ними