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

Может кто-нибудь мне помочь. Я разработал макрос, который отслеживает огромное количество данных (примечание разработано в Excel 2007 vba), который удаляет повторяющиеся записи с некоторыми параметрами пользовательской формы.

Позвольте мне объяснить мою работу. У меня есть 20 столбцов и 15000 строк (может увеличиваться каждый месяц). Я должен удалить повторяющиеся строки, которые добавляются каждый месяц. Строка считается дублированной, если минимум 6 столбцов (из 20) одинаковы. Вам не нужно проверять все 20 значений столбцов в строке, но только 6 значений столбцов, если эти 6 столбцов значения 2 строк одинаковы, тогда вы должны исключить эту строку

Это то, что я сделал в excel 2007

Workbooks(1).Worksheets("duplicate_raw_sheet").Range(("$A$1:$R$65535"))._
 RemoveDuplicates Columns:=Array(1, 2, 6, 7, 8,9), Header:=xlYes

Это макрос, добавленный в Excel 2007 vba для удаления повторяющихся записей. Я просто проверяю столбцы 1,2,6,7,8,9 и удаляю строку, используя указанный выше макрос 2007 года. Но, к сожалению, это не работает в Excel 2003.

Теперь мне нужно реализовать его в 2003 году. Но этот макрос не поддерживается в Excel 2003. Есть ли какой-либо код для выполнения этой задачи? когда я погуглил, я нашел расширенный фильтр => уникальные записи, но это не работает, я так думаю, потому что мне нужно проверить только значение 6 столбцов, но расширенный фильтр проверяет все столбцы. но мне это не нужно, потому что иногда 6 столбцов могут быть равными, а другие столбцы могут быть не равными, и расширенный фильтр может не отфильтровать его как дубликат.

Пожалуйста, помогите мне, ребята. Какие коды я должен следовать или любой другой способ сделать это. Пробую с 2-х дней, но не могу решить. Предложите мне любой метод, который вступит в силу, или покажите мне путь, по которому нужно следовать, я сделаю это на excel vba 2003. Заранее спасибо.


person niko    schedule 19.08.2011    source источник
comment
Пробую с 2-х дней, но не могу решить. Пожалуйста, покажите нам, что вы пробовали.   -  person Jean-François Corbett    schedule 19.08.2011
comment
Какой тип данных находится в 6 столбцах, которые вам нужно проверить? Возможно, вы сможете объединить данные в один вспомогательный столбец или использовать какой-либо другой метод для суммирования 6 столбцов в одну ячейку. Удаление дубликатов тогда будет просто вопросом сортировки вспомогательного столбца и сравнения соседних строк.   -  person barrowc    schedule 19.08.2011
comment
В 1 столбце у меня есть имя, во 2 столбце у меня есть дата, а в третьем столбце у меня есть номер, а в остальных столбцах есть числа   -  person niko    schedule 19.08.2011
comment
@jean Я попробовал это, используя сортировку и формулу для сравнения значений 6 столбцов, но это неэффективная задача, потому что, используя макрос удаления дубликатов 2007, я могу удалить дубликаты 40000 данных ввода в течение 2 секунд.   -  person niko    schedule 19.08.2011
comment
@jean, и все же работа идет не так, может быть, с формулами, мне нужна помощь от вас, ребята   -  person niko    schedule 19.08.2011


Ответы (2)


Да, к сожалению, функция, которую вы используете, только в 2007+.

Итак, вас заботит только то, одинаковы ли ячейки в столбцах 1, 2, 6, 7, 8, 9? Я предполагаю, что это означает, что вам все равно, если 10-20 были одинаковыми.

Исходя из этого предположения, вот идея, которую вы можете попробовать:

Отсортируйте весь диапазон по первому столбцу. Затем прокрутите каждую ячейку в первом столбце. Проверьте значение следующей ячейки. Если следующая ячейка такая же, то смещаем и проверяем значение ячейки в той же строке, но во втором столбце. Если это совпадает, продолжайте через все 6 столбцов. Если они все совпадают, удалите всю строку.

Итак, что-то вроде этого (которое вам нужно будет изменить для вашей реализации)

Sub test()
  Dim rng As Range
  Dim lastRow As Integer
  Dim rowsToDelete As New Collection
  Dim i As Integer
  lastRow = Range("A1").End(xlDown).row

  For Each rng In Range("A1:A9")
    For i = rng.row + 1 To lastRow
      If RowIsDuplicate(rng, i) Then _
        If NotExists(rowsToDelete, i) Then rowsToDelete.Add i
    Next i
  Next rng

  'now loop through the rowsToDelete collection and delete all of the rows

End Sub

Function RowIsDuplicate(source As Range, row As Integer) As Boolean

  RowIsDuplicate = False
  For n = 0 To 5
    'Offset(0, n) means, from the range, go down 0 rows and over n columns
    If source.Offset(0, n).Value <> Range("A" & row).Offset(0, n).Value Then _
      Exit Function
    If n = 5 Then RowIsDuplicate = True
  Next n

End Function

Function NotExists(col As Collection, i As Integer) As Boolean
  Dim v As Variant

  For Each v In col
    If v = i Then
      NotExists = False
      Exit Function
    End If
  Next v
  NotExists = True
End Function

Я проверил это с информацией в диапазоне A1: F9.

1   2   3   4   5   6
1   2   3   4   5   5
1   6   5   4   9   87
1   2   3   4   5   6
1   6   5   4   9   87
1   2   3   4   5   5
1   2   3   4   5   5
1   2   3   4   5   5
1   2   3   4   5   5

У меня есть 6 повторяющихся строк в этой таблице выше. Код, который я разместил, поймал их.

Уже поздно, я устал... надеюсь, это поможет.

person Justin Self    schedule 19.08.2011
comment
с количеством задействованных строк/ячеек это будет очень медленно. Лучше скопировать значения ячеек в массив Variant и вместо этого перебирать его. - person chris neilsen; 19.08.2011
comment
О Дханг! Я прочитал 150 строк вместо 15000. Да, согласен. Кроме того, это, вероятно, сделало бы код более чистым. - person Justin Self; 19.08.2011

Привет, Джастин, и ребятам, которым я задал вышеуказанный вопрос. Ну, у меня появилась идея, когда я продолжал думать об этом. Это то, что я пытался сделать.

Просто используйте формулу Concatenate

 Cells(2,"T").Formula = "=CONCATENATE(A2,B2,F2,G2,H2,I2)" 'append all column values into one string then insert the formula till the end
 Range("T2").Copy Destination:=Range("T3:T39930") 'Apply formula to end of sheet 

Теперь с помощью удаления дубликатов в одном столбце. Вы можете удалить повторяющиеся строки.

Sub Remove_Duplicates_in_a_column()
Dim x As Long
Dim LastRow As Long
LastRow = 39930 ' last row number say 39930
For x = LastRow To 1 Step -1
If Application.WorksheetFunction.CountIf(Range("T1:T" & x), Range("T" & x).Text)>1 Then
        Range("T" & x).EntireRow.Delete
    End If
Next x
MsgBox "Finished The Process"
End Sub

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

person Community    schedule 23.08.2011