Сцепитьесли в excel примеры

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):

Загрузка в Power Query

В открывшемся окне редактора запросов выделяем щелчком по заголовку столбец Компания и сверху жмем кнопку Группировать (Group By). Вводим имя нового столбца и тип операции в группировке — Все строки (All Rows):

Группировка в Power Query

Жмем ОК и получаем для каждой компании мини-таблицу сгруппированных значений. Содержимое таблиц хорошо видно, если щелкать левой кнопкой мыши в белый фон ячеек (не в текст!) в получившемся столбце:

Содержимое таблиц группировки

Теперь добавим еще один столбец, где с помощью функции склеим через запятую содержимое столбцов Адрес в каждой из мини-таблиц. Для этого на вкладке Добавить столбец жмем Пользовательский столбец (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) «СцепитьЕсли»

Alex_ST

Дата: Четверг, 26.08.2010, 11:29 |
Сообщение № 1

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

=======================================================
Функция (UDF) «СцепитьЕсли»
=======================================================
Данная Определенная пользователем функция (User-Defined Function или UDF) возвращает в ячейку листа, куда она введена, «склеенные» в одну строку тексты из ячеек заданного диапазона при выполнении заданного условия с задаваемыми при необходимости разделителями данных из разных ячеек.
[vba]

Код

Function СцепитьЕсли(ByRef Диапазон As Range, _
                    ByVal Критерий As String, _
                    ByRef Диапазон_сцепления As Range, _
                    Optional Разделитель As String = » «) As String
            ‘—————————————————————————————
            ‘ Procedure    : СцепитьЕсли
            ‘ Author       : The_Prist & Alex_ST
            ‘ Topic_HEADER : «Помогите создать СЦЕПИТЬЕСЛИ() — аналог СУММЕСЛИ()»
            ‘ Topic_URL    : http://www.planetaexcel.ru/forum.php?thread_id=14935
            ‘ Post_Author  : The_Prist
            ‘ Post_URL     : http://www.planetaexcel.ru/docs/forum_upload/post_113923.xls
            ‘ DateTime     : 02.04.2010 22:24
            ‘ Purpose      : СЦЕПИТЬЕСЛИ() — аналог СУММЕСЛИ()
            ‘ Notes        : По умолчанию разделитель слов — пробел, но можно задать любой другой символ/символы.
            ‘              Диапазон — диапазон с критериями(указывается один столбец)
            ‘              Критерий — критерий. Просматривается Диапазон.
            ‘              Диапазон_сцепления — из этого диапазона берется значение для сцепления,
            ‘              если значение в аргументе Диапазон совпадает с аргументом Критерий (указывается один столбец).
            ‘—————————————————————————————
            Dim rCell As Range, rFndrng As Range, sStr As String
            Set Диапазон = Intersect(Диапазон, ActiveSheet.UsedRange)
            Set Диапазон_сцепления = Intersect(Диапазон_сцепления, ActiveSheet.UsedRange)
            For Each rCell In Диапазон
               If rCell.Value Like Критерий Then
                  If Trim(Диапазон_сцепления.Cells(rCell.Row — Диапазон.Row + 1, 1)) <> «» Then _
                     sStr = sStr & IIf(sStr <> «», Разделитель, «») & Диапазон_сцепления.Cells(rCell.Row — Диапазон.Row + 1, 1)
               End If
            Next rCell
            СцепитьЕсли = sStr
End Function

[/vba]



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STЧетверг, 26.08.2010, 13:52

 

Ответить

Serge_007

Дата: Пятница, 10.09.2010, 14:34 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Аналогичная функция:

[vba]

Код

