Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Collection - получение уникальных записей. - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Collection - получение уникальных записей.
Rioran Дата: Среда, 17.12.2014, 11:15 | Сообщение № 1
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Всем привет!

Просьба создать пример кода, который использует Collection для получения уникальных записей из перебираемого массива.

Ранее решал эту задачу с помощью массивов. Собираем записи, встречающиеся впервые, последовательным перебором строк начальных данных и для каждой такой строки перебор результирующего массива. Думаю, коллекции должны с этим справляться быстрее и изящнее.
К сообщению приложен файл: Rio_CollQ.xlsm (12.5 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Среда, 17.12.2014, 11:16
 
Ответить
СообщениеВсем привет!

Просьба создать пример кода, который использует Collection для получения уникальных записей из перебираемого массива.

Ранее решал эту задачу с помощью массивов. Собираем записи, встречающиеся впервые, последовательным перебором строк начальных данных и для каждой такой строки перебор результирующего массива. Думаю, коллекции должны с этим справляться быстрее и изящнее.

Автор - Rioran
Дата добавления - 17.12.2014 в 11:15
DJ_Marker_MC Дата: Среда, 17.12.2014, 11:31 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Rioran, привет.

Так или нет?

[vba]
Код
Sub qqq()
Dim Uniq As New Collection, LastRow As Long, i As Long, a()
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
a = Range(Cells(2, 1), Cells(LastRow, 1)).Value
For i = 1 To UBound(a, 1)
On Error Resume Next
Uniq.Add a(i, 1), CStr(a(i, 1))
Next

For i = 1 To Uniq.Count
Cells(i + 1, 3) = Uniq.Item(i)
Next

End Sub
[/vba]

p.s. - велик не мой, взял скорее всего на планете, давно лежит в полезных настройках))))
К сообщению приложен файл: marker_CollQ.xlsm (18.3 Kb)


Сообщение отредактировал DJ_Marker_MC - Среда, 17.12.2014, 11:37
 
Ответить
СообщениеRioran, привет.

Так или нет?

[vba]
Код
Sub qqq()
Dim Uniq As New Collection, LastRow As Long, i As Long, a()
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
a = Range(Cells(2, 1), Cells(LastRow, 1)).Value
For i = 1 To UBound(a, 1)
On Error Resume Next
Uniq.Add a(i, 1), CStr(a(i, 1))
Next

For i = 1 To Uniq.Count
Cells(i + 1, 3) = Uniq.Item(i)
Next

End Sub
[/vba]

p.s. - велик не мой, взял скорее всего на планете, давно лежит в полезных настройках))))

Автор - DJ_Marker_MC
Дата добавления - 17.12.2014 в 11:31
Hugo Дата: Среда, 17.12.2014, 11:33 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
On Error Resume Next полезно вынести из цикла.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеOn Error Resume Next полезно вынести из цикла.

Автор - Hugo
Дата добавления - 17.12.2014 в 11:33
nilem Дата: Среда, 17.12.2014, 11:51 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
тут был примерчик (сообщение №6)


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениетут был примерчик (сообщение №6)

Автор - nilem
Дата добавления - 17.12.2014 в 11:51
krosav4ig Дата: Среда, 17.12.2014, 12:39 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 2348
Репутация: 997 ±
Замечаний: 0% ±

Excel 2007,2010,2013
а можно словарем?
[vba]
Код
Sub sdssd()
     Dim dic As Object: Set dic = CreateObject("scripting.dictionary")
     Dim cell As Range
     For Each cell In [A2:A101]
         dic(cell.Value) = dic(cell.Value) + 1
     Next
     [C2].Resize(UBound(dic.keys) + 1) = Application.Transpose(dic.keys)
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениеа можно словарем?
[vba]
Код
Sub sdssd()
     Dim dic As Object: Set dic = CreateObject("scripting.dictionary")
     Dim cell As Range
     For Each cell In [A2:A101]
         dic(cell.Value) = dic(cell.Value) + 1
     Next
     [C2].Resize(UBound(dic.keys) + 1) = Application.Transpose(dic.keys)
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 17.12.2014 в 12:39
Rioran Дата: Среда, 17.12.2014, 13:58 | Сообщение № 6
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Всем спасибо, то что надо!


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеВсем спасибо, то что надо!

Автор - Rioran
Дата добавления - 17.12.2014 в 13:58
Rioran Дата: Среда, 17.12.2014, 14:15 | Сообщение № 7
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
А есть ли способ из коллекции вывести все значения за раз, в одно действие без цикла?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеА есть ли способ из коллекции вывести все значения за раз, в одно действие без цикла?

