2012-02-24 3 views
1

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

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

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

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

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

редактировать

для лучшего понимания: Мой файл выглядит следующим образом

a 
d 
b 
c 
a 

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

a 
b 
c 
d 
+0

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

+0

Будет ли http://support.microsoft.com/kb/257819 с помощью костюма SELECT DISTINCT? – Fionnuala

+0

assylias: Я добавил пример, я надеюсь, что это поможет понять.Remou: Решение ADO выглядит неплохо, но для лучшей совместимости я бы хотел сделать это только в стандартном excel vba. – poeschlorn

ответ

2

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

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 
+0

Кроме того, если вы поместите данные в лист и зацикливаете на ячейки, это может быть значительным фактором общей производительности, но вы не знаете, как вы читаете данные. – assylias

+0

Я собираюсь понять, как использование массива вместо итерации через ячейки влияет на эффективность моего algo. – poeschlorn

1

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

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

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

3

Если вы используете 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 
+0

Привет, я использую Excel 2003. Фрагмент кода, который вы опубликовали, отлично выглядит, но не работает в 2003 году. Объект «Диапазон» не имеет такого метода. Есть ли аналогичное эффективное обходное решение? – poeschlorn

+0

Функциональность, которую использует код, существует только в Excel 2010. Я добавил код, который должен работать в Excel 2003 и ранее. –

Смежные вопросы