‘—————————————————————————————
‘ Procedure : СцепитьЕсли
‘ Author    : The_Prist(Дмитрий); http://www.excel-vba.ru
‘ Purpose   : Функция сцепляет данные из диапазона, указанного критерием Диапазон_сцепления
‘             в том случае, если ячейка из критерия Диапазон входит в условие
‘             указанное Критерием. В качекстве Критерия может быть ссылка на ячейку,
‘             либо текст/число, либо операторы сравнения
‘             (как все привыкли в СУММЕСЛИ, СЧЁТЕСЛИ и т.д. — «<>»»»,»>8″ и пр.).
‘—————————————————————————————
Function СцепитьЕсли(ByRef Диапазон As Range, ByVal Критерий As String, ByRef Диапазон_сцепления As Range, Optional Разделитель As String = » «) As String
       Dim li As Long, sStr As String, avItem, avDateArr(), avRezArr(), lUBnd As Long
       If Диапазон.Count > 1 Then
           avDateArr = Intersect(Диапазон, Application.Caller.Parent.UsedRange).Value
           avRezArr = Intersect(Диапазон_сцепления, Application.Caller.Parent.UsedRange).Value
           If Диапазон.Rows.Count = 1 Then
               avDateArr = Application.Transpose(avDateArr)
               avRezArr = Application.Transpose(avRezArr)
           End If
       Else
           avDateArr(1, 1) = Диапазон.Value
           avRezArr(1, 1) = Диапазон_сцепления.Value
       End If
       lUBnd = UBound(avDateArr, 1)
       ‘Опрееделяем вхождение операторов сравнения в Критерий
       Dim objRegExp As Object, objMatches As Object
       Set objRegExp = CreateObject(«VBScript.RegExp»)
       objRegExp.Global = False: objRegExp.Pattern = «=|<>|=>|>=|<=|=<|>|<»
       Set objMatches = objRegExp.Execute(Критерий)
       ‘Если есть вхождения
       If objMatches.Count > 0 Then
           Dim sStrMatch As String
           sStrMatch = objMatches.Item(0)
           Критерий = Replace(Replace(Критерий, sStrMatch, «», 1, 1), Chr(34), «», 1, 2)
           Select Case sStrMatch
           Case «=»
               For li = 1 To lUBnd
                   If avDateArr(li, 1) = Критерий Then
                       If Trim(avRezArr(li, 1)) <> «» Then _
                          sStr = sStr & IIf(sStr <> «», Разделитель, «») & avRezArr(li, 1)
                   End If
               Next li
           Case «<>»
               For li = 1 To lUBnd
                   If avDateArr(li, 1) <> Критерий Then
                       If Trim(avRezArr(li, 1)) <> «» Then _
                          sStr = sStr & IIf(sStr <> «», Разделитель, «») & avRezArr(li, 1)
                   End If
               Next li
           Case «>=», «=>»
               For li = 1 To lUBnd
                   If avDateArr(li, 1) >= Критерий Then
                       If Trim(avRezArr(li, 1)) <> «» Then _
                          sStr = sStr & IIf(sStr <> «», Разделитель, «») & avRezArr(li, 1)
                   End If
               Next li
           Case «<=», «=<»
               For li = 1 To lUBnd
                   If avDateArr(li, 1) <= Критерий Then
                       If Trim(avRezArr(li, 1)) <> «» Then _
                          sStr = sStr & IIf(sStr <> «», Разделитель, «») & avRezArr(li, 1)
                   End If
               Next li
           Case «>»
               For li = 1 To lUBnd
                   If avDateArr(li, 1) > Критерий Then
                       If Trim(avRezArr(li, 1)) <> «» Then _
                          sStr = sStr & IIf(sStr <> «», Разделитель, «») & avRezArr(li, 1)
                   End If
               Next li
           Case «<»
               For li = 1 To lUBnd
                   If avDateArr(li, 1) < Критерий Then
                       If Trim(avRezArr(li, 1)) <> «» Then _
                          sStr = sStr & IIf(sStr <> «», Разделитель, «») & avRezArr(li, 1)
                   End If
               Next li
           End Select
       Else ‘Если нет вхождения
           For li = 1 To lUBnd
               If avDateArr(li, 1) Like Критерий Then
                   If Trim(avRezArr(li, 1)) <> «» Then _
                      sStr = sStr & IIf(sStr <> «», Разделитель, «») & avRezArr(li, 1)
               End If
           Next li
       End If
       СцепитьЕсли = sStr
End Function

[/vba]

Источник


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

The_Prist

Дата: Вторник, 10.05.2011, 08:09 |
Сообщение № 3

Группа: Друзья

Ранг: Участник

Сообщений: 84


Репутация:

22

±

Замечаний:
0% ±


2010

Сергей, привет.
А разьве ссылку на источник не надо указыать? :-) Я вроде делал пометку на сайте. Нехорошо получается…


Errare humanum est, stultum est in errore perseverare

 

Ответить

Serge_007

Дата: Вторник, 10.05.2011, 10:30 |
Сообщение № 4

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Quote (The_Prist)