Автор - Rioran
Дата добавления - 17.12.2014 в 14:15
Rioran Дата: Среда, 17.12.2014, 14:35 | Сообщение № 8
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
krosav4ig, а почему Ubound(dic.keys) выдаёт только 12, хотя Item'ов в словаре на деле 13?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Среда, 17.12.2014, 14:36
 
Ответить
Сообщениеkrosav4ig, а почему Ubound(dic.keys) выдаёт только 12, хотя Item'ов в словаре на деле 13?

Автор - Rioran
Дата добавления - 17.12.2014 в 14:35
krosav4ig Дата: Среда, 17.12.2014, 15:06 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 2348
Репутация: 997 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Rioran, ну дык массив, с 0 начинается


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеRioran, ну дык массив, с 0 начинается

Автор - krosav4ig
Дата добавления - 17.12.2014 в 15:06
Rioran Дата: Среда, 17.12.2014, 15:10 | Сообщение № 10
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
krosav4ig, тогда странно, что Option Base 1 не имеет над этим никакой власти.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеkrosav4ig, тогда странно, что Option Base 1 не имеет над этим никакой власти.

Автор - Rioran
Дата добавления - 17.12.2014 в 15:10
krosav4ig Дата: Среда, 17.12.2014, 15:13 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 2348
Репутация: 997 ±
Замечаний: 0% ±

Excel 2007,2010,2013
еще вариант, на случай, если уникальных значений будет > 2^16 (ибо трансп() не понимает более 65536 строк). Нужен Net.FW

[vba]
Код
Option Explicit
Sub getunique()
      Const rr = 2 ^ 16
      On Error GoTo getunique_Error
      Dim AL:  Set AL = CreateObject("System.Collections.ArrayList")
      Dim AL1: Set AL1 = CreateObject("System.Collections.ArrayList")
      Dim cell As Range, i%, n&, m&
      With Application
          .ScreenUpdating = 0: .EnableEvents = 0
          For Each cell In [A2:A101]
              If Not AL.contains(cell.Value) Then AL.Add cell.Value
          Next
          'AL.Sort ' сортировка по возрастанию
          'AL.Sort: AL.Reverse 'сортировка по убыванию
          Do
              n = Application.Min(rr, AL.Count - i * rr)
              Set AL1 = AL.getrange(i * rr - IIf(i, 1, 0), n)
              With [C2].Offset(i*rr).Resize(n)
                  .Formula = Application.Transpose(AL1.Toarray)
                  m = m + .Count
              End With
              i = i + 1
          Loop Until m = AL.Count
          Set AL = Nothing: Set AL1 = AL
getunique_Error:
          .ScreenUpdating = 1: .EnableEvents = 1
      End With
      If Err.Number Then MsgBox "Error " & Err.Number & " (" & Err.Description & ") in Sub getunique"
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Среда, 17.12.2014, 15:16
 
Ответить
Сообщениееще вариант, на случай, если уникальных значений будет > 2^16 (ибо трансп() не понимает более 65536 строк). Нужен Net.FW

[vba]
Код
Option Explicit
Sub getunique()
      Const rr = 2 ^ 16
      On Error GoTo getunique_Error
      Dim AL:  Set AL = CreateObject("System.Collections.ArrayList")
      Dim AL1: Set AL1 = CreateObject("System.Collections.ArrayList")
      Dim cell As Range, i%, n&, m&
      With Application
          .ScreenUpdating = 0: .EnableEvents = 0
          For Each cell In [A2:A101]
              If Not AL.contains(cell.Value) Then AL.Add cell.Value
          Next
          'AL.Sort ' сортировка по возрастанию
          'AL.Sort: AL.Reverse 'сортировка по убыванию
          Do
              n = Application.Min(rr, AL.Count - i * rr)
              Set AL1 = AL.getrange(i * rr - IIf(i, 1, 0), n)
              With [C2].Offset(i*rr).Resize(n)
                  .Formula = Application.Transpose(AL1.Toarray)
                  m = m + .Count
              End With
              i = i + 1
          Loop Until m = AL.Count
          Set AL = Nothing: Set AL1 = AL
getunique_Error:
          .ScreenUpdating = 1: .EnableEvents = 1
      End With
      If Err.Number Then MsgBox "Error " & Err.Number & " (" & Err.Description & ") in Sub getunique"
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 17.12.2014 в 15:13
RAN Дата: Среда, 17.12.2014, 16:34 | Сообщение № 12
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Как то сложно
Resize(UBound(dic.keys) + 1)

[vba]
Код
Resize(dic.count)
[/vba] :)


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеКак то сложно
Resize(UBound(dic.keys) + 1)

[vba]
Код
Resize(dic.count)
[/vba] :)

Автор - RAN
Дата добавления - 17.12.2014 в 16:34
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!