如果您可以使用辅助列从第 2 行中查找列 B 到 I 中的重复项,则在辅助列的第二行中输入以下公式。
=Sort_and_CONCATENATE(B2:I2,"|")
并抄下公式。
此公式将对“B2:I2”范围内的单元格进行排序和合并。然后您可以在此列上使用删除重复项。
以下是VBA中用户定义的函数代码
Option Explicit
'============================================================================
Function Sort_and_CONCATENATE(myRng As Range, deLmt As String, Optional srtCriteria = 0)
'srtCriteria is criteria to sort; 0 or nothing for Ascending, Other digit for descending.
Dim myString As String, Lb As Long, Ub As Long, i As Long, j As Long
Dim arr, reverseArray
Dim strTemp As String
arr = myRng.Value
myString = Join(Application.Index(arr, 1, 0), deLmt)
arr = Split(Trim(myString), deLmt)
Lb = LBound(arr)
Ub = UBound(arr)
For i = Lb To Ub - 1
For j = i + 1 To Ub
If IsNumeric(arr(i)) = True And IsNumeric(arr(j)) = True Then
If Val(arr(i)) > Val(arr(j)) Then
strTemp = arr(i)
arr(i) = arr(j)
arr(j) = strTemp
End If
Else
If IsDate(arr(i)) = True And IsDate(arr(j)) = True Then
If DateValue(arr(i)) > DateValue(arr(j)) Then
strTemp = arr(i)
arr(i) = arr(j)
arr(j) = strTemp
End If
Else
If (arr(i)) > (arr(j)) Then
strTemp = arr(i)
arr(i) = arr(j)
arr(j) = strTemp
End If
End If
End If
Next j
Next i
If srtCriteria = 0 Then
Sort_and_CONCATENATE = Join(arr, deLmt)
Else
ReDim reverseArray(Ub)
For i = 0 To Ub
reverseArray(i) = arr(Ub - i)
Next
Sort_and_CONCATENATE = Join(reverseArray, deLmt)
End If
End Function
此外,使用this function,我们可以创建以下程序来删除重复项。 宏导致的 Excel 更改无法撤消。请在样本/重复数据上尝试宏。如果我们使用以下过程,我们不必使用帮助列。
Option Explicit
'============================================================================
Sub removeDuplicatesAcrossColumns()
Dim resultArr(), resultColl As New Collection, tblRng As Range, i As Long, j As Long
Set tblRng = Application.InputBox("Select Table Range", "Table Range", , , , , , 8)
For i = 1 To tblRng.Rows.Count
If ExistsInCollection(resultColl, Sort_and_CONCATENATE(tblRng.Rows(i), "|")) = False Then
resultColl.Add i, Sort_and_CONCATENATE(tblRng.Rows(i), "|")
ReDim Preserve resultArr(1 To tblRng.Columns.Count, 1 To resultColl.Count)
For j = 1 To tblRng.Columns.Count
resultArr(j, resultColl.Count) = tblRng(i, j).Formula
Next
End If
Next
tblRng.ClearContents
Range(tblRng(1, 1).Address).Resize(UBound(resultArr, 2), tblRng.Columns.Count).Formula = Application.Transpose(resultArr)
End Sub
'============================================================================
Public Function ExistsInCollection(col As Collection, key As Variant) As Boolean
On Error GoTo err
ExistsInCollection = True
IsObject (col.Item(key))
Exit Function
err:
ExistsInCollection = False
End Function
'============================================================================
在下面的 GIF 中,帮助列用于显示重复项。否则,在上述过程中不需要辅助列。