我有一张3张excel工作簿。这些表都包含名称列表,所有列表在某些点重叠,因为它们来自不同的来源。
我试图让表1成为一个独特的列表,即。 a,它只包含sheet2和sheet3中不存在的名称。
我被指向使用数据的方向>删除重复项,但这不是跨表,有没有办法可以使用vba宏完成?
答案 0 :(得分:2)
你可以在Sheet 1
中使用VLOOKUP
的表格旁边的几列,将column D
用于表格2和3 - 如果找到匹配则应该返回1,否则为0.登记/>
然后一个excel例程只扫描这两个列1 - 如果它找到一个然后删除该行。
这是我正在谈论的公式的一个例子:
假设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 3
和array
中的所有名称加载到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}}
警告 我需要强调的是,这些循环并不完美:任何编码的一般最佳实践是,在从同一阵列上执行操作时,不应该循环遍历数组在那个循环中.....我希望有人能帮助我解决这个问题。