#excel
#excel
Вопрос:
У меня есть один документ Excel с двумя столбцами данных. Первый столбец с 19 тыс. строк данных и второй столбец с 2 тыс. строк данных. Все данные во 2-м столбце существуют в 1-м столбце. Я хочу удалить все строки в 1-м столбце, которые содержат данные из 2-го столбца. Есть ли способ, как это сделать?> Заранее спасибо, Laziale
Комментарии:
1. Есть ли большое количество различных значений во втором столбце? Например, говорим ли мы о 4, 40, 400 или 4000 различных значениях второго столбца?
Ответ №1:
Этот код будет работать через столбец A и удалит любую строку, значение которой отображается в любой строке столбца B. Предполагается, что значения столбцов A и B начинаются в строке 1:
Sub RemoveDuplicates()
Dim colB As Variant, iRow As Long
colB = Range("B1:B2000") //Add you reference for column B
For iRow = Range("A1").End(xlDown).Row To 1 Step -1
If Not IsError(Application.Match(Cells(iRow, 1), colB, 0)) Then
Cells(iRow, 1).EntireRow.Delete
End If
Next iRow
End Sub
Комментарии:
1. Как у вас есть, вы изменяете список, по которому вы проверяете значения в столбце A, также удаляя значения из столбца B. Я думаю, @Laziale действительно хочет, чтобы ячейки в столбце A были удалены (сохраняя столбец B), а не целые строки.
2. @Excelllll — хотя в OP явно не указано, что, если это так, это легко исправить путем удаления
EntireRow
. Давайте посмотрим, вернется ли OP с некоторыми собственными комментариями.3. Я пытался указать, что в некоторых случаях ваша логика не выполнит свою работу. Например, если столбец A содержит {a, b, c, d, e, f}, а столбец B содержит {f, e, d, c, b, a}, все строки должны быть удалены. Однако в вашем коде останутся 3 верхние строки.
4. @Excellll — вы правы. Я обновил код для чтения столбца B в виде массива, чтобы ссылки были статическими. Проверил ваш пример, и теперь он удаляет все строки. Tnanks много.
Ответ №2:
Вероятно, это намного проще сделать с помощью grep:
Экспортируйте каждый столбец в файл и выполните «grep -v». Вот пример:
$ cat col1.txt
A
B
C
D
$ cat col2.txt
B
D
$ grep -v -f col2.txt col1.txt
A
C
Ответ №3:
Использование VBA, вероятно, самый простой способ сделать это. Попробуйте следующий макрос. Это приведет к удалению всех ячеек в столбце A, которые соответствуют любым значениям в столбце B. Если вам нужно сделать это для других столбцов, просто измените код, чтобы он соответствовал дизайну вашей книги.
Sub removematches()
Dim firstcolumn() As Variant
Dim colA As Range
Dim colB As Range
Dim i As Long, del As Long
'This will set the ranges to look in. Note that this will only work for data with no blank cells. If you have blank cells, you can change these Set statements to the following:
' Set colA = Range("A1:A100") if you have 100 rows you want to look at.
Set colA = Range("A1", Range("A1").End(xlDown))
Set colB = Range("B1", Range("B1").End(xlDown))
firstcolumn = colA
ReDim Preserve firstcolumn(1 To UBound(firstcolumn), 1 To 2) As Variant
i = 1
del = 0
Do While i <= UBound(firstcolumn)
firstcolumn(i, 2) = Application.WorksheetFunction.CountIf(colB, firstcolumn(i, 1))
If firstcolumn(i, 2) > 0 Then
Range("A1").Offset(i - del - 1, 0).Delete Shift:=xlUp
del = del 1
End If
i = i 1
Loop
End Sub