VBA: эффективный способ создать таблицу без дубликатов - PullRequest
1 голос
/ 24 февраля 2012

Мне нужно прочитать файл, содержащий несколько записей, и создать таблицу, в которой содержится сводная информация о файле.В файле чтения возможно несколько записей одного значения, в сводке требуются только отдельные записи, и они должны быть отсортированы.

Я реализовал два метода:

  1. Я использовал цикл, чтобы проверить, содержит ли выходная таблица значение, если не добавил его.Цикл повторялся по всему списку (не отсортировано)

  2. «Оптимизация» 1: после каждой вставки нового значения таблица сортируется, а цикл прерывается, когдазначение было найдено.

Оба метода сделали свое дело, но заняли очень много времени.Есть ли более эффективный способ сделать это?

edit

для лучшего понимания: мой файл выглядит так

a
d
b
c
a

и мойсписок / таблица должна выглядеть так:

a
b
c
d

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Если вы используете Excel 2010, есть встроенная функциональность для удаления дубликатов.

Я бы импортировал все данные из ваших файлов, а затем удалил дубликаты.

В пользовательском интерфейсе выберите свои данные, а затем нажмите на вкладку Данные и Удалите дубликаты . При появлении запроса выберите нужные параметры и нажмите кнопку ОК.

Та же функциональность доступна в VBA.

Sub Remove_Duplicates()
   ActiveSheet.Range("$A$1:$B$500").RemoveDuplicates _
    Columns:=Array(1, 2), Header:=xlYes
End Sub

В Excel 2003 и более ранних версиях этот VBA мог использоваться. Он использует встроенный расширенный функционал фильтра.

Sub Remove_Duplicates_2003()

    Range("A1:B500").AdvancedFilter Action:=xlFilterCopy, _
     CopyToRange:=Range("C1"), Unique:=True

    Columns("A:B").Delete Shift:=xlToLeft

End Sub
2 голосов
/ 24 февраля 2012

Вот простой пример использования словаря:

Sub test()

  Dim a As Variant
  Dim dict As Variant
  Dim i As Long

  Set dict = CreateObject("Scripting.Dictionary")
  ReDim a(1 To 4) As Variant

  a(1) = "a"
  a(2) = "b"
  a(3) = "c"
  a(4) = "a"
  For i = 1 To 4
    If Not dict.exists(a(i)) Then dict.Add a(i), i
  Next i

  MsgBox "array size = " & UBound(a, 1) & " and dict size = " & dict.Count 'respectively 4 and 3

End Sub
1 голос
/ 24 февраля 2012

Вы действительно хотите использовать VBA?Ну, я предположил, что эту идею можно записать в макрос ...

Я бы выделил столбец дублирующих значений, а затем сделал бы Фильтр> Расширенный фильтр> Копировать в другое место> [x] Уникальныйтолько значения .

Затем сортируйте полученную таблицу уникальных значений, которые она вам дает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...