powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Узнать все доступные значения при установке автофильтра
78 сообщений из 78, показаны все 4 страниц
Узнать все доступные значения при установке автофильтра
    #33956452
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если поставить автофильтр, то над клеточкой с ним появляется кобобокс в котором ставится условие, но также можно сразу выбирать уникальные значения.
Существует ли возможность через VBA узнать эти уникальные значения (диапазон заранее известен), чтобы программно не перебирать заведомо не встречающиеся значения, как это предлагает сам автофильтр?

...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #33956557
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или вопрос совсем простой или я не правильно его понял.. если пробежать вниз по колонке и собрать эти значения?
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #33956663
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k-nikeСуществует ли возможность через VBA узнать эти уникальные значения (диапазон заранее известен), чтобы программно не перебирать заведомо не встречающиеся значения, как это предлагает сам автофильтр?
Если фильтр уже включен то можно использовать SpecialCells(xlCellTypeVisible)
Код: plaintext
1.
Dim r as Range
Set r = FilteredRange.Rows.SpecialCells(xlCellTypeVisible)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #33957454
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbaproили вопрос совсем простой или я не правильно его понял.. если пробежать вниз по колонке и собрать эти значения?
Похоже, вы правильно поняли мой вопрос. Действительно, можно пробежаться по столбцу и собрать значения. И, признаюсь, мне даже в голову это не пришло, потому что я посчитал, что должен быть более рациональный способ.
Если включенный фильтр уже предлагает выбрать уникальные значения, значит наверняка этот массив уникальных значений можно откуда-то выцепить! Разве я не прав?

З.Ы. А вот, многоуважаемый мной, White Owl не понял меня.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #33957527
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k-nikeЕсли включенный фильтр уже предлагает выбрать уникальные значения, значит наверняка этот массив уникальных значений можно откуда-то выцепить! Разве я не прав?
мне тоже это интересно стало, но в объекте AutoFilter совсем мало свойств и данных о возможных значениях я не нашел. кроме того, список на экране отвечает не только за автофильтр, но и за сортировку (Excel2003), поэтому значения в этот список могут попадать не из автофильтра
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #33957540
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbaproмне тоже это интересно стало, но в объекте AutoFilter совсем мало свойств и данных о возможных значениях я не нашел. кроме того, список на экране отвечает не только за автофильтр, но и за сортировку (Excel2003)
Вы имеете ввиду, что этот список выдается автофильтром отсортированным? В ExcelXP тоже самое.
vbaproпоэтому значения в этот список могут попадать не из автофильтра
А вот это не понял.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #33957593
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k-nike vbaproмне тоже это интересно стало, но в объекте AutoFilter совсем мало свойств и данных о возможных значениях я не нашел. кроме того, список на экране отвечает не только за автофильтр, но и за сортировку (Excel2003)
Вы имеете ввиду, что этот список выдается автофильтром отсортированным? В ExcelXP тоже самое.
vbaproпоэтому значения в этот список могут попадать не из автофильтра
А вот это не понял.
в смысле, что кроме самого автофильтра, в раскрывающемся меню есть пункты для сортировки значений в колонке. Эти пункты запускают метод .Sort.
Поэтому я думаю, что своего рода «комбо», который мы видим на листе, не относится непосредственно к объекту АФ, а это другой какой-то объект, который сам собирает данные из своей колонки и просто предлагает для указания в АФ. А когда мы выбираем пункт, то запускает АФ с этим значением. А в самом объекте АФ этих уникальных значений нет. Это мое предположение.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #33957629
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbaproэто другой какой-то объект, который сам собирает данные из своей колонки и просто предлагает для указания в АФ.
Да уж. Осталось определить что это за объект такой интересный? И как до него добраться?
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #34006645
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Созрел другой вопрос по нижеприведенному коду. Как раз нужно находить строки, которые видны после применения автофильтра.
White OwlЕсли фильтр уже включен то можно использовать SpecialCells(xlCellTypeVisible)
Код: plaintext
1.
Dim r as Range
Set r = FilteredRange.Rows.SpecialCells(xlCellTypeVisible)

