Несколько последовательных замен с использованием параметров в других столбцах


5

На листе Excel:

Столбец А заполнен случайными текстовыми значениями (например, словами / предложениями), которые необходимо обновить.

И столбцы B и C содержат строки, которые определяют изменения, которые необходимо внести в столбец A. Столбец B заполняет каждую ячейку старым текстом, а столбец C - новым текстом, каждая строка соответствует друг другу, то есть текст в B1 необходимо заменить текстом C1, B2 заменить на текст C2. В столбце B одна из вещей, которую нужно заменить, - это ".

В столбце B нет повторяющихся значений. Однако в столбце C клетки могут повторяться. Замены должны соответствовать порядку, в котором они были написаны. И столбец D является результатом.

Каждая ячейка из столбца A должна проходить через эту замену из B1-C1, B2-C2, B3-C3 и т. Д. До конца команд замещения в столбцах BC. Таким образом, перед тем, как дать окончательный результат, текст из столбца A будет меняться несколько раз, и только после всех изменений будет показывать результат в столбце D.


Пример:

Cell A1: Hello!
Cell A2: How are you "John"?
Cell A3: "Nice! thanks"
Cell B1: !                           Cell C1: &
Cell B2: &                           Cell C2: .
Cell B3: "                           Cell C3:    (empty)
Cell B4: ?                           Cell C4: #
Cell B5: Nice. thanks                Cell C5: Fine, THANKS.

Таким образом, ячейка A1, которая Hello!будет изменена на B1-C1, также будет изменена Hello&. Затем изменится B2-C2 с изменениями, внесенными во временный результат, Hello&так и будет Hello.. Затем изменится B3-C3, затем выполнит B4-C4, а затем B5-C5, и ничего не произойдет, потому "что в нем не существует Hello..

После этого результат D1 будет Hello..

Затем он выполнит A2 изменения B1-C1 (ничего не делать), затем применяется для этого будет делать B2-C2 (ничего не делать), затем B3-C3, который How are you John?будет выглядеть как (то есть символы кавычек будут удалены), затем будет делать B4-C4, который будет делать How are you John#, а затем B5-C5, который здесь делать нечего.

Так что результат D2 есть How are you John#.

Точно так же значение A3 "Nice! thanks"будет сначала меняться с B1-C1 "Nice& thanks", затем станет , затем станет B2-C2 "Nice. thanks", затем станет B3-C3 Nice. thanks(опять же, кавычки будут удалены), затем ничего не делать в B4-C4 и затем B5 -C5 сделает его наконец-то Fine, THANKSв D3.


Результаты:

D1: Hello.
D2: How are you John#
D3: Fine, THANKS.

Какова будет формула в столбце D для выполнения этой множественной замены в строке, следуя порядку строк, записанному в столбцах B и C, что позволяет столбцу BC иметь более 300 строк? (Я бы хотел решение на основе формул, а не VBA, если это возможно.)

образец данных сверху с иллюстрацией потока обработки


Вы можете использовать функции VBA или вам нужно решение на основе формул?
— JRI

Привет JRI, хотел бы решение на основе чисто формул, если возможно. Спасибо
— Жуан

Ответы:


2

Вы можете делать то, что вы описываете / иллюстрируете с

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1, B$1, C$1), B$2, C$2), B$3, C$3), B$4, C$4), B$5, C$5)

Если вы поставите выше в ячейку  D1и перетащить / заливку вниз, A1обновит до A2, A3и т.д., но параметры замены строк ( B$1, C$1, B$2, C$2и т.д.) не изменятся. Я полагаю, что очевидно, что при этом выполняется подстановка B1 →  затем выполняется подстановка  →  результата первого замещения, затем выполняется подстановка  →  результата второго замещения и т. Д.C1A1B2C2B3C3

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

  • Установите AA1на

    =SUBSTITUTE(A1, INDEX($B:$B, COLUMN()-COLUMN($Z1)), INDEX($C:$C, COLUMN()-COLUMN($Z1)))
    

    Это эквивалентно тому =SUBSTITUTE(A1, B1, C1), но он получает B1и C1значение динамически, принимая номер столбца ( AA → 27) и вычитая 26 (номер столбца столбца  Z), и используя результат (1) , как номер строки в Bи  Cстолбцах.

  • Drag / заливкой , AA1чтобы AB1, таким образом это становится

    =SUBSTITUTE(B1, INDEX($B:$B, COLUMN()-COLUMN($Z1)), INDEX($C:$C, COLUMN()-COLUMN($Z1)))
    

    и изменения B1в AA1, так что становится

    =SUBSTITUTE(AA1, INDEX($B:$B, COLUMN()-COLUMN($Z1)), INDEX($C:$C, COLUMN()-COLUMN($Z1)))
    

    Это эквивалентно тому =SUBSTITUTE(AA1, B2, C2), что эквивалентно  =SUBSTITUTE(SUBSTITUTE(A1, B1, C1), B2, C2).

  • Перетащите / заполните AB1до LZ1. Это будет результатом A1 всех замен с B1:C1на B312:C312примененные (потому что Lэто 12-я буква, а 12 × 26 - 312).
  • Набор D1для того =LZ1, чтобы отразить результат всех замен.
  • Перетащите / заполните D1и AA1:LZ1опустите, насколько у вас есть данные в столбце  A.