Сергей, привет.
А разьве ссылку на источник не надо указыать? :-) Я вроде делал пометку на сайте. Нехорошо получается…

Привет Дим.
Посмотри вторую строку:
Мало того что ссылка на источник, так ещё и автор указан smile


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

The_Prist

Дата: Вторник, 10.05.2011, 10:58 |
Сообщение № 5

Группа: Друзья

Ранг: Участник

Сообщений: 84


Репутация:

22

±

Замечаний:
0% ±


2010

Quote (Serge_007)

Мало того что ссылка на источник, так ещё и автор указан

Сергей, то, что в коде указан автор и его сайт не является ссылкой на источник. Ссылка на источник выглядит как ссылка на статью(саму ссылку можешь потом удалить из моего поста — это для демонстрации того, как ссылка выглядит). Я её не вижу :-)
Мое мнение: раз уж листинг кода полностью берётся с какой-либо страницы сайта, то и ссылка должна быть на страницу первоисточника.
Конечно, мое мнение может не совпадать с твоим и спорить не собираюсь. Это лишь высказывание мнения.


Errare humanum est, stultum est in errore perseverare

Сообщение отредактировал The_PristВторник, 10.05.2011, 11:00

 

Ответить

Serge_007

Дата: Вторник, 10.05.2011, 11:41 |
Сообщение № 6

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Quote (The_Prist)

…раз уж листинг кода полностью берётся с какой-либо страницы сайта…

Дим, я не брал код с твоего сайта, поэтому не знаю на какой он там странице, он давно у меня в файлах от тебя был, может ты мне его в личку присылал, может на сайте каком выкладывал, не помню я источник…

Ссылку твою удалять не буду. Более того, добавил её в тот пост с кодом.


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Kirigant

Дата: Среда, 29.02.2012, 18:26 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 34


Репутация:

0

±

Замечаний:
0% ±


Alex_ST, Serge_007, очень интересные функции. Но хотелось бы спросить:
1. Чем отличаются функция представленная Alex_ST, от функции представленной Serge_007;
2. Пожалуйста авторы если не трудно выложите примеры использования данных функций в Excel, а то не получается разобраться.


«Все следует делать настолько простым, насколько это возможно, но не проще.»

 

Ответить

Alex_ST

Дата: Четверг, 01.03.2012, 17:07 |
Сообщение № 8

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Kirigant, а вы статью Дмитрия по ссылке в этом посте Сергея читали?
Там же всё разжёвано…
Просто то, что выкладывал я, отлавливает только точные совпадения, а макрос Дмитрия кроме того ещё и условия типа больше, больше и равно, меньше, меньше и равно.
Кроме того Дмитрий добавил ещё и возможность унификации полученного списка (получения в списке только уникальных значений).



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STЧетверг, 01.03.2012, 17:08

 

Ответить

Kirigant

Дата: Среда, 07.03.2012, 11:19 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 34


Репутация:

0

±

Замечаний:
0% ±


Alex_ST я как-то пропустил ссылку на другой форум. smile Спасибо за напоминание, действительно там все расписано. Разобрался!


«Все следует делать настолько простым, насколько это возможно, но не проще.»

Сообщение отредактировал KirigantСреда, 07.03.2012, 11:20

 

Ответить

Чтобы объединить значения (текстовые, цифровые) из разных ячеек в одну, используется функция СЦЕПИТЬ. Ее аналог – & (амперсанд). Знак справляется с простейшими задачами. Но для объединения множества строк не подходит.

Синтаксис функции СЦЕПИТЬ

Функция входит в группу «текстовые». Синтаксис: (текст 1; текст 2;…). Можно включить до 255 текстовых строк. Первый аргумент – «текст 1» – является обязательным. Любые аргументы можно указать в виде текста, цифр или ссылок на ячейки.

Общие правила использования функции СЦЕПИТЬ:

  1. Для разделения аргументов применяется точка с запятой. Пропуск или использование других знаков приведет к отображению в ячейке с результатом кавычек.
  2. Текстовые аргументы обязательно заключать в кавычки. В противном случае появляется ошибка – #ИМЯ? Числа и ссылки на ячейки – не нужно.
  3. Чтобы соединяемые элементы в строке результата отобразились с пробелом, пробелы нужно добавлять в формулу с функцией. С помощью двойных кавычек с пробелом внутри (“ “) или с помощью пробела после текстового аргумента (“Иванов ”;…).



