首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何用VBA删除excel中某一列中的所有重复项,只留下没有重复项的行?

如何用VBA删除excel中某一列中的所有重复项,只留下没有重复项的行?
EN

Stack Overflow用户
提问于 2019-06-21 01:39:01
回答 3查看 185关注 0票数 0

我正在尝试从Excel中的一列数字中删除所有重复的值。我希望剩余的列只包含来自原始表的唯一值。

我尝试过使用RemoveDuplicates方法,但它只删除了副本的一个实例,而不是所有副本。

我也尝试过使用以下代码,但它存在与RemoveDuplicates相同的问题。我不知道为什么,因为“唯一”标签被设置为"True“。

代码语言:javascript
复制
{MYWORKSHEET]AdvancedFilter Action:= _
    xlFilterCopy, CopyToRange:=[MYWORKSHEET].Range("B1"), Unique:=True

我只找到了一种理论上可行的解决方案,那就是使用嵌套的For循环来迭代每一行,并检查它是否等同于表中的任何其他行。唯一的问题是,这会使我机器上的Excel崩溃,因为它必须进行大量的循环。除了这种暴力方法之外,还有其他方法可以做到这一点吗?

代码语言:javascript
复制
|-------| |----------------| |-------------------|
| INPUT | | DESIRED OUTPUT | | WHAT I DONT WANT  |
|-------| |----------------| |-------------------|
| 11111 | |      11111     | |       11111       |
|-------| |----------------| |-------------------|
| 22222 | |      55555     | |       22222       |
|-------| |----------------| |-------------------|
| 33333 |                    |       33333       |
|-------|                    |-------------------|
| 22222 |                    |       55555       |
|-------|                    |-------------------|
| 33333 |
|-------|
| 55555 |
|-------|
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-21 02:35:56

使用具有公式条件的Advanced Filter,例如:=COUNTIF($A$6:$A$11,A6)=1

结果:

如果你需要使用公式,你可以这样做:

代码语言:javascript
复制
=IFERROR(INDEX(inputTbl,AGGREGATE(15,6,1/(COUNTIF(inputTbl[Input],inputTbl[Input])=1) * ROW(inputTbl)-ROW(inputTbl[#Headers]),ROWS($1:1))),"")
票数 3
EN

Stack Overflow用户

发布于 2019-06-21 02:39:43

您可以将值加载到字典中,并将键的值设置为false,检查键是否存在,如果存在,则将值更改为true。遍历字典并仅转储为false的键。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-06-21 03:37:59

好了,这里有一个宏用来实际执行删除操作,或者至少让您开始:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56691284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档