В первой попытке я подумал, что решение состоит в том, чтобы использовать операторы SQL для возврата только строк DISTINCT.
Но, не поддерживая COLLATION , SQL-предложение в VBA для приблизительно имитацииповедение с учетом регистра не будет столь эффективным, как мне бы хотелось.
Сказал, что единственная альтернатива в VBA (насколько мне известно) - это итерация по набору данных.
Попробуйте использоватьследующий подпроцесс и скажите мне, как это происходит:
Код:
Sub remove_duplicates(ByVal wk_sheet As Worksheet, ByVal rng As Range)
' +----------------------------------------------------------+
' | DESCRIPTION: |
' | Removes all duplicate whole rows in a range. |
' | Case sensitive. |
' | |
' | VARIABLES: |
' | wk_sheet = Worksheet object where our data is stored. |
' | rng = Range object where our data is stored. |
' | arr = array to store the matrix. |
' | a = variables to store rows for comparison. |
' | b = variables to store rows for comparison. |
' | dirrng = string to store the refferences of rows |
' | to delete. |
' | rngc1 = string storing first column reference of |
' | range. |
' | rngc2 = string storing last column reference of |
' | range. |
' | |
' +----------------------------------------------------------+
Dim arr As Variant, a As Variant, b As Variant
Dim dirrng As String, rngc1 As String, rngc2 As String
With rng
arr = .Value
rngc1 = Split(Mid(.Cells(1, 1).Address, 2), "$")(0)
rngc2 = Split(Mid(.Cells(1, .columns.Count).Address, 2), "$")(0)
End With
For i = 1 To UBound(arr)
a = Join(Application.WorksheetFunction.Index(arr, i, 0), "|")
For r = 1 To UBound(arr)
If i <> r And _
(dirrng = "" Or _
Not InStr(1, dirrng, _
rngc1 & i & ":" & rngc2 & i, vbBinaryCompare) > 0) Then
b = Join(Application.WorksheetFunction.Index(arr, r, 0), "|")
If a = b Then
If Len(dirrng) > 0 Then
dirrng = dirrng & "," & rngc1 & r & ":" & rngc2 & r
Else
dirrng = rngc1 & r & ":" & rngc2 & r
End If
End If
End If
Next r
Next i
'Deleting all rows at once is more efficient than deleting one at time
If Len(dirrng) > 0 Then rng.Range(dirrng).Delete Shift:=xlUp
End Sub
Тестирование:
Я сделал тестсо следующим набором данных:
ВАЖНО: Обратите внимание, что у нас есть именованный диапазон "TABLE_CONTENT", который содержит наши поля данных. Вы должны адаптировать свою версию кода, если хотите использовать всю таблицу в качестве диапазона взаимодействия и сохранить заголовки.
Затем я использовал следующее для вызова remove_duplicates подпроцесса, передаваяправильные параметры:
Sub test()
Call remove_duplicates(ActiveSheet, ActiveSheet.Range("TABLE_CONTENT"))
End Sub
Результат:
Надеюсь, это поможет.