Excel – 2列表中的search列表

我有两个名单,每个都在自己的工作表上。

我的目标是search第一张纸的每个单元格上的第二张纸的每个单元格,并删除第一张纸的整个行(如果已find)。

单元格的内容不一定相同,只能是一个string。

例如,工作表2中的一个单元格是“string”,但是如果第一个工作表中的单元格之一是“substring”,则应该删除第一个工作表的整个行。

我应该如何通过VBA来处理它?

谢谢!

尝试下面的代码:

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 

在这里输入图像说明

如果是“一次性”操作,请执行“VLOOKUP”并使用filter删除find的string。

在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 

mansuetus提出的方法将非常慢,因为它将不得不遍历所有65k行65k次,它不会find任何子string。

为了提高性能,您应该dynamic查找数据的长度并保存。 至于查找子string的问题,你可以使用类似的东西:

  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 

对于Sheet2中列中的每个单元格,在表格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