|
|
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=35722082&tid=2178000]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
184ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 523ms |

| 0 / 0 |