Как пользоваться функцией СЦЕПИТЬ в Excel

Начнем с простейших примеров.

Данные для объединения:

Данные для объединения.

Ставим курсор в ячейку Е2 и вызываем мастер функций (кнопка fx). В категории «Текстовые» находим функцию СЦЕПИТЬ. Аргументы – ссылки на ячейки А2, В2, С2 и пробелы:

СЦЕПИТЬ.

Результат объединения значений в ячейках:

Результат.

Такой же результат получим с помощью амперсанда:

Результат 1.

Один из аргументов – текст. Формула: =СЦЕПИТЬ(«слесарь»; » «;A2;» «;B2;» «;C2). Результат:

Результат 2.

И с более сложными задачами справится функция СЦЕПИТЬ в Excel. Примеры:

  1. Соединим текст с датой. Данные находятся в отдельных ячейках. Для столбца «Дата» установлен формат «Дата». Если использовать только функцию СЦЕПИТЬ, дата отобразится в числовом формате. Поэтому добавим функцию ТЕКСТ для форматирования чисел. Формула:

    Второй аргумент функции ТЕКСТ – формат представления даты. Результат:

  2. Результат 3.

  3. Соединим сразу много ячеек в строке. Если писать формулу с функцией СЦЕПИТЬ, получится долго и малоэффективно. Используем маленькую хитрость. Вот наша строка со значениями в отдельных ячейках.
    В ячейку Н1 ставим знак «равно». Выделяем диапазон со значениями А1:F1. Вводим амперсанд & и пробел “ “. Жмем F9. В строке формул появится формула массива.
    Ставим курсор в строку формул после знака «равно». Пишем название функции. Фигурные скобки заменяем на круглые и жмем ВВОД. Получаем нужный результат.
  4. Результат 4.

  5. Соединим значения через косую черточку («-», «&» и т.п.). Формула будет выглядеть так: = СЦЕПИТЬ (ссылка на ячейку 1; «/»; ссылка на ячейку 2).
  6. Результат 5.

  7. Соединим несколько значений в столбце. Функция подходит для значений в строках. Описанный выше способ с формулой массива тоже не сработает.

Результат 6.

Преобразуем вертикальный диапазон в горизонтальный с помощью функции ТРАНСП. А затем воспользуемся формулой массива для быстрого соединения значений. В ячейку В1 ставим знак «равно». Пишем ТРАНСП. Указываем диапазон А1:А6. Вводим & и пробел (« »). Жмем F9.

ТРАНСП.

Теперь преобразуем формулу массива, добавив функцию и заменив скобки.

Формула массива.

Обратная функция СЦЕПИТЬ в Excel

Стандартной функции, которая разделяла бы значения одной ячейки, нет. Для выполнения ряда подобных задач можно использовать другие функции:

  • ЛЕВСИМВ (отображает заданную часть символов с начала строки);
  • ПРАВСИМВ (отображает заданную часть символов с конца строки);
  • ПСТР (отображает указанную часть символов, начиная с заданной позиции) и другие.

Примеры:

  1. Извлечем первое слово из строки, применив функцию ЛЕВСИМВ. Аргументы – «текст» (ссылка на строку с искомым значением), «количество знаков» (число символов, которые нужно извлечь).
  2. ЛЕВСИМВ.

  3. Извлечем последнее слово из строки с помощью функции ПРАВСИМВ. Синтаксис похожий (как в предыдущем примере). Только количество знаков считается с конца.
  4. ПРАВСИМВ.

  5. Извлечем из записи в строке фамилию (второе слово) с помощью функции ПСТР. Аргументы – «текст» (ссылка на строку), «начальная позиция» (номер символа, с которого программа начнет считать число знаков); «количество знаков». В примере: Е2 – «текст», с 9 знака функция вернет 8 символов.

ПСТР.

Для выполнения более сложных задач используются более сложные формулы, составляются пользовательские функции.

Понравилась статья? Поделить с друзьями:
  • Схема генеалогического древа семьи пустое для заполнения word скачать бесплатно
  • Сцепить ячейки в excel что это
  • Схема базы данных excel
  • Сцепить ячейки в excel числа
  • Схема visio на основе данных excel