4

Я надеялся на умный способ сделать это, используя формулу с одним массивом, но не смог найти ее (я хотел бы оказаться ошибочным!) Я думаю, что единственный способ сделать это с одной формулой на строку ввода это вкладывать SUBSTITUTEфункции в соответствии с ответом @ G-Man . К сожалению, эта стратегия не будет работать для 300 замен, поскольку в Excel есть ограничение , заключающееся в том, что функции могут вложить только 64 уровня (или 7 до Excel 2007).

Поэтому я думаю, что вам понадобятся вспомогательные столбцы (которые вы всегда можете скрыть, если это поможет с презентацией). Приведенный ниже метод использует более простые формулы, чем G-Man. Он использует несколько вспомогательных ячеек, чем его: один столбец на входную строку × одна строка на замену плюс один:

  • Начиная с листа, выложенного в соответствии с вашим примером, вставьте пустую строку вверху страницы. Выберите ячейки F1:H1, введите формулу =TRANSPOSE(A2:A4)и нажмите Ctrl+ Shift+ Enter, чтобы она вводилась как формула массива. Вы должны увидеть фигурные скобки вокруг формулы, и ячейки должны заполниться вашими входными строками.

  • В ячейку F2введите формулу =SUBSTITUTE(F1,$B2,$C2). Скопируйте эту формулу поперек и вниз, чтобы заполнить все F2:H6. Ваш желаемый результат появится в F6:H6.

  • Чтобы получить выходные данные обратно в столбец D, выберите D2:D4и введите формулу =TRANSPOSE(F6:H6). Как и раньше, Ctrl+ Shift+ , Enterтак что работает как формула массива.

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


Хорошее улучшение.
— G-Man

2

Хотя я знаю, что вам нужно решение на основе формул, я думал, что версия VBA будет полезна для справки, поскольку я не смог найти ее в Интернете:

Function MULTISUB(aString As String, oldVals As Range, newVals As Range) As Variant
    oldW = oldVals.Columns.Count
    oldH = oldVals.Rows.Count

    If (oldW = newVals.Columns.Count) And (oldH = newVals.Rows.Count) And (oldW = 1 Or oldH = 1) Then
        MULTISUB = aString
        For i = 1 To oldVals.Count
            MULTISUB = Replace(MULTISUB, oldVals.Cells(i), newVals.Cells(i))
        Next i
    Else
        MULTISUB = CVErr(xlErrRef)
    End If
End Function

Для вашего примера вы должны ввести =MULTISUB(A1,$B$1:$B$5,$C$1:$C$5)в ячейку D1и скопировать его в D3.

Функция принимает строку и два диапазона. Он ищет в строке значения в каждой ячейке в первом диапазоне и заменяет их значениями соответствующих ячеек во втором диапазоне. Если два диапазона не имеют одинаковую форму и размер, он возвращается #REF.


Спасибо за помощь. Если бы я написал это, я бы наложил ограничение, что одно из измерений xxxValsдиапазонов должно быть 1, отчасти потому, что человеку становится намного труднее интерпретировать / понимать правила, если они не изложены рядом. сторона (в одном или другом измерении). В качестве альтернативы (по крайней мере) вы должны очень четко документировать, что ваша функция обрабатывает сначала строки, а затем столбцы (т. Е. Обычный порядок чтения текста страницы для западных языков, таких как английский). … (Продолжение)
— G-Man

1
(Продолжение)… Это связано с тем, что пользователь, использующий области из двух столбцов и 150 строк, может ожидать противоположного (т. Е. Нормального порядка чтения столбцов / списков : сначала столбец сверху вниз, а затем второй столбец сверху вниз), и порядок имеет значение. Примечание в примере Ор о том , что B5 →  C5( «Nice. Спасибо» → «Хорошо, спасибо») правило подстановки не будет влиять на A3вход ( "Nice! thanks") , если B1 →  C1( «!» → «и») и B2 →  C2( «&» → «.») Правила применяются в первую очередь (в таком порядке).
— G-Man

Хорошая точка зрения. Я отредактировал свой ответ, чтобы проверить, что диапазоны являются одномерными, что также означает, что для перебора всех ячеек необходим только один цикл.
— JRI

Привет, JRI, спасибо за ваш комментарий, выглядит интересно, хотя у меня в Excel на португальском языке, кажется, нет функции MULTISUB. Я попробовал это прямо в Excel, пока у меня нет VBA ...
— Joao

MULTISUBпользовательская функция, не входящая в стандартную библиотеку функций Excel. Чтобы это работало, вам нужно включить меню «Разработчик» в Excel и ввести код из ответа в новом модуле в редакторе Visual Basic. Если вы хотите попробовать, Google для "Учебник Excel UDF".
— JRI
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.