макрос работает в 2007 году и позже, но не в 2003 году (удалите дубликаты).Что я должен сделать, чтобы это работало на 2003 - PullRequest
0 голосов
/ 19 августа 2011

Может кто-нибудь, пожалуйста, помогите мне.Я разработал макрос, который отслеживает огромное количество данных (примечание, разработанное в 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.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Да, к сожалению, функция, которую вы используете, доступна только в 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 повторяющихся строк.Код, который я разместил, поймал их.

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

0 голосов
/ 23 августа 2011

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

Просто используйте формулу Конкатенации

 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

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

...