2013-03-28 2 views
0

У меня есть 2 списка, каждый на своем листе.Excel - список поиска в 2 списках

Моя цель - поиск каждой ячейки второго листа в каждой ячейке первого листа и удаление всей строки первого листа, если оно было найдено.

Содержимое ячейки не обязательно одно и то же, это может быть только строка.

Например, одна из ячеек на листе 2 является «строкой», но если одна из ячеек в первом листе является «подстрокой», она должна удалить всю строку первого листа.

Как подойти к нему через VBA?

Спасибо!

ответ

1

Try ниже код:

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 

enter image description here

+0

Спасибо, он отлично работает! – tracer

+0

работает, но неэффективно, заставляя сравнения 1: 1, когда эта работа не нужна :) –

+0

Да, это правда. проанализируйте строки + 25k, но он сделал это. Я также попрошу ваше решение (спасибо! – tracer

1

Если это операция «одного выстрела», сделайте «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 
+1

Это не решает проблему частичного совпадения. Вам нужно будет переписать формулу с помощью функции 'Instr()', например 'If Instr (1, листы (« sheet1 »). Диапазон (« A »& i). Значение, листы (« лист2 »). Range («A» & j) .Value, vbBinaryCompare)> 0 Then ... ', минимально, чтобы использовать этот подход. –

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 
+1

+1 Это сработало. Только одно примечание при использовании End (xlDown) должно быть осторожным, как если бы это диапазон содержит пустые ячейки, вы не получите все данные. Лучше подойти к поиску последней строки столбца, чтобы использовать Ячейки (rows.count, column) .End (xlUp) .row –

+0

yep, my 'xlDown', по общему признанию, неаккуратно. Обновлено с еще лучшим методом :) –

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 
Смежные вопросы