У меня такая конструкция в ExcelXP не работает. И не пойму, FilteredRange это свойство какого объекта?
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #34006680
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FilteredRange - а это что?
диапозон на который установлен фильтр?
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #34006686
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
Sub f()
Dim r As Range
Set r = Rows.SpecialCells(xlCellTypeVisible)
MsgBox r.Address
End Sub
так работает
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #34006984
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k-nike White OwlЕсли фильтр уже включен то можно использовать SpecialCells(xlCellTypeVisible)
Код: plaintext
1.
Dim r as Range
Set r = FilteredRange.Rows.SpecialCells(xlCellTypeVisible)

У меня такая конструкция в ExcelXP не работает. И не пойму, FilteredRange это свойство какого объекта?Это не свойство, это собственный объект :) Область на которую наложен фильтр.
Просто ActiveSheet.Rows.SpecialCells(xlCellTypeVisible) даст не только отфильтрованые строки, но и строки перед и после фильтрованых.
Поэтому для работы имеет смысл сначала повозится и определить (возможно вручную) область попадающую в фильтрацию.
Ну а если АвтоФильтр уже существует на листе, то можно написать так:
set FilteredRange = ActiveSheet.AutoFilter.Range
и использовать этот новый объект для краткости и удобства написания.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #34007008
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Чето я ступил с этим FilteredRange.

...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Узнать все доступные значения при установке автофильтра
    #35134010
Yolo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выложите пожалуйста, весь пример кода как получить уникальные значения, я как не пытаюсь, не получается.

Спасибо!
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35193439
Galustov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот так у меня заработало

Код: plaintext
1.
2.
3.
    Dim r As Range
    Set r = ActiveSheet.AutoFilter.Range.Rows.SpecialCells(xlCellTypeVisible)
    MsgBox r.Address
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35193924
LETME
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем принципиально отличается Автофильтр от Комбобокса сводной таблицы?
Про перебор значений в комбобоксе сводной таблицы на VBA имеется простой пример в стандартной справке...
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35194010
Yolo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Galustovвот так у меня заработало

Код: plaintext
1.
2.
3.
    Dim r As Range
    Set r = ActiveSheet.AutoFilter.Range.Rows.SpecialCells(xlCellTypeVisible)
    MsgBox r.Address


а как мне из значений в столбце
1
2
3
3

Получить уникальные значения
1
2
3

???
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35713842
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbapro k-nike vbaproмне тоже это интересно стало, но в объекте AutoFilter совсем мало свойств и данных о возможных значениях я не нашел. кроме того, список на экране отвечает не только за автофильтр, но и за сортировку (Excel2003)
Вы имеете ввиду, что этот список выдается автофильтром отсортированным? В ExcelXP тоже самое.
vbaproпоэтому значения в этот список могут попадать не из автофильтра
А вот это не понял.
в смысле, что кроме самого автофильтра, в раскрывающемся меню есть пункты для сортировки значений в колонке. Эти пункты запускают метод .Sort.
Поэтому я думаю, что своего рода «комбо», который мы видим на листе, не относится непосредственно к объекту АФ, а это другой какой-то объект, который сам собирает данные из своей колонки и просто предлагает для указания в АФ. А когда мы выбираем пункт, то запускает АФ с этим значением. А в самом объекте АФ этих уникальных значений нет. Это мое предположение.

А когда выбираешь УСЛОВИЕ. то открывается настройка пользовательского фильтра где уже есть комбобоксы с уникальными значениями поля.
Хочу сделать свою форму для настройки пользовательского фильтра. Как мне с меньшим гимороем получить комбобокс с уникальными значениями.
Позже выложу что будет получаться. А пока вопрос про уникальный комбобокс прошу вынести на обсуждение.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35714095
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeggasadКак мне с меньшим гимороем получить комбобокс с уникальными значениями.
Мы ж недавно рассматривали подобную задачу. Только там искались повторяющиеся значения в массиве, а тебе нужна обратаня задача - выбрать уникальные. Вот и выбирай из них ту, в которой содержание количества геморроя в единицу времени меньше всего
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35714465
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-NikDeggasadКак мне с меньшим гимороем получить комбобокс с уникальными значениями.
Мы ж недавно рассматривали подобную задачу. Только там искались повторяющиеся значения в массиве, а тебе нужна обратаня задача - выбрать уникальные. Вот и выбирай из них ту, в которой содержание количества геморроя в единицу времени меньше всего

