Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 比较列表和删除重复项_Vba_Excel - Fatal编程技术网

Vba 比较列表和删除重复项

Vba 比较列表和删除重复项,vba,excel,Vba,Excel,我一直在使用以下公式来测试一列中的单个条目是否存在于第二列中: =COUNTIF($E$1:$E$99504,$I1)>0 我想做的是,如果上述公式的计算结果为真,则从第二列中删除重复条目(即E1-E99504范围中的重复条目),并将该条目的单元格上移。我相信,除了细胞转移,这可以在没有VBA的情况下完成 然而,在这个特殊的例子中,我有5列要比较,将来可能会比较多。因此,我试图确定一种使用VBA在多个列上执行上述操作的方法。否则,我将需要运行相同的过程10次,我真的觉得有一个更有效的方法

我一直在使用以下公式来测试一列中的单个条目是否存在于第二列中:

=COUNTIF($E$1:$E$99504,$I1)>0
我想做的是,如果上述公式的计算结果为真,则从第二列中删除重复条目(即E1-E99504范围中的重复条目),并将该条目的单元格上移。我相信,除了细胞转移,这可以在没有VBA的情况下完成

然而,在这个特殊的例子中,我有5列要比较,将来可能会比较多。因此,我试图确定一种使用VBA在多个列上执行上述操作的方法。否则,我将需要运行相同的过程10次,我真的觉得有一个更有效的方法,我应该学习。比较的层次结构如下所示:


假设我们有A、B、C、D、E列。将A与B、C、D进行比较,其中每次都会删除未固定列中的重复项,而保留A中的条目。然后B被固定,以相同的方式在C、D和E之间移动,并且再次保留B中的条目。类似地,直到将D与E进行比较且过程完成。有人已经做了这样的算法吗?任何帮助都将不胜感激

使用纯VBA解决方案并假设您的数据如下所示:

我建议向后工作,因为我们正在删除和移动数据。请尝试以下代码:

Sub removeDuplicates()
    Dim lastCol As Integer
    lastCol = 5    'col 5 is column E

    Dim wks As Worksheet
    Set wks = Worksheets("Sheet1")

    Dim searchRange As Range
    Set searchRange = wks.Range("A1:A" & wks.Cells(Rows.Count, "A").End(xlUp).Row)

    Dim compareArray As Variant
    Dim searchArray As Variant

    'Get all values from Col A to search against
    compareArray = searchRange.Value

    For col = lastCol - 1 To 1 Step -1
        'Set values to search for matches
        searchArray = searchRange.Offset(0, col - 1).Value

        'Set values to last column to compare against
        compareArray = searchRange.Offset(0, col).Value

        For i = 1 To UBound(compareArray)
            If compareArray(i, 1) = searchArray(i, 1) Then
                'Match found, delete and shift left
                Cells(i, col).Delete Shift:=xlToLeft
            End If
        Next i
    Next col
End Sub

结果:



确保更新工作表名称、范围和最后一列编号以符合您的条件。

删除单元格可能需要VBA您可以通过列出要比较的列,在工作簿中创建一些元数据,并将VBA代码指向该列表。在代码中,您可以一次在任何列中搜索重复项,并避免在工作表中循环x次(x=要比较的列数)。您还可以创建一个只向上看的countif(在本例中,
countif($E$1:$E1,$I1)>0
)。如果对所有x列执行此操作并取最大值,则可以对其进行筛选并删除所有违反规则的筛选行…@K_B您能详细说明您的意思吗?这非常有用,我唯一的问题是为什么在删除重复项后会发生移位。这会不会给列中引入以前不存在的元素?理想情况下,我只需要删除元素,并通过向上移动空白下方的单元格来消除空白。当我思考它时,我怀疑原因是我的描述太模糊了。我根据描述假设每一行都是它自己的重要数据集。因此,代码只能逐行匹配、删除和移动数据。现在,行与行之间没有逻辑。如果我理解正确,那就需要另一个循环。如果您需要更多帮助,请编辑您的帖子,在快照之前和之后添加一个示例。我认为我们在同一页上,唯一的区别是每一列都是它自己的重要数据集。然而,我突然想到,我可以很容易地转置每一列,只要我正确理解宏,这将非常有效。我的另一个想法是,我可以将Shift:xlToLeft语句更改为Shift:xlUp,但如果代码的其余部分采用基于行的字段,则可能会出现问题。再次感谢您的帮助!编辑:进一步检查后,搜索范围似乎是基于所需的列,因此我可能不清楚使用的过程。您必须翻转循环以从下到上移动,以便向上移动,否则VBA将不知道下一个单元格移动到上一个位置时要做什么(这就是我当前从右到左循环的原因)。听起来你很明白。如果您的内容与答案一致,请标记为已接受。谢谢