Страницы: 1
RSS
СцепитьЕсли()
 
Добрый день.
Добрые люди, подскажите пожалуйста, данная функция не может работать с вложенными функциями? Может есть какие-то свежие доработки?

=СцепитьЕсли(ДЛСТР(E4:L4);ДЛСТР(A4);E4:L4;";";0)
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
А откуда СцепитьЕсли взялась? Не зная кода функции - никто не скажет, что она может, а что нет.
Если взята с моего сайта - то в таком виде точно работать не будет, т.к. первый аргумент - должен быть диапазон, а не число(ДЛСТР возвращает кол-во символов в ОДНОЙ ячейке).
Иными словами - она работает с вложенными функциями, если их правильно применяют.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
А это не диапазон - ДЛСТР(E4:L4) = {14;11;11;11;11;0;0;0}?
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Сцепить если принимает только диапазон. Не массив значений. Аналогично СЧЁТЕСЛИ. Опять же, если речь идет про мою функцию, а не какую-то другую СцепитьЕсли. Кстати, Вы ничего не писали про то, что пытаетесь ввести формулу, как формулу массива. Потому как данная возможность тоже не закладывалась в функцию.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Нет чтоб сразу пример файла с кодом показать...
 
Цитата
Нет чтоб сразу пример файла с кодом показать...
Пожалуйста, прикрепляю. Она достаточно популярная, думал и так все знают..

Цитата
..а не какую-то другую Сцепить
Конечно про Вашу.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Название-то знакомое - но код ведь может быть любым.
А самое главное - была надежда понять задачу...
 
Цитата
А самое главное - была надежда понять задачу...
Игорь, шутишь  :D  или реально не понял?
Если ДЛСТР(E4:I4)=ДЛСТР(A4); то сцепить эти значения E4:I4 с разделителем ";" без повторов 0)
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
В принципе ковырять надо эту часть кода:
Код
If Диапазон.Count > 1 Then
        avDateArr = Intersect(Диапазон, Диапазон.Parent.UsedRange).Value
        avRezArr = Intersect(Диапазон_сцепления, Диапазон_сцепления.Parent.UsedRange).Value
        If Диапазон.Rows.Count = 1 Then
            avDateArr = Application.Transpose(avDateArr)
            avRezArr = Application.Transpose(avRezArr)
        End If
    Else
        ReDim avDateArr(1, 1):ReDim avRezArr(1, 1)
        avDateArr(1, 1) = Диапазон.Value
        avRezArr(1, 1) = Диапазон_сцепления.Value
    End If

Диапазон заменить на массив. Что-то вроде того.
Код
Function СцепитьЕсли(ByRef Диапазон, ....)
    avDateArr = Диапазон
    If Диапазон_сцепления.Count > 1 Then
        avRezArr = Intersect(Диапазон_сцепления, Диапазон_сцепления.Parent.UsedRange).Value
        If Диапазон_сцепления.Rows.Count = 1 Then
            avRezArr = Application.Transpose(avRezArr)
        End If
    Else
        ReDim avDateArr(1, 1):ReDim avRezArr(1, 1)
        avRezArr(1, 1) = Диапазон_сцепления.Value
    End If
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Я не понял что именно нужно сцепить при этом условии.
Эта UDF не моя, у меня другая есть, которая работает иначе. Но она тоже не помощник - там нужно указывать столбец.
Но ведь можно написать UDF именно под эту задачу.
 
Hugo, как я понял по виду формулы - необходимо сцепить значения на основании длины строки текста.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Это я понял. Я не понял что именно сцеплять.
 
Если длина строки в массиве E4:I4 равна длине строки в А4, то сцепляем E4:I4 без повторов, через ";"
т.е. должно получится для D4 48530-80502; 8530-80501; 48530-80396; 48530-80395
                                 для D5 48530-09660; 48530-09E60
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Конкретно для Вашего случая. Я думаю поймете какую часть заменить надо(с самого начала и до строки lUBnd = UBound(avDateArr, 1)):
Код
Function СцепитьЕсли(ByRef Диапазон, ByVal Критерий As String, ByRef Диапазон_сцепления As Range, Optional Разделитель As String = " ", Optional БезПовторов As Boolean = False) As String
    Dim li As Long, sStr As String, avItem, avDateArr(), avRezArr(), lUBnd As Long, lc As Long
    avDateArr = Диапазон
    ReDim avDateArr(UBound(Диапазон), 1)
    For li = 1 To UBound(Диапазон, 1)
        avDateArr(li, 1) = Диапазон(li)
    Next li
    If Диапазон_сцепления.Count > 1 Then
        avRezArr = Intersect(Диапазон_сцепления, Диапазон_сцепления.Parent.UsedRange).Value
        If Диапазон_сцепления.Rows.Count = 1 Then
            avRezArr = Application.Transpose(avRezArr)
        End If
    Else
        ReDim avDateArr(1, 1): ReDim avRezArr(1, 1)
        avRezArr(1, 1) = Диапазон_сцепления.Value
    End If
    lUBnd = UBound(avDateArr, 1)

Вводить функцию, естественно, как формулу массива.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
..заменил первую часть. Но результат нулевой..
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Как-то странно заменили...Не вижу именно той части, которую я привел в последнем сообщении. А Вы?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Общий вид такой:
Скрытый текст
Изменено: Владимир - 05.10.2014 10:46:42
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
И вот появился очередной вариант СцепитьЕсли(). Которую все знают :)
 
Цитата
Общий вид такой:
Да, такой. Но во вложенном файле НЕ ТАКОЙ. Проверьте сами выложенный Вами файл и выложите файл с нормальным кодом, в котором не получается.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дома и стены, как говорится, помогают  :D , заработало.
Дмитрий, спасибо большое.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
А не проще ли, вместо генерации новой СцепитьЕсли(), "которую все знают", написать UDF под текущую задачу на несколько строчек:
Код
Function JoinIfLenWithoutDuplicates(rng As Range, criterion As String, Optional sep As String = "; ") As String
    Dim x
    With CreateObject("Scripting.Dictionary")
        For Each x In Intersect(rng, rng.Worksheet.UsedRange).Value
            If Len(x) = Len(criterion) Then .Item(x) = 0
        Next x
        JoinIfLenWithoutDuplicates = Join(.keys, sep)
    End With
End Function


можно использовать в виде:
Код
=JoinIfLenWithoutDuplicates(E4:I4;A4)
Изменено: MCH - 28.09.2013 08:53:21
 
Конечно проще :)
"Но ведь можно написать UDF именно под эту задачу."
 
Михаил, спасибо.

Цитата
А не проще ли, .. написать UDF под текущую задачу

Как это часто бывает, сидит изначально в голове мысль - не лучшая, от которой сложно избавиться, в данном случае "Исправить СцепитьЕсли".. :D
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
Страницы: 1
Наверх