我正在尝试从Excel中的一列数字中删除所有重复的值。我希望剩余的列只包含来自原始表的唯一值。
我尝试过使用RemoveDuplicates方法,但它只删除了副本的一个实例,而不是所有副本。
我也尝试过使用以下代码,但它存在与RemoveDuplicates相同的问题。我不知道为什么,因为“唯一”标签被设置为"True“。
{MYWORKSHEET]AdvancedFilter Action:= _
xlFilterCopy, CopyToRange:=[MYWORKSHEET].Range("B1"), Unique:=True
我只找到了一种理论上可行的解决方案,那就是使用嵌套的For循环来迭代每一行,并检查它是否等同于表中的任何其他行。唯一的问题是,这会使我机器上的Excel崩溃,因为它必须进行大量的循环。除了这种暴力方法之外,还有其他方法可以做到这一点吗?
|-------| |----------------| |-------------------|
| INPUT | | DESIRED OUTPUT | | WHAT I DONT WANT |
|-------| |----------------| |-------------------|
| 11111 | | 11111 | | 11111 |
|-------| |----------------| |-------------------|
| 22222 | | 55555 | | 22222 |
|-------| |----------------| |-------------------|
| 33333 | | 33333 |
|-------| |-------------------|
| 22222 | | 55555 |
|-------| |-------------------|
| 33333 |
|-------|
| 55555 |
|-------|
发布于 2019-06-21 02:35:56
使用具有公式条件的Advanced Filter
,例如:=COUNTIF($A$6:$A$11,A6)=1
结果:
如果你需要使用公式,你可以这样做:
=IFERROR(INDEX(inputTbl,AGGREGATE(15,6,1/(COUNTIF(inputTbl[Input],inputTbl[Input])=1) * ROW(inputTbl)-ROW(inputTbl[#Headers]),ROWS($1:1))),"")
发布于 2019-06-21 02:39:43
您可以将值加载到字典中,并将键的值设置为false,检查键是否存在,如果存在,则将值更改为true。遍历字典并仅转储为false的键。
dim mydict as object
dim iter as long
dim lastrow as long
dim cellval as string
dim dictkey as variant
set mydict = createobject("Scripting.Dictionary")
with activesheet
lastrow = .Cells(.Rows.Count, "ColumnLetter").End(xlUp).row
for iter = 1 to lastrow
cellval = .cells(iter, "ColumnLetter").value
if not mydict.exists(cellval) then
mydict.add cellval, False
else
mydict(cellval) = True
end if
next
iter = 1
for each dictkey in mydict
if mydict(dictkey) = False then
.cells(iter, "ColumnLetter").value = dictkey
iter = iter + 1
end if
next
end with
发布于 2019-06-21 03:37:59
好了,这里有一个宏用来实际执行删除操作,或者至少让您开始:
Private Sub CommandButton1_Click()
Dim celll, rng As Range
Dim strRow, strRowList As String
Dim strRows() As String
Set rng = Range("a1:a" & Range("a1").End(xlDown).Row)
For Each celll In rng
If celll.Address = rng(1, 1).Address Then
If celll.Value = celll.Offset(1, 0).Value Then strRow = celll.Row
ElseIf celll.Value = celll.Offset(-1, 0).Value Or celll.Value = celll.Offset(1, 0).Value Then
strRow = celll.Row
End If
If strRowList = "" Then
strRowList = strRow
ElseIf strRow <> "" Then
strRowList = strRowList & "," & strRow
End If
strRow = ""
Next
MsgBox (strRowList)
strRows() = Split(strRowList, ",")
For i = UBound(strRows) To 0 Step -1
Rows(strRows(i)).Delete
Next
End Sub
https://stackoverflow.com/questions/56691284
复制相似问题