Страницы: 1
RSS
Функция извлечение уникальных элементов из диапазона
 
Имеется замечательная формула:
=ЕСЛИ(СЧЁТЕСЛИ(B$1:B10;B10)=1;МАКС(A$1:A9)+1;"")
взятая отсюда:
https://www.planetaexcel.ru/techniques/14/103/
тренируюсь переделывать формулы в функции, в общем почти получилось. Не пойму как прибавить последнюю единицу.
Код
Function All_in_one(a, b, с)
' =ЕСЛИ(СЧЁТЕСЛИ(B$1:B10;B10)=1;МАКС(A$1:A9)+1;"")
' https://www.planetaexcel.ru/techniques/14/103/
Dim Максимум As Integer
Dim СчетЕсли As String
СчетЕсли = Application.WorksheetFunction.CountIf(a, b)
Максимум = Application.WorksheetFunction.Max(c)
If СчетЕсли = 1 Then
All_in_one = Максимум
ElseIf СчетЕсли <> 1 Then
All_in_one = ""
End If
End Function
Получаются все нули. Если прибавить единицу в эту строчку
Максимум = Application.WorksheetFunction.Max© + 1

, то получаются все единицы. Подскажите что не так. Замучился.
 
dim284, Желательно и ваш файл посмотреть... но!
в UDF это делается немного по другому...
через словарь или коллекцию.
Изменено: Михаил Витальевич С. - 02.11.2020 21:51:52
 
Вот пример. Нужную функцию я себе уже сделал. Но хочется понять что тут не так, на будущее.
 
dim284, а суть какая?  
должен быть какой результат? список уникальных? или единички?
Изменено: Mershik - 02.11.2020 22:01:54
Не бойтесь совершенства. Вам его не достичь.
 
Должно получиться как в результате действия родной формулы. Дополнил, новый файл прикрепил.
 
Но приведённая формула не выводит уникальные ... так в итоге что нужно ? Тема называется так а показываете другое ...
Не бойтесь совершенства. Вам его не достичь.
 
Согласен, погорячился, в следующий раз буду внимательнее. Тему нужно было назвать так:
Функция нумерации всех уникальных представителей списка, присваивающая каждому свой номер.
Так что не хватает в моей функции, чтобы все уникальные представители списка были не нулями, а 1, 2, 3, 4 и т.д.?
 
Цитата
dim284 написал:
тренируюсь переделывать формулы в функции
а с какой целью не подскажете?
Код
Function All_in_one(a, b, c)
    Dim m#, n#
    n = Application.WorksheetFunction.CountIf(a, b)
    If n = 1 Then
        m = Application.WorksheetFunction.Max(c) + 1
        All_in_one = m
    Else
        All_in_one = ""
    End If
End Function

пы.сы. c  и с - это разные вещи
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
dim284 написал:
тренируюсь переделывать формулы в функции,
не надо так тренироваться.
Код
If СчетЕсли = 1 Then
All_in_one = Максимум
ElseIf СчетЕсли <> 1 Then
All_in_one = ""
End If
Масло масляное.  Если проверили  на равенство с 1, то проверять на неравенство уж точно не стоит, если всего 2 варианта.
Цитата
dim284 написал:
что не хватает в моей функции, чтобы все уникальные
Код
All_in_one = Максимум+1


Код
If Application.WorksheetFunction.CountIf(a, b) = 1 Then
All_in_one = Application.WorksheetFunction.Max(c) +1
Else
All_in_one = ""
End If
Изменено: БМВ - 03.11.2020 08:34:05
По вопросам из тем форума, личку не читаю.
 
БМВ спасибо за подсказку, понял что ElseIf  лишнее. Но прибавление единички в строку с Max все равно выдает только все единички, а не 1, 2, 3, 4 и т.д.?
buchlotnik спасибо, нужно просто в формуле переменные обозначить As Double и функция БМВ заработала, как и Ваша.
Цитата
buchlotnik написал:
а с какой целью не подскажете?
Формулы это какая-то головная боль, как их сохранять не понятно. У меня есть длинные формулы каторыми часто пользуюсь. Вспоминать каждый раз их код, как и набирать его, это долго, открывать вордовский файл с избранными формулами тоже не удобно. А если хотя бы несколько формул переделать в функции, то их можно вызывать из надстройки. На этом сайти я подсмотрел как аргументы макросом подписать можно - в общем красота.
Благодаря этому сайту я подсел на экселевскую иглу :)
С "с" и "с " увидел проблему, толи не доглядел, толи пунто-свичер переключил, в общем сенкью. Придумал как бороться - больше не использовать, в двух алфавитах много разных непохожих букв.
 
Цитата
dim284 написал:
Придумал как бороться -
option explicit
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
dim284 написал:
больше не использовать, в двух алфавитах много разных непохожих букв
Variable not defined или что такое Option Explicit и зачем оно нужно?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
dim284,
Цитата
buchlotnik: option explicit
здравый совет — тут подробно

UPD: Дим, привет)) не было твоего сообщения, когда писал (ссылка туда же)  ;)
Изменено: Jack Famous - 03.11.2020 13:06:41
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Точно. Спасибо!
Страницы: 1
Наверх