|
|
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Если поставить автофильтр, то над клеточкой с ним появляется кобобокс в котором ставится условие, но также можно сразу выбирать уникальные значения. Существует ли возможность через VBA узнать эти уникальные значения (диапазон заранее известен), чтобы программно не перебирать заведомо не встречающиеся значения, как это предлагает сам автофильтр? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 17:46 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
или вопрос совсем простой или я не правильно его понял.. если пробежать вниз по колонке и собрать эти значения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 18:21 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
k-nikeСуществует ли возможность через VBA узнать эти уникальные значения (диапазон заранее известен), чтобы программно не перебирать заведомо не встречающиеся значения, как это предлагает сам автофильтр? Если фильтр уже включен то можно использовать SpecialCells(xlCellTypeVisible) Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 18:57 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
vbaproили вопрос совсем простой или я не правильно его понял.. если пробежать вниз по колонке и собрать эти значения? Похоже, вы правильно поняли мой вопрос. Действительно, можно пробежаться по столбцу и собрать значения. И, признаюсь, мне даже в голову это не пришло, потому что я посчитал, что должен быть более рациональный способ. Если включенный фильтр уже предлагает выбрать уникальные значения, значит наверняка этот массив уникальных значений можно откуда-то выцепить! Разве я не прав? З.Ы. А вот, многоуважаемый мной, White Owl не понял меня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 09:51 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
k-nikeЕсли включенный фильтр уже предлагает выбрать уникальные значения, значит наверняка этот массив уникальных значений можно откуда-то выцепить! Разве я не прав? мне тоже это интересно стало, но в объекте AutoFilter совсем мало свойств и данных о возможных значениях я не нашел. кроме того, список на экране отвечает не только за автофильтр, но и за сортировку (Excel2003), поэтому значения в этот список могут попадать не из автофильтра ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 10:14 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
vbaproмне тоже это интересно стало, но в объекте AutoFilter совсем мало свойств и данных о возможных значениях я не нашел. кроме того, список на экране отвечает не только за автофильтр, но и за сортировку (Excel2003) Вы имеете ввиду, что этот список выдается автофильтром отсортированным? В ExcelXP тоже самое. vbaproпоэтому значения в этот список могут попадать не из автофильтра А вот это не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 10:18 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
k-nike vbaproмне тоже это интересно стало, но в объекте AutoFilter совсем мало свойств и данных о возможных значениях я не нашел. кроме того, список на экране отвечает не только за автофильтр, но и за сортировку (Excel2003) Вы имеете ввиду, что этот список выдается автофильтром отсортированным? В ExcelXP тоже самое. vbaproпоэтому значения в этот список могут попадать не из автофильтра А вот это не понял. в смысле, что кроме самого автофильтра, в раскрывающемся меню есть пункты для сортировки значений в колонке. Эти пункты запускают метод .Sort. Поэтому я думаю, что своего рода «комбо», который мы видим на листе, не относится непосредственно к объекту АФ, а это другой какой-то объект, который сам собирает данные из своей колонки и просто предлагает для указания в АФ. А когда мы выбираем пункт, то запускает АФ с этим значением. А в самом объекте АФ этих уникальных значений нет. Это мое предположение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 10:33 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
vbaproэто другой какой-то объект, который сам собирает данные из своей колонки и просто предлагает для указания в АФ. Да уж. Осталось определить что это за объект такой интересный? И как до него добраться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 10:44 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Созрел другой вопрос по нижеприведенному коду. Как раз нужно находить строки, которые видны после применения автофильтра. White OwlЕсли фильтр уже включен то можно использовать SpecialCells(xlCellTypeVisible) Код: plaintext 1. У меня такая конструкция в ExcelXP не работает. И не пойму, FilteredRange это свойство какого объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 15:42 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
FilteredRange - а это что? диапозон на который установлен фильтр? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 15:53 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 15:55 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
k-nike White OwlЕсли фильтр уже включен то можно использовать SpecialCells(xlCellTypeVisible) Код: plaintext 1. У меня такая конструкция в ExcelXP не работает. И не пойму, FilteredRange это свойство какого объекта?Это не свойство, это собственный объект :) Область на которую наложен фильтр. Просто ActiveSheet.Rows.SpecialCells(xlCellTypeVisible) даст не только отфильтрованые строки, но и строки перед и после фильтрованых. Поэтому для работы имеет смысл сначала повозится и определить (возможно вручную) область попадающую в фильтрацию. Ну а если АвтоФильтр уже существует на листе, то можно написать так: set FilteredRange = ActiveSheet.AutoFilter.Range и использовать этот новый объект для краткости и удобства написания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 17:19 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 17:25 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Выложите пожалуйста, весь пример кода как получить уникальные значения, я как не пытаюсь, не получается. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2008, 19:28 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
вот так у меня заработало Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2008, 12:03 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
А чем принципиально отличается Автофильтр от Комбобокса сводной таблицы? Про перебор значений в комбобоксе сводной таблицы на VBA имеется простой пример в стандартной справке... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2008, 23:08 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Galustovвот так у меня заработало Код: plaintext 1. 2. 3. а как мне из значений в столбце 1 2 3 3 Получить уникальные значения 1 2 3 ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2008, 02:32 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
vbapro k-nike vbaproмне тоже это интересно стало, но в объекте AutoFilter совсем мало свойств и данных о возможных значениях я не нашел. кроме того, список на экране отвечает не только за автофильтр, но и за сортировку (Excel2003) Вы имеете ввиду, что этот список выдается автофильтром отсортированным? В ExcelXP тоже самое. vbaproпоэтому значения в этот список могут попадать не из автофильтра А вот это не понял. в смысле, что кроме самого автофильтра, в раскрывающемся меню есть пункты для сортировки значений в колонке. Эти пункты запускают метод .Sort. Поэтому я думаю, что своего рода «комбо», который мы видим на листе, не относится непосредственно к объекту АФ, а это другой какой-то объект, который сам собирает данные из своей колонки и просто предлагает для указания в АФ. А когда мы выбираем пункт, то запускает АФ с этим значением. А в самом объекте АФ этих уникальных значений нет. Это мое предположение. А когда выбираешь УСЛОВИЕ. то открывается настройка пользовательского фильтра где уже есть комбобоксы с уникальными значениями поля. Хочу сделать свою форму для настройки пользовательского фильтра. Как мне с меньшим гимороем получить комбобокс с уникальными значениями. Позже выложу что будет получаться. А пока вопрос про уникальный комбобокс прошу вынести на обсуждение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 10:02 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
DeggasadКак мне с меньшим гимороем получить комбобокс с уникальными значениями. Мы ж недавно рассматривали подобную задачу. Только там искались повторяющиеся значения в массиве, а тебе нужна обратаня задача - выбрать уникальные. Вот и выбирай из них ту, в которой содержание количества геморроя в единицу времени меньше всего ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 11:29 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-NikDeggasadКак мне с меньшим гимороем получить комбобокс с уникальными значениями. Мы ж недавно рассматривали подобную задачу. Только там искались повторяющиеся значения в массиве, а тебе нужна обратаня задача - выбрать уникальные. Вот и выбирай из них ту, в которой содержание количества геморроя в единицу времени меньше всего Просил подумать. Думал вдруг есть какой-нибуть элемент управления, у которого есть свойство - "показыать только уникальные значения" и я о нем не знаю. Все прочее тоже рассматривается. По сути задачка сделать что-то подобное пользовательскому фильтру автофильтра, только с использованием форм и макросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 13:23 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
по-моему, самым быстрым является такой метод: dim cl as new collection dim arr 'dim filteredrange as range dim i as long on error resume next arr=filteredrange for i=1 to ubound(arr) cl.add arr(i,1),arr(i,1) next и в коллекции cl имеем уникальные элементы соответственно cl.count дает их количество. работает быстрее, чем расширенный фильтр(с учетом помещения в массив) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 13:34 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Ну, если с помощью макроса - то самый быстрый способ - это отсортировать столбец где-нить в свободных ячейках, затем формулами отловить моменты, где предыдущая отличается от следующей. Затем сцепить эти значения через конструкцию Split(Join()," "), " "). Быстрее этого ничего нет! Даже расширенный фильтр с опцией "Только уникальные записи" тут "отдыхает" :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 13:46 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
_slan_, Выложи, плиз, готовый файл-пример с выводом результата уникальных значений, скажем, в рядомстоящий столбец. Интересно будет сравнить ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 14:07 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-Nik, я то как раз говорил о получении массива.. но можно и обратно в столбец. держи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 15:06 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
_slan_, почувствуй разницу Функция Union(), если она стоит в достаточно большом цикле, существенно замедляет работу! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 18:21 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
вот кстати была похожая тема I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 08:22 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
HandKot, Ага, и там было условие не изменять порядок следования элементов (нельзя сортировать). Тогда, если в столбце только числовые значения, то можно сделать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 10:30 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Да, HandKot, ещё одно и самое главное отличие этих вариантов от тех, что на твоей ссылке в том, что на этих данных (3400 строк) самый быстрый вариант (а это вариант с исп. Application.CountIf() ) оказывается медленнее варианта "_slan_ - ANik" по меньшей мере в 25 раз :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 11:04 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-Nik, да, согласен, быстро, но... по мере увеличения масива, разница во времени уменьшается практически до нуля, а так же у способа имеется два больших недостатка: 1 нужно место для сортировки 2 ограничение длиной строки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 14:54 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
ps способ, кстате, не мой - подсказал ZVI на planetaexcel - я решал небольшие массивы - с помощью расширенного фильтра, большие - сортировкой, но формулы вставлял на листе.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 15:10 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
вот пример : здесь методы slan_anik и anik сравнялись, а метод slan-anik 2 работает в полтора раза быстрее(и без ограничений)... но файл не пролезает.. :) на меньшем массиве метод slan-anik 2 работает чуть быстрее, чем anik. для получения вышеозначенного результата нужно пару-тройку раз скопировать и вставить данные из столбца a , получая таким образом массив, в котором все значения повторяются несколько раз - по-моему вполне рабочая ситуация.. при массиве более 20 000 метод anik перестает работать.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 10:36 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Да, _slan_, функция Join() , а так же функция рабочего листа Trim не хотят работать с большим текстом (или с большим массивом, не знаю что им не нравится). Вот сделал вариант Anik', который работает без ограничений ;-) Но на очень больших массивах (напр. 50000 строк) он начинает отставать от slan-ANik2 :-) Так же по подобию slan-ANik2 сделал вариант slan-ANik', который стал значительно быстрее работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 18:14 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
P.S. Признаю вариант "slan-ANik2" как лучший для поиска уникальнх и, если чуток переделать, повторяющихся значений :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 18:18 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-Nik, :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 18:36 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
А как быстро сделать массив значений, если range с разрывами? Вот например у меня rng.Address = "$A$1:$A$6,$A$195:$A$199,$A$388:$A$392,$A$581:$A$585,$A$774:$A$778,$A$967:$A$971" соответственно arr=rng копирует только первую Area $A$1:$A$6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 10:53 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Попробовал копированием rng.copy wstmp.range("A1"), но это всё усложняется там кодом мне надо копировать много ренжей (около 3 тысяч раз) set wstmp = worksheets.add wstmp.UsedRange.Clear wstmp.Delete ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 11:04 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
nporaMep, Сделай так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 11:53 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Придумал так: Dim aCell As Range, area As Range i = 1 For Each area In rng.Areas For Each aCell In area arr(i) = CStr(aCell.Value) i = i + 1 Next Next но кажется криво все равно ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 11:56 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Да, обнаружил ошибку в файле " выборка уникальных значений_3.11.xls " (это обработчик варианта slan-ANik' ). В процедуре Private Sub CommandButton6_Click() надо вместо arr2(j) = arr( j , 1) написать arr2(j) = arr( i , 1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 12:04 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Копирование очень долго. Есть таблица из до 30000-40000 строк. Столбцы в ней условно говоря Поставщик (номера от 1 до 100) Товар (номера от 1 до 240) + прочие поля Надо посчитать сколько различных товаров у каждого поставщика. То есть например поставщик номер 1, у него 1000 записей с товарами от 1 до 240, надо посчитать в нем уникальные, далее тоже самое для поставщика номер 2. Это только часть макроса с расчетами, далее там много формул по минимуму, максимуму, среднему и прочим несложным функциям экселя. Фильтр работает как-то быстрее чем копирование, но range получаются из нескольких area. Вообще думаю мб быстрее будет сделать какой-нить recordset мб на основе таблицы и select group by вытаскивать оттуда по очереди и считать recordset.count но не очень в курсе как это делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 12:42 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Тогда воспользуйся расширенным фильтром ;-) Если не получится - выложи упрощённый файл-пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 12:50 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Вот, надо узнать по каждой ProductID сколько разных CompanyID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 13:49 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
или так: Dim rng As Range Set rng = Selection Dim arr() Dim n% n = rng.Areas.Count ReDim arr(1 To n) Dim i As Long For i = 1 To n arr(i) = rng.Areas(i) Next Dim r, e i = 0 For Each r In arr For Each e In r i = i + 1 Next Next в обычный одномерный массив можно попробовать с помощью copymemory.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 14:00 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
ы, я также сделал в принципе: Private Function GetCompaniesCount(rng As Range) As String Dim cl As New Collection, i As Long, j As Long On Error GoTo erm Dim arr() As String, arr2() As String ReDim arr(1 To rng.Count) ReDim arr2(1 To rng.Count) Dim aCell As Range, area As Range i = 1 For Each area In rng.Areas For Each aCell In area arr(i) = CStr(aCell.Value) i = i + 1 Next Next For i = 1 To UBound(arr) cl.Add arr(i), Format(arr(i), "@") j = j + 1 arr2(j) = arr(i) erm: Resume nxt nxt: Next GetCompaniesCount = cl.Count - 1 End Function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 14:33 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
nporaMepы, я также сделал в принципе... Так же, да не так... :-) Сравни по скорости свой вариант и _slan(a)_ ;-) У него будет по шустрее ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 18:29 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
если задача только узнать количество уникальных, то лучше так: Function num_comp(compid As Range, prodid As Range, prodid_sample As Range) As Long Dim cid Dim cl As New Collection Dim arr, arr2, rng As Range Dim i As Long On Error Resume Next arr = compid arr2 = prodid cid = prodid_sample.Cells(1).Value For i = 1 To UBound(arr) If arr2(i, 1) = cid Then cl.Add arr(i, 1), Format(arr(i, 1), "@") Next num_comp = cl.Count End Function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2008, 19:55 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Private Sub CommandButton4_Click() Dim arr, arr1, x, i&, j&, c As New Collection, t As Single t = Timer On Error Resume Next Application.ScreenUpdating = False With Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)) arr = .Value j = UBound(arr) For Each x In arr Err.Clear c.Add 0, CStr(x) If Err = 0 Then i = i + 1 arr(i, 1) = x End If Next While i < j i = i + 1 arr(i, 1) = Empty Wend .Offset(, 1).Value = arr End With Range("CalcTime") = Timer - t End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2008, 07:14 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2008, 07:17 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
x, лень проверять :) прирост скорости дает? экономия памяти, по-моему, сейчас не актуальна.. да, если будет не массив, а одно единственное значение, то работать не будет - надо доп проверку вводить.. но это в порядке брюзжания, ибо вручную тогда никто запускать макрос не будет, а вот если автоматически.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2008, 10:49 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Да, прирост в скорости небольшой есть :-) Только заметен на оч. больших массивах. Вот я ещё немного ускорил.... (заметно, если много повторов). На 65000 ячейках нижеприведённый вариант аж на 0,08 с. быстрее, чем вар. "_slan_ - ANik 2" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2008, 11:57 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-Nik, 1 не понял смысла применения with 2 отказ от transpose проверял - немного давало.. 3 вот использование константы.. это мысль 4 чем не нравится on error goto erm ? :) 5 еще думал над получением текстового массива, чтобы избежать конвертации в ключ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2008, 12:47 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
ps for each тоже хотел.. но .. что-то не срослось :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2008, 12:49 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Добрый вечер, Слэн и всем! Вчера решил погуглить, где кто. Набрал Slan – попал сюда. Набрал свои три буквы - тоже тут оказался :-) Судьба, значит. Почитал, и вот за коллекции немного заступился. По вопросам: - прирост скорости дает? –> все относительно, но вроде дает - экономия памяти не актуальна –> это для небольшой экономии времени - смысл применения with –> теоретически должно быть чуть экономнее 2-х ссылок на Rng - если будет не массив –> справедливо, но не только для этого варианта ;) - избежать конвертации в текстовый ключ –> наверное, но это нужно пробовать Еще Range("CalcTime") быстрее, чем [CalcTime] А Scripting.Dictionary вообще пошустрее коллекций на больших массивах. А если с ранним связыванием, то и на малых. Компания здесь интересная, но с временем напряг, а там еще и планета Павлова открылась ;-) Всех - с наступающим Новым годом! ZVI ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 01:00 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
приветZVI! а мы тут Вашу идею дорабатываем. :) я понимаю, что for each быстрее , чем со счетчиком - проверял. :) но в чем выигрыш от использования одного массива? да, второе обращение к диапазону я пропустил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 11:05 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
xА Scripting.Dictionary вообще пошустрее коллекций на больших массивах. А если с ранним связыванием, то и на малых. А примерчик можно в разрезе данной задачи ? ;-) Даже два - для раннего и позднего связывания :-) xКомпания здесь интересная, но с временем напряг, а там еще и планета Павлова открылась ;-) Всех - с наступающим Новым годом! ZVI Вот и подключайся :-) За поздравление - спасибо! ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 15:15 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
а мне еще чуть-чуть убыстрить удалось! :) Private Sub CommandButton3_Click() Dim l&, lm& lm = [steps] Columns(2).ClearContents Dim arr, x, c As New Collection, t As Single t = Timer On Error GoTo erm Application.ScreenUpdating = False For l = 0 To lm With Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)) arr = Application.Transpose(.Value) For Each x In arr c.Add 0, CStr(x) arr(c.Count) = x erm: Resume nxt nxt: Next ReDim Preserve arr(c.Count) .Offset(, 1).Value = Application.Transpose(arr) End With Next Range("CalcTime") = Timer - t End Sub и в определенных условиях вдвое.. внешний цикл нужен для определения разницы методов с if err и goto erm goto erm выигрывает 1,5% :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 19:35 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
вот файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 19:40 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
исправление: ReDim Preserve arr(1 To c.Count) и выигрывает при большом количестве повторов, а при отсутствии - проигрывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 20:38 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Обещанное сравнение Dictionary и Collection. Для чистоты эксперимента общее время взаимодействия VBA на загрузку/выгрузку данных из/в таблицу Excel не учитывается. Основная часть кода также практически одинакова для этой же цели. Тестовые данные (почти случайные числа и строки) для уменьшения размера файла удалил. Жмите "Очистить" чтобы очистить старые и создать новые тестовые данные. Назначение остальных кнопок очевидно. --- ZVI ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 21:40 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Забыл уточнить про связывание. В примере закомментируйте эту строку: With CreateObject("Scripting.Dictionary") ' Позднее связывание И раскомментируйте эту (Reference уже установлен): 'With New Dictionary ' Раннее связывание, нужен Reference на MS Scripting Runtime и почувствуйте разницу :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 21:52 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Вот это было написано Джоном Уокенбахом довольно давно. В моем Excel 2007 (под Vista) и с данными последнего примера, этот код быстрее самого быстрого из последних вариантов _slan_ в 3 раза (мне вообще не очень понятно почему все решения используют транспонирование дважды): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 23:40 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Пардон, адаптация кода была с дефектом. Исправленный код дает меньший выигрыш (13%), но все же: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2008, 00:00 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
KL (XL)Вот это было написано Джоном Уокенбахом довольно давно. В моем Excel 2007 (под Vista) и с данными последнего примера, этот код быстрее самого быстрого из последних вариантов _slan_ в 3 раза (мне вообще не очень понятно почему все решения используют транспонирование дважды): ... Попробуйте использовать этот вариант на 60000 ячейках из моего примера. Получите примерно в 290 раз медленнее. чем с Dictionary с ранним связыванием. Переопределение размера массива Redim() означает reallocation memory, что при большом массиве сильно тормозит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2008, 00:01 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Да, KL, метод Уокенбаха, честно сказать, меня только рассмешил Кстати, метод с ранним связыванием - тоже :-) Не ожидал такой скорости работы :-) Единственное, что могу предложить, так это ещё немного оптимизировать цикл для варианта с коллекцией: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 13:57 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-NikДа, KL, метод Уокенбаха, честно сказать, меня только рассмешил Кстати, метод с ранним связыванием - тоже :-) Не ожидал такой скорости работы :-) ... Так метод с ранним связыванием тоже рассмешил или порадовал? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 14:20 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-NikДа, KL, метод Уокенбаха, честно сказать, меня только рассмешил Кстати, метод с ранним связыванием - тоже :-) Не ожидал такой скорости работы :-) Единственное, что могу предложить, так это ещё немного оптимизировать цикл для варианта с коллекцией: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. :) я тоже уже проверил: Private Sub CommandButton2_Click() Dim l&, lm& lm = [steps] Columns(2).ClearContents Dim arr, arr2(), x, c As New Collection, t As Single, i& Application.ScreenUpdating = False t = Timer For l = 1 To lm With Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)) arr = .Value ReDim arr2(1 To UBound(arr), 1 To 1) On Error GoTo erm For Each x In arr c.Add 0, CStr(x) i = i + 1 arr2(i, 1) = x erm: Resume nxt nxt: Next .Offset(, 1).Resize(c.Count) = arr2 End With Next Range("CalcTime") = Timer - t End Sub чуть быстрее, чем у ZVI, но раннему связыванию все же уступает.. вдвое примерно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 15:17 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
и, кстати, при увеличении числа повторов(а это, мне кажется, вполне вероятно в реальности) использование on error goto даст еще больший выигрыш ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 15:24 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
_slan_, а если все это полностью на С сделать... вот только удивляюсь - почему же расширенный фильтр так тормозит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 15:27 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
ZVIТак метод с ранним связыванием тоже рассмешил или порадовал? :-)И то и другое :-) И с поздним связываением тоже :-) Ну где ещё придумаешь такое кол-во вариантов, как не в экселе! :-) Уже можно со счёту сбиться :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 16:45 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Вот чего только мозг программиста не выдумает, чтобы на нормальную СУБД не переходить! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 17:53 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
_slan__slan_, а если все это полностью на С сделать... вот только удивляюсь - почему же расширенный фильтр так тормозит? При больших масcивах и оптимизированном VBA-коде тормозит уже не VBA, а объекты Collection или Dictionary, которые. насколько я понимаю, на С++ писаны. Кстати, скорость кода, скомпилирована на С не всегда выше VBA - зависит от компилятора и от кода. Можно, например. функциями VBA написать код, который работает в 3-раза быстрее, чем встроенная в VBA (С++ компилированная) функция Replace(). На определенных тестах, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 18:33 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
интерпретация по определению не может быть быстрее компиляции.. значит разница в алгоритме.. возможно перегруженность проверками надежности.. после каждого действия assert.. :) попробовать что-ли записать алгоритм на С++ ?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 19:34 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
а с коллекциями, по-моему, все. Оптимизировано до конца: Function unic(src As Range, Optional dest As Range) As Long Dim arr, x, c As New Collection arr = src.Value On Error GoTo erm For Each x In arr c.Add 0, CStr(x) arr(c.Count, 1) = x nxt: Next On Error GoTo 0 If Not dest Is Nothing Then dest.Resize(c.Count) = arr unic = c.Count Exit Function erm: Resume nxt End Function или нет? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 20:57 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
:) а точнее так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 21:06 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Возникла такая же задача. Подправил код для возврата коллекции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Compile error: Argument not optional С чем связана такая ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 12:58 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Дмитрий-(сколько-же-нас?), для обращения к конкретному элементу коллекции (Вы хотели сделать это?), необходимо указыват либо его имя, либо индекс. Вот, например, наверняка знакомый Вам код получение имени листа: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 20:47 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Дмитрий-(сколько-же-нас?), с тем что среда не может понять, ты делаешь вызов процедуры unic и пытаешься передать ей параметр или хочешь вернуть результат :) Ты присваиваешь объектные ссылки, а для их присвоения необходимо указывать Set ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 08:30 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос, unic -- это же функция. Я пытался возвратить коллекцию. В конце-концов, код вставил в тело процедуры и "забил" на вызов функции, т.к. она всё-равно вызывалась только в одном месте. А с коллекцией получился "конфуз": Код: plaintext Когда я переписал : Код: plaintext Заработало только так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 14:22 |
|
||
|
|

start [/forum/topic.php?all=1&fid=61&tid=2178000]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
187ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
129ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 617ms |

| 0 / 0 |
