Excel-在2个列表中搜索列表

Excel-在2个列表中搜索列表,excel,excel-2007,excel-formula,excel-2010,vba,Excel,Excel 2007,Excel Formula,Excel 2010,Vba,我有两张清单,每一张都在自己的纸上 我的目标是在第一张表格的每个单元格上搜索第二张表格的每个单元格,如果找到第一张表格的整行,则删除它 单元格的内容不一定相同,它只能是字符串 例如,工作表2中的一个单元格为“字符串”,但如果第一个工作表中的一个单元格为“子字符串”,则应删除第一个工作表的整行 我应该如何通过VBA实现它 谢谢大家! 如果是“一次性”操作,请执行“VLOOKUP”并使用过滤器删除找到的字符串 在VBA中,使用以下方法执行此操作: for i = 1 to 65535 for

我有两张清单,每一张都在自己的纸上

我的目标是在第一张表格的每个单元格上搜索第二张表格的每个单元格,如果找到第一张表格的整行,则删除它

单元格的内容不一定相同,它只能是字符串

例如,工作表2中的一个单元格为“字符串”,但如果第一个工作表中的一个单元格为“子字符串”,则应删除第一个工作表的整行

我应该如何通过VBA实现它

谢谢大家!

如果是“一次性”操作,请执行“VLOOKUP”并使用过滤器删除找到的字符串

在VBA中,使用以下方法执行此操作:

for i = 1 to 65535
    for j = 1 to 65535 
        if sheets("sheet1").range("A" & i).value = sheets("sheet2").range("A" & j).value then
              sheets("sheet1").range("A" & i).EntireRow.Delete
        end if
    next j
next i
如果是“一次性”操作,则执行“VLOOKUP”并使用过滤器删除找到的字符串

在VBA中,使用以下方法执行此操作:

for i = 1 to 65535
    for j = 1 to 65535 
        if sheets("sheet1").range("A" & i).value = sheets("sheet2").range("A" & j).value then
              sheets("sheet1").range("A" & i).EntireRow.Delete
        end if
    next j
next i

对于表2中列中的每个单元格,请在表1的列中查找部分匹配项。如果存在匹配项,则删除整行,然后重复,直到找不到匹配项

这假设您的列表在每张工作表上按1列组织

Sub InCellDeDupe()

Dim sh1 As Worksheet
Dim sh2 As Worksheet

Dim rng1 As Range
Dim rng2 As Range
Dim foundRow As Range

Dim r As Long
Dim cl As Range
Dim str As String

Set sh1 = Worksheets("Sheet 1") '<-- modify as needed
Set sh2 = Worksheets("Sheet 2") '<-- modify as needed

Set rng1 = sh1.UsedRange.Columns(1) '<-- modify as needed
Set rng2 = sh2.UsedRange.Columns(1) '<-- modify as needed

For Each cl In rng2
    str = cl.Value

    Do
        Set foundRow = rng1.Find(What:=str, After:=rng1.Cells(1, 1), LookIn:=xlValues, _
            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)

            If Not foundRow Is Nothing Then
                foundRow.EntireRow.Delete
            Else:
                Exit Do
            End If
    Loop
Next
End Sub
Sub-incelldeplicate()
Dim sh1作为工作表
Dim sh2 As工作表
变暗rng1 As范围
变暗rng2 As范围
作为范围的Dim foundRow
变暗,变长
Dim cl As范围
作为字符串的Dim str

设置sh1=工作表(“表1”)”对于表2中列中的每个单元格,在表1的列中查找部分匹配。如果存在匹配项,则删除整行,然后重复,直到找不到匹配项

这假设您的列表在每张工作表上按1列组织

Sub InCellDeDupe()

Dim sh1 As Worksheet
Dim sh2 As Worksheet

Dim rng1 As Range
Dim rng2 As Range
Dim foundRow As Range

Dim r As Long
Dim cl As Range
Dim str As String

Set sh1 = Worksheets("Sheet 1") '<-- modify as needed
Set sh2 = Worksheets("Sheet 2") '<-- modify as needed

Set rng1 = sh1.UsedRange.Columns(1) '<-- modify as needed
Set rng2 = sh2.UsedRange.Columns(1) '<-- modify as needed

For Each cl In rng2
    str = cl.Value

    Do
        Set foundRow = rng1.Find(What:=str, After:=rng1.Cells(1, 1), LookIn:=xlValues, _
            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)

            If Not foundRow Is Nothing Then
                foundRow.EntireRow.Delete
            Else:
                Exit Do
            End If
    Loop
