删除给定行中的重复条目
Delete duplicate entries in a given row
我想删除每一行中的重复项,这样该行中就不会有 "holes"。我有的是:
Col A Col B Col C Col D Col E Col F Col G
A B C D A B A
J I K J I K I
B A B J I K L
最多 4 万行。
输出要求:
Col A Col B Col C Col D Col E Col F Col G
A B C D
J I K
B A J I K L
我建议遍历范围内的每一行,提取值,生成唯一集,然后重新粘贴到行中。
以下函数采用值数组和 returns 数组中的唯一值,使用 Scripting.Dictionary
。添加对 Microsoft 脚本运行时的引用(工具 -> 引用...)。
Function Unique(values As Variant) As Variant()
'Put all the values as keys into a dictionary
Dim dict As New Scripting.Dictionary, val As Variant
For Each val In values
dict(val) = 1
Next
Unique = dict.Keys
End Function
那么您可以进行以下操作:
Dim rng As Range, row As Range
Set rng = ActiveSheet.UsedRange
For Each row In rng.Rows
Dim values() As Variant 'We need this to extract the values from the range, and to avoid passing in the range itself
values = row
Dim newValues() As Variant
newValues = Unique(values)
ReDim Preserve newValues(UBound(values, 2)) 'without this, the array will be smaller than the row, and Excel will fill the unmatched cells with #N/A
row = newValues
Next
确保源数据右侧的列为空白。输出将去那里。
将此例程放在标准代码模块中,运行它:
Public Sub CullDistinct()
Dim rSrc As Range, lRws&, lCls&, lOut&, sOut$, sMn1$, sRow1$
Set rSrc = [a1].CurrentRegion
sRow1 = rSrc.Resize(1).Address(0, 1)
lRws = rSrc.Rows.Count
lCls = rSrc.Columns.Count
lOut = lCls + 2
sOut = Split(Cells(, lOut).Address, "$")(1)
sMn1 = Split(Cells(, lOut - 1).Address, "$")(1) & 1: sMn1 = sMn1 & ":" & sMn1
With Range(sOut & 1)
.FormulaArray = "=IFERROR(INDEX(" & sRow1 & ",MATCH(,COUNTIF($" & sMn1 & "," & sRow1 & "),)),"""")"
.Copy .Offset(, 1).Resize(, lCls - 1)
.Resize(, lCls).Copy .Offset(1).Resize(lRws - 1)
With .Resize(lRws, lCls): .Value = .Value: End With
End With
End Sub
我想删除每一行中的重复项,这样该行中就不会有 "holes"。我有的是:
Col A Col B Col C Col D Col E Col F Col G
A B C D A B A
J I K J I K I
B A B J I K L
最多 4 万行。
输出要求:
Col A Col B Col C Col D Col E Col F Col G
A B C D
J I K
B A J I K L
我建议遍历范围内的每一行,提取值,生成唯一集,然后重新粘贴到行中。
以下函数采用值数组和 returns 数组中的唯一值,使用 Scripting.Dictionary
。添加对 Microsoft 脚本运行时的引用(工具 -> 引用...)。
Function Unique(values As Variant) As Variant()
'Put all the values as keys into a dictionary
Dim dict As New Scripting.Dictionary, val As Variant
For Each val In values
dict(val) = 1
Next
Unique = dict.Keys
End Function
那么您可以进行以下操作:
Dim rng As Range, row As Range
Set rng = ActiveSheet.UsedRange
For Each row In rng.Rows
Dim values() As Variant 'We need this to extract the values from the range, and to avoid passing in the range itself
values = row
Dim newValues() As Variant
newValues = Unique(values)
ReDim Preserve newValues(UBound(values, 2)) 'without this, the array will be smaller than the row, and Excel will fill the unmatched cells with #N/A
row = newValues
Next
确保源数据右侧的列为空白。输出将去那里。
将此例程放在标准代码模块中,运行它:
Public Sub CullDistinct()
Dim rSrc As Range, lRws&, lCls&, lOut&, sOut$, sMn1$, sRow1$
Set rSrc = [a1].CurrentRegion
sRow1 = rSrc.Resize(1).Address(0, 1)
lRws = rSrc.Rows.Count
lCls = rSrc.Columns.Count
lOut = lCls + 2
sOut = Split(Cells(, lOut).Address, "$")(1)
sMn1 = Split(Cells(, lOut - 1).Address, "$")(1) & 1: sMn1 = sMn1 & ":" & sMn1
With Range(sOut & 1)
.FormulaArray = "=IFERROR(INDEX(" & sRow1 & ",MATCH(,COUNTIF($" & sMn1 & "," & sRow1 & "),)),"""")"
.Copy .Offset(, 1).Resize(, lCls - 1)
.Resize(, lCls).Copy .Offset(1).Resize(lRws - 1)
With .Resize(lRws, lCls): .Value = .Value: End With
End With
End Sub