MulTEx »
17 Февраль 2014 23170 просмотров
СцепитьЕсли
Данная функция является частью надстройки MulTEx
Объединение текстовых данных в одной ячейке на основе критерия
Функция сцепляет в одну строку(ячейку) только ячейки, которые отвечают какому-либо критерию.
Например, необходимо собрать в одну ячейку через запятую фамилии всех сотрудников одного отдела, даже если все сотрудники идут вразнобой:
И из этой таблицы надо получить что-то вроде такой:
Или есть список проектов и этапы по каждому проекту. Для каждого этапа одна строка и необходимо для каждого проекта записать в одну ячейку через запятую все этапы.
Стандартными функциями такие вещи сделать весьма проблематично, т.к. заранее неизвестно сколько будет этих оценок или этапов. Да даже если известно — не так просто это сделать. Через функцию СЦЕПИТЬ(CONCANTENATE)? Для этого для начала потребуется пощелкать по каждой ячейке со значениями.
Функции СцепитьЕсли поможет сделать это в разы быстрее и проще. По принципу работы функция очень похожа на стандартную СУММЕСЛИ(SUMIF). Только она не суммирует значения диапазона, а сцепляет их через разделитель. Указываете диапазон значений (отделы), критерий (конкретный отдел) и диапазон значений для сцепления (сотрудники). Символ для разделения слов может быть как любым символом так и группой символов(т.е. несколько символов или целые слова и фразы).
Плюс можно добавить к сравнению более чем 50 доп.условий.
Вызов команды через стандартный диалог:
Мастер функций—Категория «MulTEx»— СцепитьЕсли
Вызов с панели MulTEx:
Сумма/Поиск/Функции — Текстовые — СцепитьЕсли
Синтаксис:
=СцепитьЕсли($A$2:$A$38;A1;$B$2:$B$38;», «;1)
=СцепитьЕсли($A$2:$A$38;A1;$B$2:$B$38;», «;ИСТИНА)
=СцепитьЕсли($A$2:$A$38;A1;$B$2:$B$38;»; «;ЛОЖЬ;$C$2:$C$38;»>=1984″)
=СцепитьЕсли($A$2:$A$38;A1;$B$2:$B$38;»; «;1;$C$2:$C$38;»>=»&D$1)
=СцепитьЕсли($A$2:$A$38;A1;$B$2:$B$38;» + «;1;$E$2:$E$38;»*руководитель*»)
Диапазон($A$2:$A$38)
— диапазон с критериями(указывается один столбец).
Критерий(A1) — ссылка на ячейку или непосредственно значение, с которым сравниваем значения в Диапазоне. В критерии допускается указание специальных символов подстановки — * и ?. Т.е. указав в качестве Критерия «*план*» Вы сможете отобрать для сцепления ячейки со значениями, в столбце критериев которых встречается слово «план»(план, данные по плановым показателя и т.п.). Подробнее про подстановочные символы >>
Так же данный аргумент может принимать в качестве критерия символы сравнения(<, >, =, <>, <=, =>):
- «>0» — будут объединены все ячейки в столбце сцепления, значения ячеек критериев для которых больше нуля;
- «>=2» — будут объединены все ячейки в столбце сцепления, значения ячеек критериев для которых больше или равно двум;
- «<0» — будут объединены все ячейки в столбце сцепления, значения ячеек критериев для которых меньше нуля;
- «<=60» — будут объединены все ячейки в столбце сцепления, значения ячеек критериев для которых меньше или равно 60;
- «<>0» — будут объединены все ячейки в столбце сцепления, значения ячеек критериев для которых не равно нулю;
- «<>» — будут объединены все ячейки в столбце сцепления, значения ячеек критериев для которых не пустые;
Вместо нуля может быть любое число или текст. Так же можно добавить ссылку на ячейку со значением: «>=»&A1
Например, если необходимо отобрать и записать через точку-с-запятой и пробел(; ) только тех сотрудников, чей год рождения 1984 и выше(при условии, что год рождения записан в диапазоне $C$2:$C$38), то функцию можно записать так:
=СцепитьЕсли($C$2:$C$38;»>=1984″;$B$2:$B$38;»; «;ИСТИНА)
Диапазон_сцепления($B$2:$B$38) — из этого диапазона берется значение для сцепления, если значение в аргументе Диапазон совпадает с аргументом Критерий. Указывается столбец с данными, равный по количеству строк аргументу Диапазон. Если Диапазон_Сцепления по количеству ячеек будет различаться от аргумента Диапазон, то результат может отличаться от ожидаемого.
Разделитель(-) — Указывается один любой символ или группа символов(просто символы или слова и фразы), который будет вставлен между каждым найденным и отобранным значением.
БезПовторов(ИСТИНА, 1) — Если указать 1 или ИСТИНА, то в итоговой строке будут записаны все значения без повторов. Если указать 0 или ЛОЖЬ, то будут выведены все значения, независимо от того, повторяются они или нет.
ДиапазонКритерий($C$2:$C$38;»>1984″) — необязательный. Дополнительные диапазоны и критерии для отбора. Важно: при указании очень важен порядок следования: сначала обязательно указывается диапазон и только потом критерий, который в этом диапазоне просматривать. Если указать в другом порядке — функция выдаст ошибку. Если указан диапазон — то обязательно указывать и критерий.
Условия использования те же, что и для критериев Диапазон и Критерий. Т.е. допускается использование подстановочных символов и операторов сравнения.
Допускается указывать до 125 связок Диапазон-Критерий(т.е. всего 250 аргументов — до 125 Диапазонов и до 125 относящихся к ним Критериев). Все условия объединены между собой по принципу совпадения И. Если хоть одно условие связки ДиапазонКритерий не выполняется, условия расположенные далее по списку не проверяются, общее условие по строке считается как несоответствующее и данные этой строки не будут сцеплены.
Например, если необходимо отобрать только тех сотрудников, которые работают в плановом отделе и чей год рождения 1984 и выше(при условии, что год рождения записан в диапазоне $B$2:$B$38), то функцию можно записать так:
=СцепитьЕсли($A$2:$A$38;A1;$B$2:$B$38;»; «;ЛОЖЬ;$E$2:$E$38;»>=1984″)
Склеивание текста по условию
Про то, как можно быстро склеивать текст из нескольких ячеек в одну и, наоборот, разбирать длинную текстовую строку на составляющие я уже писал. Теперь же давайте рассмотрим близкую, но чуть более сложную задачу — как склеивать текст из нескольких ячеек при выполнении определенного заданного условия.
Допустим, что у нас имеется база данных по клиентам, где одному названию компании может соответствовать несколько разных email’ов ее сотрудников. Наша задача состоит в том, чтобы собрать все адреса по названиям компаний и сцепить их (через запятую или точку с запятой), чтобы сделать потом, например, почтовую рассылку по клиентам, т.е. получить на выходе что-то похожее на:
Другими словами, нам нужен инструмент, который будет склеивать (сцеплять) текст по условию — аналог функции СУММЕСЛИ (SUMIF), но для текста.
Способ 0. Формулой
Не очень изящный, зато самый простой способ. Можно написать несложную формулу, которая будет проверять отличается ли компания в очередной строке от предыдущей. Если не отличается, то приклеиваем через запятую очередной адрес. Если отличается, то «сбрасываем» накопленное, начиная заново:
Минусы такого подхода очевидны: из всех ячеек полученного дополнительного столбца нам нужны только последние по каждой компании (желтые). Если список большой, то чтобы их быстро отобрать придется добавить еще один столбец, использующий функцию ДЛСТР (LEN), проверяющий длину накопленных строк:
Теперь можно отфильтровать единички и скопировать нужные склейки адресов для дальнейшего использования.
Способ 1. Макрофункция склейки по одному условию
Если исходный список не отсортирован по компаниям, то приведенная выше простая формула не работает, но можно легко выкрутиться с помощью небольшой пользовательской функции на VBA. Откройте редактор Visual Basic нажатием на сочетание клавиш Alt+F11 или с помощью кнопки Visual Basic на вкладке Разработчик (Developer). В открывшемся окне вставьте новый пустой модуль через меню Insert — Module и скопируйте туда текст нашей функции:
Function MergeIf(TextRange As Range, SearchRange As Range, Condition As String) Dim Delimeter As String, i As Long Delimeter = ", " 'символы-разделители (можно заменить на пробел или ; и т.д.) 'если диапазоны проверки и склеивания не равны друг другу - выходим с ошибкой If SearchRange.Count <> TextRange.Count Then MergeIf = CVErr(xlErrRef) Exit Function End If 'проходим по все ячейкам, проверяем условие и собираем текст в переменную OutText For i = 1 To SearchRange.Cells.Count If SearchRange.Cells(i) Like Condition Then OutText = OutText & TextRange.Cells(i) & Delimeter Next i 'выводим результаты без последнего разделителя MergeIf = Left(OutText, Len(OutText) - Len(Delimeter)) End Function
Если теперь вернуться в Microsoft Excel, то в списке функций (кнопка fx в строке формул или вкладка Формулы — Вставить функцию) можно будет найти нашу функцию MergeIf в категории Определенные пользователем (User Defined). Аргументы у функции следующие:
Способ 2. Сцепить текст по неточному условию
Если заменить в 13-й строчке нашего макроса первый знак = на оператор приблизительного совпадения Like, то можно будет осуществлять склейку по неточному совпадению исходных данных с критерием отбора. Например, если название компании может быть записано в разных вариантах, то мы можем одной функцией проверить и собрать их все:
Поддерживаются стандартные спецсимволы подстановки:
- звездочка (*) — обозначает любое количество любых символов (в т.ч. и их отсутствие)
- вопросительный знак (?) — обозначает один любой символ
- решетка (#) — обозначает одну любую цифру (0-9)
По умолчанию оператор Like регистрочувствительный, т.е. понимает, например, «Орион» и «оРиОн» как разные компании. Чтобы не учитывать регистр можно добавить в самое начало модуля в редакторе Visual Basic строчку Option Compare Text, которая переключит Like в режим, когда он невосприимчив к регистру.
Таким образом можно составлять весьма сложные маски для проверки условий, например:
- ?1##??777RUS — выборка по всем автомобильным номерам 777 региона, начинающимся с 1
- ООО* — все компании, название которых начинается на ООО
- ##7## — все товары с пятизначным цифровым кодом, где третья цифра 7
- ????? — все названия из пяти букв и т.д.
Способ 3. Макрофункция склейки текста по двум условиям
В работе может встретиться задача, когда сцеплять текст нужно больше, чем по одному условию. Например представим, что в нашей предыдущей таблице добавился еще один столбец с городом и склеивание нужно проводить не только для заданной компании, но еще и для заданного города. В этом случае нашу функцию придется немного модернизировать, добавив к ней проверку еще одного диапазона:
Function MergeIfs(TextRange As Range, SearchRange1 As Range, Condition1 As String, SearchRange2 As Range, Condition2 As String) Dim Delimeter As String, i As Long Delimeter = ", " 'символы-разделители (можно заменить на пробел или ; и т.д.) 'если диапазоны проверки и склеивания не равны друг другу - выходим с ошибкой If SearchRange1.Count <> TextRange.Count Or SearchRange2.Count <> TextRange.Count Then MergeIfs = CVErr(xlErrRef) Exit Function End If 'проходим по все ячейкам, проверяем все условия и собираем текст в переменную OutText For i = 1 To SearchRange1.Cells.Count If SearchRange1.Cells(i) = Condition1 And SearchRange2.Cells(i) = Condition2 Then OutText = OutText & TextRange.Cells(i) & Delimeter End If Next i 'выводим результаты без последнего разделителя MergeIfs = Left(OutText, Len(OutText) - Len(Delimeter)) End Function
Применяться она будет совершенно аналогично — только аргументов теперь нужно указывать больше:
Способ 4. Группировка и склейка в Power Query
Решить проблему можно и без программирования на VBA, если использовать бесплатную надстройку Power Query. Для Excel 2010-2013 ее можно скачать здесь, а в Excel 2016 она уже встроена по умолчанию. Последовательность действий будет следующей:
Power Query не умеет работать с обычными таблицами, поэтому первым шагом превратим нашу таблицу в «умную». Для этого ее нужно выделить и нажать сочетание Ctrl+T или выбрать на вкладке Главная — Форматировать как таблицу (Home — Format as Table). На появившейся затем вкладке Конструктор (Design) можно задать имя таблицы (я оставил стандартное Таблица1):
Теперь загрузим нашу таблицу в надстройку Power Query. Для этого на вкладке Данные (если у вас Excel 2016) или на вкладке Power Query (если у вас Excel 2010-2013) жмем Из таблицы (Data — From Table):
В открывшемся окне редактора запросов выделяем щелчком по заголовку столбец Компания и сверху жмем кнопку Группировать (Group By). Вводим имя нового столбца и тип операции в группировке — Все строки (All Rows):
Жмем ОК и получаем для каждой компании мини-таблицу сгруппированных значений. Содержимое таблиц хорошо видно, если щелкать левой кнопкой мыши в белый фон ячеек (не в текст!) в получившемся столбце:
Теперь добавим еще один столбец, где с помощью функции склеим через запятую содержимое столбцов Адрес в каждой из мини-таблиц. Для этого на вкладке Добавить столбец жмем Пользовательский столбец (Add column — Custom column) и в появившемся окне вводим имя нового столбца и формулу сцепки на встроенном в Power Query языке М:
Обратите внимание, что все М-функции регистрочувствительные (в отличие от Excel). После нажатия на ОК получаем новый столбец со склееными адресами:
Осталось удалить ненужный уже столбец ТаблАдресов (правой кнопкой мыши по заголовку — Удалить столбец) и выгрузить результаты на лист, нажав на вкладке Главная — Закрыть и загрузить (Home — Close and load):
Важный нюанс: в отличие от предыдущих способов (функций), таблицы из Power Query не обновляются автоматически. Если в будущем произойдут какие-либо изменения в исходных данных, то нужно будет щелкнуть правой кнопкой в любое место таблицы результатов и выбрать команду Обновить (Refresh).
Ссылки по теме
- Как разделить длинную текстовую строку на части
- Несколько способов склеить текст из разных ячеек в одной
- Использование оператора Like для проверки текста по маске
Текстовые функции
ПОЛУЧКОММЕНТ (функция ПОЛУЧКОММЕНТ)
Функция ПОЛУЧКОММЕНТ – выводит текст комментария ячейки
Синтаксис
= ПОЛУЧКОММЕНТ (Ячейка)
Аргумент функции ПОЛУЧКОММЕНТ :
Аргумент | Описание |
Ячейка — обязательный | Ссылка на ячейку с комментарием |
ПОЛУЧТЕКСТ (функция ПОЛУЧТЕКСТ)
Функция ПОЛУЧТЕКСТ – выделяет из выбранной ячейки только текст, игнорируя все остальное
Синтаксис
= ПОЛУЧТЕКСТ (Ячейка)
Аргумент функции ПОЛУЧТЕКСТ :
Аргумент | Описание |
Ячейка — обязательный | Ссылка на ячейку с текстом |
ПОЛУЧЧИСЛО (функция ПОЛУЧЧИСЛО)
Функция ПОЛУЧЧИСЛО – выделяет из выбранной ячейки только числа, игнорируя все остальное
Синтаксис
= ПОЛУЧЧИСЛО (Ячейка)
Аргумент функции ПОЛУЧЧИСЛО :
Аргумент | Описание |
Ячейка — обязательный | Ссылка на ячейку с текстом |
СКЛЕЙТЕКСТ (функция СКЛЕЙТЕКСТ)
Функция СКЛЕЙТЕКСТ – объединяет текст выбранного диапазона, используя символ разделитель
Синтаксис
= СКЛЕЙТЕКСТ (Диапазон_данных; Символ_разделитель)
Аргумент функции СКЛЕЙТЕКСТ :
Аргумент | Описание |
Диапазон — обязательный | Ссылка на диапазон данных |
Символ разделитель — обязательный | Символы для разделения текста при объединения |
СЦЕПИТЬЕСЛИ (функция СЦЕПИТЬЕСЛИ)
Функция СЦЕПИТЬЕСЛИ – объединяет текст выбранного диапазона, по заданному условию, используя символ разделитель
Синтаксис
= СЦЕПИТЬЕСЛИ (Диапазон_критериев; Критерий; Диапазон_сцепления; Разделитель; Без_повторов)
Аргумент функции СЦЕПИТЬЕСЛИ :
Аргумент | Описание |
Диапазон критерий- обязательный | Ссылка на диапазон критериев |
Критерий- обязательный | Условие критерия |
Диапазон данных — обязательный | Ссылка на диапазон данных для сцепления |
Символ разделитель — обязательный | Символы для разделения текста при объединения |
Без повторов — не обязательный | Логическое значение ИСТИНА или ЛОЖЬ, сцеплять только уникальные значения или нет |
ЕЛАТИН (функция ЕЛАТИН)
Функция ЕЛАТИН – определяет есть ли в ячейке символы латиницы, возвращает ИСТИНУ или ЛОЖЬ
Синтаксис
= ЕЛАТИН (Ячейка)
Аргумент функции ЕЛАТИН :
Аргумент | Описание |
Ячейка — обязательный | Ссылка на ячейку с текстом |
ЕЛАТИН (функция ЕЛАТИН)
Функция ПРОПИССУММ – выводит число прописью на русском языке
Синтаксис
= ПРОПИССУММ (Ячейка)
Максимальное число – 999 999 999 999, 999 – “Девятьсот девяносто девять миллиардов девятьсот девяносто девять миллионов девятьсот девяносто девять тысяч девятьсот девяносто девять целых девятьсот девяносто девять тысячных”
Аргумент функции ПРОПИССУММ :
Аргумент | Описание |
Ячейка — обязательный | Ссылка на ячейку с числом |
Параметр — не обязательный | Значение указывающее тип данных: 0 — число, 1 — финансовый, 2 — дробный, 3 — проценты |
Регистр — не обязательный | Изменение регистра текста с заглавной или нет, значение ИСТИНА или ЛОЖЬ |
Параметр — не обязательный | Добавление числа в скобках перед прописью, значение ИСТИНА или ЛОЖЬ |
РАЗБСТРОКУ (функция РАЗБСТРОКУ)
Функция РАЗБСТРОКУ – разделяет текст в строке на отдельные фрагменты по заданному символу – разделителю
Синтаксис
= РАЗБСТРОКУ (Ячейка; Символ_разделитель; Номер_элемента)
Аргумент функции РАЗБСТРОКУ :
Аргумент | Описание |
Ячейка — обязательный | Ссылка на ячейку с текстом |
Параметр — обязательный | Символ разделитель |
Номер элемента — не обязательный | Число, номер элемента по порядку |
ТРАНСЛИТ (функция ТРАНСЛИТ)
Функция ТРАНСЛИТ – преобразует кириллицу в латиницу, транслитом
Синтаксис
= ТРАНСЛИТ (Ячейка_с_текстом)
Аргумент функции ТРАНСЛИТ :
Аргумент | Описание |
Ячейка — обязательный | Ссылка на ячейку с текстом |
Функция (UDF) «СцепитьЕсли» |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Чтобы объединить значения (текстовые, цифровые) из разных ячеек в одну, используется функция СЦЕПИТЬ. Ее аналог – & (амперсанд). Знак справляется с простейшими задачами. Но для объединения множества строк не подходит.
Синтаксис функции СЦЕПИТЬ
Функция входит в группу «текстовые». Синтаксис: (текст 1; текст 2;…). Можно включить до 255 текстовых строк. Первый аргумент – «текст 1» – является обязательным. Любые аргументы можно указать в виде текста, цифр или ссылок на ячейки.
Общие правила использования функции СЦЕПИТЬ:
- Для разделения аргументов применяется точка с запятой. Пропуск или использование других знаков приведет к отображению в ячейке с результатом кавычек.
- Текстовые аргументы обязательно заключать в кавычки. В противном случае появляется ошибка – #ИМЯ? Числа и ссылки на ячейки – не нужно.
- Чтобы соединяемые элементы в строке результата отобразились с пробелом, пробелы нужно добавлять в формулу с функцией. С помощью двойных кавычек с пробелом внутри (“ “) или с помощью пробела после текстового аргумента (“Иванов ”;…).
Как пользоваться функцией СЦЕПИТЬ в Excel
Начнем с простейших примеров.
Данные для объединения:
Ставим курсор в ячейку Е2 и вызываем мастер функций (кнопка fx). В категории «Текстовые» находим функцию СЦЕПИТЬ. Аргументы – ссылки на ячейки А2, В2, С2 и пробелы:
Результат объединения значений в ячейках:
Такой же результат получим с помощью амперсанда:
Один из аргументов – текст. Формула: =СЦЕПИТЬ(«слесарь»; » «;A2;» «;B2;» «;C2). Результат:
И с более сложными задачами справится функция СЦЕПИТЬ в Excel. Примеры:
- Соединим текст с датой. Данные находятся в отдельных ячейках. Для столбца «Дата» установлен формат «Дата». Если использовать только функцию СЦЕПИТЬ, дата отобразится в числовом формате. Поэтому добавим функцию ТЕКСТ для форматирования чисел. Формула:
Второй аргумент функции ТЕКСТ – формат представления даты. Результат:
- Соединим сразу много ячеек в строке. Если писать формулу с функцией СЦЕПИТЬ, получится долго и малоэффективно. Используем маленькую хитрость. Вот наша строка со значениями в отдельных ячейках.
В ячейку Н1 ставим знак «равно». Выделяем диапазон со значениями А1:F1. Вводим амперсанд & и пробел “ “. Жмем F9. В строке формул появится формула массива.
Ставим курсор в строку формул после знака «равно». Пишем название функции. Фигурные скобки заменяем на круглые и жмем ВВОД. Получаем нужный результат. - Соединим значения через косую черточку («-», «&» и т.п.). Формула будет выглядеть так: = СЦЕПИТЬ (ссылка на ячейку 1; «/»; ссылка на ячейку 2).
- Соединим несколько значений в столбце. Функция подходит для значений в строках. Описанный выше способ с формулой массива тоже не сработает.
Преобразуем вертикальный диапазон в горизонтальный с помощью функции ТРАНСП. А затем воспользуемся формулой массива для быстрого соединения значений. В ячейку В1 ставим знак «равно». Пишем ТРАНСП. Указываем диапазон А1:А6. Вводим & и пробел (« »). Жмем F9.
Теперь преобразуем формулу массива, добавив функцию и заменив скобки.
Обратная функция СЦЕПИТЬ в Excel
Стандартной функции, которая разделяла бы значения одной ячейки, нет. Для выполнения ряда подобных задач можно использовать другие функции:
- ЛЕВСИМВ (отображает заданную часть символов с начала строки);
- ПРАВСИМВ (отображает заданную часть символов с конца строки);
- ПСТР (отображает указанную часть символов, начиная с заданной позиции) и другие.
Примеры:
- Извлечем первое слово из строки, применив функцию ЛЕВСИМВ. Аргументы – «текст» (ссылка на строку с искомым значением), «количество знаков» (число символов, которые нужно извлечь).
- Извлечем последнее слово из строки с помощью функции ПРАВСИМВ. Синтаксис похожий (как в предыдущем примере). Только количество знаков считается с конца.
- Извлечем из записи в строке фамилию (второе слово) с помощью функции ПСТР. Аргументы – «текст» (ссылка на строку), «начальная позиция» (номер символа, с которого программа начнет считать число знаков); «количество знаков». В примере: Е2 – «текст», с 9 знака функция вернет 8 символов.
Для выполнения более сложных задач используются более сложные формулы, составляются пользовательские функции.