Next
End Sub
Sub-incelldeplicate()
Dim sh1作为工作表
Dim sh2 As工作表
变暗rng1 As范围
变暗rng2 As范围
作为范围的Dim foundRow
变暗,变长
Dim cl As范围
作为字符串的Dim str

Set sh1=Worksheets(“Sheet 1”)”mansuetus提出的方法将非常缓慢,因为它将必须迭代所有65k行65k次,并且不会找到任何子字符串

为了提高性能,您应该动态查找数据的长度并保存该长度。 至于查找子字符串的问题,您可以使用以下内容:

  If FullCellString = LookupStr Then
        'Match found - delete row
    Else
        If InStr(1, FullCellString, LookupStr, vbTextCompare) > 0 Then
            'Match found in substring delete row
        End If
    End If

mansuetus提出的方法将非常缓慢,因为它将必须迭代所有65k行65k次,并且不会找到任何子字符串

为了提高性能,您应该动态查找数据的长度并保存该长度。 至于查找子字符串的问题,您可以使用以下内容:

  If FullCellString = LookupStr Then
        'Match found - delete row
    Else
        If InStr(1, FullCellString, LookupStr, vbTextCompare) > 0 Then
            'Match found in substring delete row
        End If
    End If
请尝试以下代码:

Sub sample()
    Dim lastRowSheet1 As Long, lastRowSheet2 As Long, rng As Range, r As Range, i As Integer, j As Integer
    lastRowSheet2 = Sheets("Sheet2").Range("A65000").End(xlUp).Row    ' total row sheet 2
    lastRowSheet1 = Sheets("Sheet1").Range("A65000").End(xlUp).Row  ' total row sheet 1

    For j = 1 To lastRowSheet2        'loop thru every cell of sheet 2
        For i = 1 To lastRowSheet1    ' loop thru every cell of sheet 1
            If InStr(1, Sheets("Sheet1").Cells(i, 1).Value, Sheets("Sheet2").Cells(j, 1).Value) > 0 Then
                Sheets("Sheet1").Cells(i, 1).EntireRow.Delete
                Exit For
            End If
        Next
    Next
End Sub
请尝试以下代码:

Sub sample()
    Dim lastRowSheet1 As Long, lastRowSheet2 As Long, rng As Range, r As Range, i As Integer, j As Integer
    lastRowSheet2 = Sheets("Sheet2").Range("A65000").End(xlUp).Row    ' total row sheet 2
    lastRowSheet1 = Sheets("Sheet1").Range("A65000").End(xlUp).Row  ' total row sheet 1

    For j = 1 To lastRowSheet2        'loop thru every cell of sheet 2
        For i = 1 To lastRowSheet1    ' loop thru every cell of sheet 1
            If InStr(1, Sheets("Sheet1").Cells(i, 1).Value, Sheets("Sheet2").Cells(j, 1).Value) > 0 Then
                Sheets("Sheet1").Cells(i, 1).EntireRow.Delete
                Exit For
            End If
        Next
    Next
End Sub

这并不能解决部分匹配的问题。您必须使用
Instr()
函数重新编写公式,例如,
如果Instr(1,sheets(“sheet1”).Range(“A”和i).Value,sheets(“sheet2”).Range(“A”和j).Value,vbBinaryCompare)>0然后…
,最低限度地使用此方法。这并不能解决部分匹配的问题。您必须使用
Instr()
函数重新编写公式,例如,
如果Instr(1,sheets(“sheet1”).Range(“a”&i).Value,sheets(“sheet2”).Range(“a”&j).Value,vbBinaryCompare)>0,然后…
,最低限度地,使用这种方法,+1就行了。使用End(xlDown)时请注意,如果该区域包含空单元格,则无法获取所有数据。查找列的最后一行的更好方法是使用单元格(rows.count,column).End(xlUp).rowyep,my
xlDown
无疑是草率的。用更好的方法升级:)+1就行了。使用End(xlDown)时请注意,如果该区域包含空单元格,则无法获取所有数据。查找列的最后一行的更好方法是使用单元格(rows.count,column).End(xlUp).rowyep,my
xlDown
无疑是草率的。使用更好的方法升级:)它可以工作,但效率低下,在不需要那么多工作的情况下强制进行1:1比较:)是的,这是真的。解析+25k行需要一段时间,但它做到了。我还将尝试一下您的解决方案(:谢谢!它有效,但效率低下,在不需要那么多工作的情况下强制进行1:1比较:)是的,这是真的。解析+25k行需要一段时间,但它做到了。我也会尝试一下你的解决方案(:谢谢!