Примените формулу (обработку) к диапазону, прежде чем переходить к другой формуле - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь применить формулу TEXTJOIN в одной из ячеек.Но проблема возникла, когда мне нужно было предварительно обработать каждую ячейку в диапазоне.Например, данные выглядят так, как показано ниже. ╔══════╦══════════════╦═════════╦═════════╦═════════╗ ║ Test ║ Rest ║ Extras1 ║ Extras2 ║ Extras3 ║ ╠══════╬══════════════╬═════════╬═════════╬═════════╣ ║ ║ English-test ║ corner ║ ║ ║ ║ ║ Chinese-test ║ corner ║ view ║ ║ ║ ║ Korean-test ║ corner ║ room ║ room_2 ║ ╚══════╩══════════════╩═════════╩═════════╩═════════╝

В столбце «Тест» я пытался объединить текст в «Отдых» после подстановки слова -test для каждого слова в «Дополнительно».Что я ожидаю, так это следующее. ╔═════════════════════════════════════════╦══════════════╦═════════╦═════════╦═════════╗ ║ Test ║ Rest ║ Extras1 ║ Extras2 ║ Extras3 ║ ╠═════════════════════════════════════════╬══════════════╬═════════╬═════════╬═════════╣ ║ English-corner ║ English-test ║ corner ║ ║ ║ ║ Chinese-corner|Chinese-view ║ Chinese-test ║ corner ║ view ║ ║ ║ Korean-corner|Korean-room|Korean-room_2 ║ Korean-test ║ corner ║ room ║ room_2 ║ ╚═════════════════════════════════════════╩══════════════╩═════════╩═════════╩═════════╝

Базовая формула, которую я использовал, - TEXTJOIN("|",TRUE,Extras1:Extras3), однако я хочу что-то вроде TEXTJOIN("|",TRUE,SUBSTITUTE(Rest,"-test",Extras1:Extras3)), если это возможно.Замените «-test» в столбце Rest значениями из диапазона, что приведет к диапазону.

Также пробовал VBA, но я не смог найти ничего, что обработало бы Range перед вводом в функцию.Ручной процесс работает, но занимает больше времени.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

раствор с формулой;менее расширяемый, чем UDF:

= ЗАМЕНА (ЗАМЕНА (ЗАМЕНА (ЗАМЕНА, Rest), Extras1 & "|", 1), "test", Extras2 & "|", 1),"test", Extras3 & "|", 1), "|", "", COUNTA (Extras1: Extras3))

0 голосов
/ 23 мая 2018

Возможно, это хорошее решение для пользовательской функции в VBA:

Public Function someTest(firstVal As String, ParamArray otherVal() As Variant) As String

    Dim someVal As Variant
    Dim delim As String:    delim = "|"
    Dim splitVal As String: splitVal = "-"

    For Each someVal In otherVal
        someTest = someTest & Split(firstVal, splitVal)(0) & delim & someVal
    Next someVal

End Function

И вот как вы ее называете:

enter image description here

Функция использует ParamArray(), и она перебирает каждый его элемент, конкатенируя с первой частью первого параметра.Таким образом, из English-test берется только English.


При небольшом изменении можно передать второй аргумент как диапазон.Таким образом, это будет немного проще:

Public Function someTest2(firstVal As String, otherVal As Range) As String

    Dim someVal As Range
    Dim delim As String:    delim = "|"
    Dim splitVal As String: splitVal = "-"

    For Each someVal In otherVal
        someTest2 = someTest2 & Split(firstVal, splitVal)(0) & delim & someVal
    Next someVal

End Function

enter image description here

Здесь второй параметр задан как диапазон.Каждый диапазон имеет хотя бы одну ячейку, поэтому функция проходит по ячейкам.

...