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

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, если это возможно.)

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

Joao
источник
Вы можете использовать функции 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.
G-Man
источник
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