Здравствуйте! В моем примере в столбце KO формулами вычисляется количество уникальных значений по строкам A…:KN…. Количество строк в оригинале 1000, значения по строкам A…:KN…. постоянно изменяются. Мой вопрос: существует ли более быстрый способ формулами или макросом произвести эти вычисления? Спасибо!
Здравствуйте! В моем примере в столбце KO формулами вычисляется количество уникальных значений по строкам A…:KN…. Количество строк в оригинале 1000, значения по строкам A…:KN…. постоянно изменяются. Мой вопрос: существует ли более быстрый способ формулами или макросом произвести эти вычисления? Спасибо!djon2012
Спасибо вам большое Pelena и MCH за формулы. Я проверил их на скорость выполнения, результаты оказались таковы: формула от Pelena в 19! раз медленнее формулы из моего примера, формула от MCH (вариант СЧЕТЕСЛИ) в 4 раза медленнее, формула от MCH (вариант ЧАСТОТА) в 2,1 раза быстрее. Да действительно формула с ЧАСТОТА значительно быстрее формулы СЧЕТЕСЛИ. Еще раз СПАСИБО за вашу помощь!!! И шо я бы без вас делал???
Спасибо вам большое Pelena и MCH за формулы. Я проверил их на скорость выполнения, результаты оказались таковы: формула от Pelena в 19! раз медленнее формулы из моего примера, формула от MCH (вариант СЧЕТЕСЛИ) в 4 раза медленнее, формула от MCH (вариант ЧАСТОТА) в 2,1 раза быстрее. Да действительно формула с ЧАСТОТА значительно быстрее формулы СЧЕТЕСЛИ. Еще раз СПАСИБО за вашу помощь!!! И шо я бы без вас делал??? djon2012
Function Уникальные&(Диапазон As Range) Dim Ar(), D As Object, i Set D = CreateObject("Scripting.Dictionary") Ar = Диапазон.Value For Each i In Ar D(i) = 1 Next Уникальные = D.Count End Function
Function Уникальные&(Диапазон As Range) Dim Ar(), D As Object, i Set D = CreateObject("Scripting.Dictionary") Ar = Диапазон.Value For Each i In Ar D(i) = 1 Next Уникальные = D.Count End Function
Michael_S ваш вариант очень удобный, я проверил его на своих данных. Условия проведения расчетов одинаковы для всех тестов приведенных выше постами. Скорость выполнения во всех тестах я сравнивал с формулой из моего примера.Ваш вариант с пользовательской функцией в 4,5 раза медленнее чем вариант формулами из моего примера в 1 посту. Спасибо !!!
Michael_S ваш вариант очень удобный, я проверил его на своих данных. Условия проведения расчетов одинаковы для всех тестов приведенных выше постами. Скорость выполнения во всех тестах я сравнивал с формулой из моего примера.Ваш вариант с пользовательской функцией в 4,5 раза медленнее чем вариант формулами из моего примера в 1 посту. Спасибо !!!djon2012
Если скорость гораздо более важна компактности и красивости, могу предложить модификацию формулы Михаила ( MCH). Всё то же самое, только прежде создать массив констант в именованных диапазонах
Код
=СУММПРОИЗВ(--(ЧАСТОТА(A1:KN1;массив_-1)>0))
Я пробовал, увеличил Ваш файл до 100тыс. строк эта формула работала в 4 раза быстрее Вашей исходной
Если скорость гораздо более важна компактности и красивости, могу предложить модификацию формулы Михаила ( MCH). Всё то же самое, только прежде создать массив констант в именованных диапазонах
Код
=СУММПРОИЗВ(--(ЧАСТОТА(A1:KN1;массив_-1)>0))
Я пробовал, увеличил Ваш файл до 100тыс. строк эта формула работала в 4 раза быстрее Вашей исходнойpabchek
Ваш вариант с пользовательской функцией в 4,5 раза медленнее чем вариант формулами из моего примера в 1 посту.
Да, я тоже проверял. На маленьких массивах UDF проигрывает, на больших - в зависимости от количества уникальных. Вот так должна раза в три быстрее быть [vba]
Код
Function Уникальные&(Диапазон As Range) Dim Ar(), D As Object, i Set D = CreateObject("Scripting.Dictionary") Ar = Диапазон.Value For Each i In Ar If Not D.exists(i) Then D(i) = 1 Next Уникальные = D.Count End Function
Ваш вариант с пользовательской функцией в 4,5 раза медленнее чем вариант формулами из моего примера в 1 посту.
Да, я тоже проверял. На маленьких массивах UDF проигрывает, на больших - в зависимости от количества уникальных. Вот так должна раза в три быстрее быть [vba]
Код
Function Уникальные&(Диапазон As Range) Dim Ar(), D As Object, i Set D = CreateObject("Scripting.Dictionary") Ar = Диапазон.Value For Each i In Ar If Not D.exists(i) Then D(i) = 1 Next Уникальные = D.Count End Function
Здравствуйте! Спасибо за Ваши варианты Michael_S и pabchek, я проверил их на своих данных. Результаты следующие: Ваша пользовательская функция Michael_S в сравнении с изложенной 4 постами выше по скорости осталась почти такой же, если точнее то приблизительно на 5% быстрее, Ваша pabchek по скорости такая же как формула от MCH с функцией ЧАСТОТА. Спасибо!!!
Здравствуйте! Спасибо за Ваши варианты Michael_S и pabchek, я проверил их на своих данных. Результаты следующие: Ваша пользовательская функция Michael_S в сравнении с изложенной 4 постами выше по скорости осталась почти такой же, если точнее то приблизительно на 5% быстрее, Ваша pabchek по скорости такая же как формула от MCH с функцией ЧАСТОТА. Спасибо!!!djon2012