Это можно сделать с помощью одной формулы в Excel 2016 и более поздних версий.
В то время как решение pnuts перечисляет явные символы для удаления, это решение перечисляет явно допустимые символы.
Предположим, что ваши грязные данные находятся в столбце A. Предположим, вы хотите, чтобы ваши чистые данные находились в столбце B.
Используйте самую последнюю формулу ниже, в ячейке B1. Чтобы ввести формулу в ячейку B1, сделайте следующее:
- Нажмите на ячейку B1
- Нажмите на строку формул
- Вставьте формулу
- Нажмите CTRL+Shift+Enter ‹-- важный шаг
Скопируйте ячейку B1 и вставьте ее в столбец B настолько, насколько вам нужно.
Во-первых, вот краткий пример, объясняющий, что происходит:
=TEXTJOIN("",TRUE,
IFs(
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "t", "t",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "e", "e",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "s", "s",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "T", "T",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "E", "E",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "S", "S",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = "2", "2",
MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1) = " ", " ",
true, ""
)
)
В этом случае я указал следующие символы как допустимые: t, e, s, T, E, S, 2 и символ пробела.
Очевидно, вам нужно расширить формулу до полного алфавита, перечислив каждый символ верхнего и нижнего регистра отдельно. Точно так же расширьте его, включив в него числа, если хотите их сохранить. Обратите внимание, что числа закодированы как строки.
Как это работает:
В двух словах, мы разбиваем исходную строку на массив отдельных символов, затем для каждого символа проверяем, входит ли он в наш набор допустимых символов, и включаем его в результат, если он есть, в противном случае заменяем его пустой строкой, если он не является.
Функция 'IFS' обрабатывает свои аргументы попарно за раз. Если первый аргумент оценивается как истина, то возвращается второй аргумент. Если нет, то он переходит к следующей паре аргументов — вот почему вы видите буквы, перечисленные дважды в каждой строке. Последняя пара значений в функции IFS — это набор «истина» и пустая строка. Это говорит о том, что если мы дойдем до конца набора допустимых значений (т.е. и не совпадем с допустимым значением), то вернем пустую строку.
Подробнее о том, почему это работает:
Это вариант решения, представленного в ExcelJet. В этом решении используется функция TEXTJOIN (для объединения значений массива) с функцией INDIRECT (которая разбивает строку на массив) вместе с математическим оператором (символ плюс) для принудительной оценки вычисления между каждым символом в строке с числовым значением. Числовые символы в строке вернут числовые значения, а другие символы вернут ошибку. Это решение использует функцию ISERR для проверки наличия ошибки, чтобы решить, следует ли включать данный символ в окончательный вывод. Там есть похожая статья, чтобы работать наоборот - исключить цифры и сохранить буквы.
Проблема, которую я хотел решить, заключается в том, чтобы кодировщик мог решить, какие значения допустимы, а какие нет. Я попытался объединить функции ВПР и ИНДЕКС с функцией ДВССЫЛ, но они будут работать только с первым символом в строке. Хитрость заключается в том, что не все функции будут воздействовать на на вывод INDIRECT таким образом, чтобы оценить каждый элемент в массиве (т. е. каждый символ в строке). Секрет был в том, что ExcelJet использовал математический оператор. Если вы проверите полную функцию Microsoft , IFS классифицируется как "логическая" функция. Я подозреваю, что логические функции можно использовать с INDIRECT таким образом.
(Примечание: я также пытался использовать И и ИЛИ в различных комбинациях. Однако ДВССЫЛ оценивает все символы в строке. Так, например, используя функцию КОД для получения значения ASCII каждого символа и утверждения все символы должны иметь значения от 65 до 90 (верхний регистр) или 97 - 122 (строчные буквы) будут работать только в том случае, если все символы в строке в верхнем или нижнем регистре, но не в том случае, если есть смесь.)
Я не знаю, как производительность этого решения сравнивается с более ранним предложением с использованием SUBSTITUTE. Если вы хотите удалить только несколько символов, я рекомендую решение SUBSTITUTE. Если вы хотите явно указать допустимые символы для сохранения (это был исходный вопрос), используйте этот.
Наконец, вот точный ответ, который вам нужен, включая преобразование в верхний регистр, которое вы не отметили в вопросе, но отобразили в своем примере. (Для тех, кто не хочет преобразования в верхний регистр, удалите экземпляры «ПРОПИСНЫЕ» из этого примера, затем снова добавьте алфавит в список в нижнем регистре и обязательно оставьте пару «истина»/пустая строка в качестве последней записи. в списке.)
=TEXTJOIN("",TRUE,
IFs(
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "A", "A",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "B", "B",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "C", "C",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "D", "D",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "E", "E",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "F", "F",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "G", "G",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "H", "H",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "I", "I",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "J", "J",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "K", "K",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "L", "L",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "M", "M",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "N", "N",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "O", "O",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "P", "P",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "Q", "Q",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "R", "R",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "S", "S",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "T", "T",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "U", "U",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "V", "V",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "W", "W",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "X", "X",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "Y", "Y",
upper(MID(a1,ROW(INDIRECT(CONCATENATE("1:",LEN(a1)))),1)) = "Z", "Z",
true, ""
)
)
С исходным вопросом «устранить все, кроме альфа-символов» — этот ответ делает трюк в формуле без необходимости в VBA.
person
youcantryreachingme
schedule
15.05.2018