Коллеги! Прошу Вашей помощи в написании формулы (диапазон ячеек А1:G2-пример во вложении), цель которой проанализировать состав нижестоящего столбика и вывести значения в ячейку по определенному условию.
строка А1-в эти ячейки требуется выводить буквы найденные в столбце (через делитель, если буквы не одинаковые), по порядку (сверху вниз столбика). Уже найденные значения в ячейку не подтягиваются (т.е. повторений букв в ячейке нет) строка А2-в эти ячейки требуется выводить цифры найденные в столбце (через делитель, если цифры не одинаковые), по порядку (сверху вниз столбика). Уже найденные значения в ячейку не подтягиваются (т.е. повторений цифр в ячейке нет)
С уважением!
Коллеги! Прошу Вашей помощи в написании формулы (диапазон ячеек А1:G2-пример во вложении), цель которой проанализировать состав нижестоящего столбика и вывести значения в ячейку по определенному условию.
строка А1-в эти ячейки требуется выводить буквы найденные в столбце (через делитель, если буквы не одинаковые), по порядку (сверху вниз столбика). Уже найденные значения в ячейку не подтягиваются (т.е. повторений букв в ячейке нет) строка А2-в эти ячейки требуется выводить цифры найденные в столбце (через делитель, если цифры не одинаковые), по порядку (сверху вниз столбика). Уже найденные значения в ячейку не подтягиваются (т.е. повторений цифр в ячейке нет)
Для формул эта задача практически не решаема. Если уж быть точным - решение формулами возможно, но очень громоздко, имеет кучу ограничений и "неповоротливо". Здесь нужен макрос.
Для формул эта задача практически не решаема. Если уж быть точным - решение формулами возможно, но очень громоздко, имеет кучу ограничений и "неповоротливо". Здесь нужен макрос.Michael_S
Основная проблема в том, что формула не может вывести в одну ячейку несколько, заранее неизвестных значений из разных ячеек. В файле примере, надеюсь, проблема будет понятна. Сколько значений сцепляем, столько нужно и проверок ЕСЛИ...
Основная проблема в том, что формула не может вывести в одну ячейку несколько, заранее неизвестных значений из разных ячеек. В файле примере, надеюсь, проблема будет понятна. Сколько значений сцепляем, столько нужно и проверок ЕСЛИ...Michael_S
А существует возможность из столбика из всех повторяющихся значений выбрать все значения (разные по сути а,б,с) и допустим раскидать их по стольки ячейкам, сколько разных значений...а далее применить формулу =A2&ЕСЛИ(A3="";"";"/"&A3)&ЕСЛИ(A4="";"";"/"&A4), для уже известных нам ячеек?
А существует возможность из столбика из всех повторяющихся значений выбрать все значения (разные по сути а,б,с) и допустим раскидать их по стольки ячейкам, сколько разных значений...а далее применить формулу =A2&ЕСЛИ(A3="";"";"/"&A3)&ЕСЛИ(A4="";"";"/"&A4), для уже известных нам ячеек?AnatolyZhilichev
По разным ячейкам можно. Их число чем ни будь ограниченно, или как? Поскольку присутствуют данные типа с50 и нужно отдельно "с" и "50", то скорее всего, потребуется доп. столбец, а может и два - сначала разделить текст и числа, потом выбрать уникальные. А уже из уникальных собрать в одну ячейку. Но последняя формула, если число уникальных велико - будет достаточно громоздкая, хоть и не сложная.
По разным ячейкам можно. Их число чем ни будь ограниченно, или как? Поскольку присутствуют данные типа с50 и нужно отдельно "с" и "50", то скорее всего, потребуется доп. столбец, а может и два - сначала разделить текст и числа, потом выбрать уникальные. А уже из уникальных собрать в одну ячейку. Но последняя формула, если число уникальных велико - будет достаточно громоздкая, хоть и не сложная.Michael_S
Function AnatolyZhilichev(r As Range, razd As String, numstr As Boolean) Dim el, t With CreateObject("Scripting.Dictionary"): .comparemode = 1 For Each el In r.Value If Len(Trim(el)) Then t = Analiz(CStr(el), numstr) If Len(t) Then .Item(t) = 0& End If Next AnatolyZhilichev = Join(.keys, razd) End With End Function
Function Analiz(s$, Num As Boolean) 'Предлагаемая функция работает с любым символом разделения (а также, без него), не зависит от количества символов и не имеет никаких циклов. 'Функция имеет 2 аргумента. 1-й - строка или ячейка с исходными данными, 2-й - True для цифр, или False для букв. On Error Resume Next Dim Patt As String, objRegExp: Set objRegExp = CreateObject("VBScript.RegExp") objRegExp.Pattern = IIf(Num, "[\d]{1,100}", "[А-Яа-яЁёA-Za-z ]{1,100}"): objRegExp.Global = True Analiz = objRegExp.Execute(s).Item(0) On Error GoTo 0 End Function
[/vba] На лист в ячейку:
Код
=AnatolyZhilichev(G3:G28,"/",0)
и
Код
=AnatolyZhilichev(G12:G28,"/",1)
В зависимости от анг/рус использовать "," или ";" С названием UDF решил голову не ломать Что такое UDF - User Defined Function, см. в конце http://www.planetaexcel.ru/techniques/3/59/
В модуль:
[vba]
Код
Function AnatolyZhilichev(r As Range, razd As String, numstr As Boolean) Dim el, t With CreateObject("Scripting.Dictionary"): .comparemode = 1 For Each el In r.Value If Len(Trim(el)) Then t = Analiz(CStr(el), numstr) If Len(t) Then .Item(t) = 0& End If Next AnatolyZhilichev = Join(.keys, razd) End With End Function
Function Analiz(s$, Num As Boolean) 'Предлагаемая функция работает с любым символом разделения (а также, без него), не зависит от количества символов и не имеет никаких циклов. 'Функция имеет 2 аргумента. 1-й - строка или ячейка с исходными данными, 2-й - True для цифр, или False для букв. On Error Resume Next Dim Patt As String, objRegExp: Set objRegExp = CreateObject("VBScript.RegExp") objRegExp.Pattern = IIf(Num, "[\d]{1,100}", "[А-Яа-яЁёA-Za-z ]{1,100}"): objRegExp.Global = True Analiz = objRegExp.Execute(s).Item(0) On Error GoTo 0 End Function
Ну Analiz я где-то уже давно стянул - только сейчас добавил пропуск ошибок и поменял тип переменной, что работало как мне тут нужно. Вот зачем там {1,100} - не знаю, нужно изучить. Но раз не мешает -пусть будет
Ну Analiz я где-то уже давно стянул - только сейчас добавил пропуск ошибок и поменял тип переменной, что работало как мне тут нужно. Вот зачем там {1,100} - не знаю, нужно изучить. Но раз не мешает -пусть будет Hugo
Т.е. код может быть в любом другом открытом в фоне файле. Лучший вариант - Personal.xls/m/b или надстройка. Но тогда будет работать только на этой машине, макросы разрешать не обязательно. Если код непосредственно в файле - тогда в ячейку писать без указания файла, работать будет всюду, где разрешены макросы.
Я "склеил" например так:
Код
='1040818H.xls'!AnatolyZhilichev(O$13:O$21,"/",1)
Т.е. код может быть в любом другом открытом в фоне файле. Лучший вариант - Personal.xls/m/b или надстройка. Но тогда будет работать только на этой машине, макросы разрешать не обязательно. Если код непосредственно в файле - тогда в ячейку писать без указания файла, работать будет всюду, где разрешены макросы.Hugo
Hugo, прошу прощение за свою неосведомленность, но с надстройками, и прописанием кода непосредственно в файле я неознакомлен... Прошу Вас помощи....вставил Ваш UDF в Ctrl+F11 ниже макроса, а что далее менять..застрял. F8=AS9=диапазон вывода информации о занных в нижестоящих столбцах
Hugo, прошу прощение за свою неосведомленность, но с надстройками, и прописанием кода непосредственно в файле я неознакомлен... Прошу Вас помощи....вставил Ваш UDF в Ctrl+F11 ниже макроса, а что далее менять..застрял. F8=AS9=диапазон вывода информации о занных в нижестоящих столбцахAnatolyZhilichev
Нужно сперва добавить в проект стандартный модуль, затем этот код перенести в этот модуль. Из модуля книги или листа работать не будет. Ну а далее пишем в ячейку как стандартную формулу, можно её выбирать в мастере в разделе "определённые пользователем". Файл выложить не могу, работа...
Нужно сперва добавить в проект стандартный модуль, затем этот код перенести в этот модуль. Из модуля книги или листа работать не будет. Ну а далее пишем в ячейку как стандартную формулу, можно её выбирать в мастере в разделе "определённые пользователем". Файл выложить не могу, работа...Hugo
Так можно делать почти что угодно Т.е. если формулами сложно или вообще непонятно как сделать - всегда можно неспеша написать нужную простую функцию пользователя.
Так можно делать почти что угодно Т.е. если формулами сложно или вообще непонятно как сделать - всегда можно неспеша написать нужную простую функцию пользователя.Hugo