从主工作表中删除ununique实例

时间:2012-12-22 12:55:43

标签: excel vba

我有一张3张excel工作簿。这些表都包含名称列表,所有列表在某些点重叠,因为它们来自不同的来源。

我试图让表1成为一个独特的列表,即。 a,它只包含sheet2和sheet3中不存在的名称。

我被指向使用数据的方向>删除重复项,但这不是跨表,有没有办法可以使用vba宏完成?

1 个答案:

答案 0 :(得分:2)

你可以在Sheet 1中使用VLOOKUP的表格旁边的几列,将column D用于表格2和3 - 如果找到匹配则应该返回1,否则为0.登记/> 然后一个excel例程只扫描这两个列1 - 如果它找到一个然后删除该行。

这是我正在谈论的公式的一个例子:

enter image description here

假设B只是C>0的总和。

然后,宏可以向下运行D列,查找Option Explicit Sub deleteRows() Dim i As Integer i = 2 Do If Cells(i, 4) > 0 Then Cells(i, 4).EntireRow.Delete xlUp Else i = i + 1 End If Loop Until IsEmpty(Cells(i, 4)) = True End Sub

的任何值

对于在循环中对集合执行操作不是最佳实践,但是类似于以下内容循环删除行中的行:

sheet 2

另一种方法是将sheet 3array中的所有名称加载到sheet 1。然后回到column A并且如果每个名称等于任何值并且是否删除整个数组,则每个名称都会运行数组测试。所以要使用数组,它将类似于以下内容;这假设每个列表都在row 2,并从Sub Macro1() Dim names() As String Dim i As Integer i = 1 'add names from sheet 2 into the array Do ReDim Preserve names(i) names(i) = ThisWorkbook.Worksheets("Sheet2").Cells(i + 1, 1) i = i + 1 Loop Until IsEmpty(ThisWorkbook.Worksheets("Sheet2").Cells(i + 1, 1)) = True 'add names from sheet 3 into the array Do ReDim Preserve names(i) names(i) = ThisWorkbook.Worksheets("Sheet3").Cells(i + 1, 1) i = i + 1 Loop Until IsEmpty(ThisWorkbook.Worksheets("Sheet3").Cells(i + 1, 1)) = True 'use the names array to test each row in sheet 1 Dim j As Integer j = 2 Do Dim deleteOccured As Boolean deleteOccured = False Dim x For Each x In names If x = Cells(j, 1) Then Cells(j, 1).EntireRow.Delete xlUp deleteOccured = True End If Next x If deleteOccured = False Then j = j + 1 End If deleteOccured = False Loop Until IsEmpty(Cells(j, 1)) = True End Sub ...

开始
{{1}}

警告 我需要强调的是,这些循环并不完美:任何编码的一般最佳实践是,在从同一阵列上执行操作时,不应该循环遍历数组在那个循环中.....我希望有人能帮助我解决这个问题。