Просил подумать. Думал вдруг есть какой-нибуть элемент управления, у которого есть свойство - "показыать только уникальные значения" и я о нем не знаю. Все прочее тоже рассматривается. По сути задачка сделать что-то подобное пользовательскому фильтру автофильтра, только с использованием форм и макросов.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35714512
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по-моему, самым быстрым является такой метод:

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 дает их количество.

работает быстрее, чем расширенный фильтр(с учетом помещения в массив)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35714554
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, если с помощью макроса - то самый быстрый способ - это отсортировать столбец где-нить в свободных ячейках, затем формулами отловить моменты, где предыдущая отличается от следующей. Затем сцепить эти значения через конструкцию Split(Join()," "), " "). Быстрее этого ничего нет! Даже расширенный фильтр с опцией "Только уникальные записи" тут "отдыхает" :-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35714618
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_slan_,
Выложи, плиз, готовый файл-пример с выводом результата уникальных значений, скажем, в рядомстоящий столбец. Интересно будет сравнить ;-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35714835
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-Nik, я то как раз говорил о получении массива.. но можно и обратно в столбец.

держи
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35715470
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_slan_,
почувствуй разницу
Функция Union(), если она стоит в достаточно большом цикле, существенно замедляет работу!
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35716050
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот кстати была похожая тема


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35716329
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,
Ага, и там было условие не изменять порядок следования элементов (нельзя сортировать).
Тогда, если в столбце только числовые значения, то можно сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub CommandButton4_Click()
Dim rng As Range
Dim RngAddr As String, t As Single
Dim arr
t = Timer
Columns( 2 ).ClearContents
With Application
  .ScreenUpdating = False
  Set rng = Range(Cells( 2 ,  1 ), Cells(Rows.Count,  1 ).End(xlUp))
  RngAddr = rng.Address
  arr = Split(.Trim(Join(Evaluate("TRANSPOSE(IF(FREQUENCY(" & RngAddr & "," & RngAddr & ")," & RngAddr & ",""""))"), " ")), " ")
  rng.Offset(,  1 ).Resize(UBound(arr) +  1 ) = .Transpose(arr)
End With
[CalcTime] = Timer - t
End Sub
Если же присутствуют текстовые значения, то наиболее оптимальным получается второй вариант (_slan_ - ANik).
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35716441
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, HandKot, ещё одно и самое главное отличие этих вариантов от тех, что на твоей ссылке в том, что на этих данных (3400 строк) самый быстрый вариант (а это вариант с исп. Application.CountIf() ) оказывается медленнее варианта "_slan_ - ANik" по меньшей мере в 25 раз :-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35717391
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-Nik, да, согласен, быстро, но...

по мере увеличения масива, разница во времени уменьшается практически до нуля, а так же у способа имеется два больших недостатка:

1 нужно место для сортировки
2 ограничение длиной строки
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35717448
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ps способ, кстате, не мой - подсказал ZVI на planetaexcel - я решал небольшие массивы - с помощью расширенного фильтра, большие - сортировкой, но формулы вставлял на листе..
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35719147
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот пример : здесь методы slan_anik и anik сравнялись, а метод slan-anik 2 работает в полтора раза быстрее(и без ограничений)... но файл не пролезает.. :)

на меньшем массиве метод slan-anik 2 работает чуть быстрее, чем anik. для получения вышеозначенного результата нужно пару-тройку раз скопировать и вставить данные из столбца a , получая таким образом массив, в котором все значения повторяются несколько раз - по-моему вполне рабочая ситуация.. при массиве более 20 000 метод anik перестает работать..
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35720878
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, _slan_, функция Join() , а так же функция рабочего листа Trim не хотят работать с большим текстом (или с большим массивом, не знаю что им не нравится).
Вот сделал вариант Anik', который работает без ограничений ;-) Но на очень больших массивах (напр. 50000 строк) он начинает отставать от slan-ANik2 :-)
Так же по подобию slan-ANik2 сделал вариант slan-ANik', который стал значительно быстрее работать.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35720886
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S.
Признаю вариант "slan-ANik2" как лучший для поиска уникальнх и, если чуток переделать, повторяющихся значений :-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35720934
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-Nik,
:)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35721721
nporaMep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как быстро сделать массив значений, если 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
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35721741
nporaMep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал копированием rng.copy wstmp.range("A1"), но это всё усложняется там кодом
мне надо копировать много ренжей (около 3 тысяч раз)
set wstmp = worksheets.add
wstmp.UsedRange.Clear
wstmp.Delete
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35721890
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nporaMep,
Сделай так:
Код: plaintext
Range("$A$1:$A$6,$A$195:$A$199,$A$388:$A$392,$A$581:$A$585,$A$774:$A$778,$A$967:$A$971").Copy [EmptyCell]
где "EmptyCell" - имя ячейки из любого незадействованного столбца. Там ты получишь уже непрерывный диапазон :-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35721898
nporaMep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Придумал так:
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
но кажется криво все равно (
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35721923
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, обнаружил ошибку в файле " выборка уникальных значений_3.11.xls " (это обработчик варианта slan-ANik' ). В процедуре Private Sub CommandButton6_Click() надо вместо arr2(j) = arr( j , 1) написать arr2(j) = arr( i , 1)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35722064
nporaMep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Копирование очень долго.
Есть таблица из до 30000-40000 строк.
Столбцы в ней условно говоря
Поставщик (номера от 1 до 100)
Товар (номера от 1 до 240)
+ прочие поля

Надо посчитать сколько различных товаров у каждого поставщика.
То есть например поставщик номер 1, у него 1000 записей с товарами от 1 до 240, надо посчитать в нем уникальные, далее тоже самое для поставщика номер 2.

Это только часть макроса с расчетами, далее там много формул по минимуму, максимуму, среднему и прочим несложным функциям экселя.

Фильтр работает как-то быстрее чем копирование, но range получаются из нескольких area.
Вообще думаю мб быстрее будет сделать какой-нить recordset мб на основе таблицы и select group by вытаскивать оттуда по очереди и считать recordset.count но не очень в курсе как это делать.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35722082
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда воспользуйся расширенным фильтром ;-)
Если не получится - выложи упрощённый файл-пример
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35722283
nporaMep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, надо узнать по каждой ProductID сколько разных CompanyID.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35722320
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или так:
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..
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35722436
nporaMep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ы, я также сделал в принципе:

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
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35723188
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nporaMepы, я также сделал в принципе...
Так же, да не так... :-) Сравни по скорости свой вариант и _slan(a)_ ;-) У него будет по шустрее ;-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35723339
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если задача только узнать количество уникальных, то лучше так:
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
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35723697
А так?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35723700
x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x
Гость
Код: 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.
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
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35724015
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x, лень проверять :) прирост скорости дает?

экономия памяти, по-моему, сейчас не актуальна..

да, если будет не массив, а одно единственное значение, то работать не будет - надо доп проверку вводить.. но это в порядке брюзжания, ибо вручную тогда никто запускать макрос не будет, а вот если автоматически..
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35724287
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, прирост в скорости небольшой есть :-) Только заметен на оч. больших массивах.
Вот я ещё немного ускорил.... (заметно, если много повторов).
На 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.
Private Sub CommandButton8_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)
    ReDim arr1(j,  1  To  1 )
    For Each x In arr
      Err.Clear
      c.Add  0 , CStr(x)
      If Err =  0  Then
        arr1(i,  1 ) = x
        i = i +  1 
      End If
    Next
    .Offset(,  1 ).Value = arr1
  End With
  Range("CalcTime") = Timer - t
End Sub
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35724448
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-Nik,

1 не понял смысла применения with

2 отказ от transpose проверял - немного давало..

3 вот использование константы.. это мысль

4 чем не нравится on error goto erm ? :)

5 еще думал над получением текстового массива, чтобы избежать конвертации в ключ
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35724460
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ps
for each тоже хотел.. но .. что-то не срослось :)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35725723
x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x
Гость
Добрый вечер, Слэн и всем!
Вчера решил погуглить, где кто. Набрал Slan – попал сюда.
Набрал свои три буквы - тоже тут оказался :-)
Судьба, значит. Почитал, и вот за коллекции немного заступился.
По вопросам:
- прирост скорости дает? –> все относительно, но вроде дает
- экономия памяти не актуальна –> это для небольшой экономии времени
- смысл применения with –> теоретически должно быть чуть экономнее 2-х ссылок на Rng
- если будет не массив –> справедливо, но не только для этого варианта ;)
- избежать конвертации в текстовый ключ –> наверное, но это нужно пробовать

Еще Range("CalcTime") быстрее, чем [CalcTime]

А Scripting.Dictionary вообще пошустрее коллекций на больших массивах.
А если с ранним связыванием, то и на малых.

Компания здесь интересная, но с временем напряг, а там еще и планета Павлова открылась ;-)
Всех - с наступающим Новым годом!
ZVI
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35725837
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приветZVI!
а мы тут Вашу идею дорабатываем. :)

я понимаю, что for each быстрее , чем со счетчиком - проверял. :)
но в чем выигрыш от использования одного массива?

да, второе обращение к диапазону я пропустил :)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35725936
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xА Scripting.Dictionary вообще пошустрее коллекций на больших массивах.
А если с ранним связыванием, то и на малых.
А примерчик можно в разрезе данной задачи ? ;-) Даже два - для раннего и позднего связывания :-)
xКомпания здесь интересная, но с временем напряг, а там еще и планета Павлова открылась ;-)
Всех - с наступающим Новым годом!
ZVI
Вот и подключайся :-)
За поздравление - спасибо! ;-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35726069
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мне еще чуть-чуть убыстрить удалось! :)

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% :)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35726075
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот файл
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35726105
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исправление: ReDim Preserve arr(1 To c.Count)

и выигрывает при большом количестве повторов, а при отсутствии - проигрывает
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35726148
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обещанное сравнение Dictionary и Collection.

Для чистоты эксперимента общее время взаимодействия VBA на загрузку/выгрузку данных из/в таблицу Excel не учитывается. Основная часть кода также практически одинакова для этой же цели.

Тестовые данные (почти случайные числа и строки) для уменьшения размера файла удалил.
Жмите "Очистить" чтобы очистить старые и создать новые тестовые данные.
Назначение остальных кнопок очевидно.

---
ZVI
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35726157
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл уточнить про связывание.

В примере закомментируйте эту строку:
With CreateObject("Scripting.Dictionary") ' Позднее связывание

И раскомментируйте эту (Reference уже установлен):
'With New Dictionary ' Раннее связывание, нужен Reference на MS Scripting Runtime

и почувствуйте разницу :-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35726248
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот это было написано Джоном Уокенбахом довольно давно. В моем 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.
Function UniqueItems(ArrayIn, Optional Count As Variant) As Variant
    Dim Unique() As Variant
    Dim Element As Variant
    Dim i As Integer
    Dim FoundMatch As Boolean
    Dim NumUnique
        
    If IsMissing(Count) Then Count = True
        
    NumUnique =  0 
        
    For Each Element In ArrayIn
        FoundMatch = False

        For i =  1  To NumUnique
            If Element = Unique(i) Then
                FoundMatch = True
                GoTo AddItem
            End If
        Next i
AddItem:
        If Not FoundMatch Then
            NumUnique = NumUnique +  1 
            ReDim Preserve Unique(NumUnique)
            Unique(NumUnique) = Element
        End If
    
    Next Element
    If Count Then UniqueItems = NumUnique Else UniqueItems = Unique
End Function

Private Sub CommandButton4_Click()
    Dim t As Single
    t = Timer
    Application.ScreenUpdating = False
    With Range(Cells( 2 ,  1 ), Cells(Rows.Count,  1 ).End(xlUp))
        .Offset(,  1 ) = UniqueItems(.Value, False)
    End With
    Range("CalcTime") = Timer - t
End Sub
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35726264
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, адаптация кода была с дефектом. Исправленный код дает меньший выигрыш (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.
Private Sub CommandButton4_Click()
    Dim Unique() As Variant
    Dim rng As Range
    Dim Element As Variant
    Dim i As Integer
    Dim FoundMatch As Boolean
    Dim NumUnique
    Dim t As Single
    
    Columns( 2 ).ClearContents
    
    t = Timer
    Application.ScreenUpdating = False
        
    Set rng = Range(Cells( 2 ,  1 ), Cells(Rows.Count,  1 ).End(xlUp))
        
    NumUnique =  0 
        
    For Each Element In rng
        FoundMatch = False

        For i =  1  To NumUnique
            If Element = Unique(i) Then
                FoundMatch = True
                GoTo AddItem
            End If
        Next i
AddItem:
        If Not FoundMatch Then
            NumUnique = NumUnique +  1 
            ReDim Preserve Unique(NumUnique)
            Unique(NumUnique) = Element
        End If
    
    Next Element
    rng.Offset(,  1 ).Resize(NumUnique).Value = Application.Transpose(Unique())
    Range("CalcTime") = Timer - t
End Sub
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35726268
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Вот это было написано Джоном Уокенбахом довольно давно. В моем Excel 2007 (под Vista) и с данными последнего примера, этот код быстрее самого быстрого из последних вариантов _slan_ в 3 раза (мне вообще не очень понятно почему все решения используют транспонирование дважды):
...

Попробуйте использовать этот вариант на 60000 ячейках из моего примера.
Получите примерно в 290 раз медленнее. чем с Dictionary с ранним связыванием.
Переопределение размера массива Redim() означает reallocation memory, что при большом массиве сильно тормозит.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35727793
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, KL, метод Уокенбаха, честно сказать, меня только рассмешил Кстати, метод с ранним связыванием - тоже :-) Не ожидал такой скорости работы :-)
Единственное, что могу предложить, так это ещё немного оптимизировать цикл для варианта с коллекцией:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub CommandButton4_Click()
Dim arr, arr1, x, c As New Collection, t As Single
  Columns( 2 ).ClearContents
  t = Timer
  On Error GoTo erm
  Application.ScreenUpdating = False
  arr = Range(Cells( 2 ,  1 ), Cells(Rows.Count,  1 ).End(xlUp))
  ReDim arr1( 1  To UBound(arr),  1  To  1 )
  For Each x In arr
    c.Add  0 , CStr(x)
    arr1(c.Count,  1 ) = x
nxt: Next
  Cells( 2 ,  2 ).Resize(c.Count) = arr1
  [CalcTime] = Timer - t
  Exit Sub
erm: Resume nxt
End Sub
Здесь можно было бы просто сделать On Error Resume Next , но так оказывается чуть дольше :-) (заменто на 65000 строках)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35727889
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-NikДа, KL, метод Уокенбаха, честно сказать, меня только рассмешил Кстати, метод с ранним связыванием - тоже :-) Не ожидал такой скорости работы :-)
...

Так метод с ранним связыванием тоже рассмешил или порадовал?
:-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35728063
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A-NikДа, KL, метод Уокенбаха, честно сказать, меня только рассмешил Кстати, метод с ранним связыванием - тоже :-) Не ожидал такой скорости работы :-)
Единственное, что могу предложить, так это ещё немного оптимизировать цикл для варианта с коллекцией:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub CommandButton4_Click()
Dim arr, arr1, x, c As New Collection, t As Single
  Columns( 2 ).ClearContents
  t = Timer
  On Error GoTo erm
  Application.ScreenUpdating = False
  arr = Range(Cells( 2 ,  1 ), Cells(Rows.Count,  1 ).End(xlUp))
  ReDim arr1( 1  To UBound(arr),  1  To  1 )
  For Each x In arr
    c.Add  0 , CStr(x)
    arr1(c.Count,  1 ) = x
nxt: Next
  Cells( 2 ,  2 ).Resize(c.Count) = arr1
  [CalcTime] = Timer - t
  Exit Sub
erm: Resume nxt
End Sub
Здесь можно было бы просто сделать On Error Resume Next , но так оказывается чуть дольше :-) (заменто на 65000 строках)

:)

я тоже уже проверил:
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, но раннему связыванию все же уступает.. вдвое примерно?
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35728081
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и, кстати, при увеличении числа повторов(а это, мне кажется, вполне вероятно в реальности) использование on error goto даст еще больший выигрыш
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35728090
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan_,
а если все это полностью на С сделать...

вот только удивляюсь - почему же расширенный фильтр так тормозит?
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35728317
A-Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZVIТак метод с ранним связыванием тоже рассмешил или порадовал? :-)И то и другое :-) И с поздним связываением тоже :-)
Ну где ещё придумаешь такое кол-во вариантов, как не в экселе! :-) Уже можно со счёту сбиться :-)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35728499
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот чего только мозг программиста не выдумает, чтобы на нормальную СУБД не переходить!
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35728626
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_slan__slan_,
а если все это полностью на С сделать...

вот только удивляюсь - почему же расширенный фильтр так тормозит?
При больших масcивах и оптимизированном VBA-коде тормозит уже не VBA, а объекты Collection или Dictionary, которые. насколько я понимаю, на С++ писаны.

Кстати, скорость кода, скомпилирована на С не всегда выше VBA - зависит от компилятора и от кода. Можно, например. функциями VBA написать код, который работает в 3-раза быстрее, чем встроенная в VBA (С++ компилированная) функция Replace(). На определенных тестах, конечно.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35728764
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интерпретация по определению не может быть быстрее компиляции..

значит разница в алгоритме..

возможно перегруженность проверками надежности..

после каждого действия assert.. :) попробовать что-ли записать алгоритм на С++ ?..
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35728864
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а с коллекциями, по-моему, все. Оптимизировано до конца:

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


или нет? :)
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #35728872
_slan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)

а точнее так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Function unic(src As Range, Optional dest As Range) As Long
  Dim arr, x, c As New Collection
    arr = src.Value
    If dest Is noting Then
        On Error Resume Next
        For Each x In arr
            c.Add  0 , CStr(x)
        Next
        On Error GoTo  0 
    Else
        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 
        dest.Resize(c.Count) = arr
    End If
    unic = c.Count
    Exit Function
erm:   Resume nxt
End Function
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Узнать все доступные значения при установке автофильтра
    #36680409
Возникла такая же задача.
Подправил код для возврата коллекции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function unic(src As Range) As Collection
  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 
    unic = c
    Exit Function
erm:   Resume nxt
End Function
Ругается на строку unic = c :
Compile error:
Argument not optional
С чем связана такая ошибка?
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #36681597
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий-(сколько-же-нас?), для обращения к конкретному элементу коллекции (Вы хотели сделать это?),
необходимо указыват либо его имя, либо индекс. Вот, например, наверняка знакомый Вам код получение имени листа:
Код: plaintext
x=ThisWorkbook.Worksheets( 2 ).Name
Здесь 2 - индекс второго элемента коллекции рабочих листов книги.
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #36681936
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий-(сколько-же-нас?),

с тем что среда не может понять, ты делаешь вызов процедуры unic и пытаешься передать ей параметр или хочешь вернуть результат :)
Ты присваиваешь объектные ссылки, а для их присвоения необходимо указывать Set
...
Рейтинг: 0 / 0
Узнать все доступные значения при установке автофильтра
    #36682913
Игорь Горбонос,

unic -- это же функция.
Я пытался возвратить коллекцию.
В конце-концов, код вставил в тело процедуры и "забил" на вызов функции, т.к. она всё-равно вызывалась только в одном месте.
А с коллекцией получился "конфуз":
Код: plaintext
c.Add  0 , CStr(x)
Не добавляет уникальное значение в коллекцию с , а только "отслеживает" уникальность х (а добавляет 0).
Когда я переписал :
Код: plaintext
c.Add CStr(x), CStr(x)
оказалось, что числа сохранены в виде строки с разделителем десятичной части в виде запятой и фильтр, который в дальнейшем использует эти значения -- не воспринял их, как числа (разделитель в экселе установлен в виде точки).
Заработало только так:
Код: plaintext
c.Add x, CStr(x)
Причём в отладчике индексы коллекции с показывались с запятой :)
...
Рейтинг: 0 / 0
78 сообщений из 78, показаны все 4 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Узнать все доступные значения при установке автофильтра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]