Удаление строк на основе повторяющихся ячеек и содержимого второго столбца (VBA)
У меня есть некоторые проблемы с удалением повторяющихся строк, так как способ, которым я должен это сделать, довольно сложен. Позвольте мне объяснить.
Вот что у меня есть (на самом деле у меня более 90 000 строк!)
+-----------+------------------+
| Ref | Sup |
+-----------+------------------+
| 10000-001 | S_LA_LLZ_INOR |
| 10000-001 | S_LA_RADAR_STNFN |
| 10000-001 | S_LA_VOR_LRO |
| 10000-001 | S_LA_DME_LRO |
| 10000-001 | S_LA_DME_INOR |
| 1000-001 | S_LA_GP_INOR |
| 1000-001 | S_LA_LLZ_ITF |
| 1000-001 | S_ZS_LLZ_ITF |
| 1000-002 | S_LA_GP_INOR |
| 1000-002 | S_LA_LLZ_ITF |
+-----------+------------------+
Что мне нужно сделать, так это поиск дубликатов в столбце А. Затем я должен проверить в столбце B, совпадают ли цепочки символов после S_LA_ или S_ZS_. Если они одинаковы. Я должен удалить строку с S_LA_
Итак, в строках выше я должен был бы удалить строку с 1000-001|S_LA_LLZ_ITF.
Я написал код. Это работает, но это болезненно медленно при работе с 10 000 + строк.
Dim LastRowcheck As Long
Dim str1 As String
Dim str2 As String
Dim str3 As String
Dim str4 As String
Dim str5 As String
Dim str6 As String
Dim prueba As Integer
Dim prueba1 As Integer
Dim n1 As Long
Dim n3 As Long
Dim colNum As Integer
Dim colNum1 As Integer
Dim iCntr As Long
colNum = WorksheetFunction.Match("Ref", ActiveSheet.Range("1:1"), 0)
colNum1 = WorksheetFunction.Match("Sup",ActiveSheet.Range("1:1"), 0)
With ActiveSheet
LastRowcheck = .Range("A" & .Rows.Count).End(xlUp).Row
For n1 = 2 To LastRowcheck
str1 = Cells(n1, colNum).Value
For n3 = n1 + 1 To LastRowcheck + 1
str2 = Cells(n3, colNum).Value
prueba = StrComp(num1, num2)
If prueba = 0 Then
str3 = Cells(n1, colNum1).Value
str4 = Cells(n3, colNum1).Value
str5 = Right(str3, Len(str3) - 5)
str6 = Right(str4, Len(str4) - 5)
prueba1 = StrComp(str5, str6)
If prueba1 = 0 Then
If StrComp(num3, num4) = 1 Then
Cells(n3, colNum).Interior.ColorIndex = 3
ElseIf StrComp(num3, num4) = -1 Then
Cells(n1, colNum).Interior.ColorIndex = 3
End If
End If
End If
Next n3
Next n1
For iCntr = LastRowcheck To 2 Step -1
If Cells(iCntr, colNum).Interior.ColorIndex = 3 Then
Rows(iCntr).Delete
End If
Next iCntr
End With
Я был бы признателен за любую помощь или руководство, которое вы могли бы мне дать.
2 ответов:
Я думаю, что это почти там - убедитесь, что сделать резервную копию ваших данных перед запуском asthis будет перезаписать данные
Sub test() Dim IN_arr() Dim OUT_arr() IN_arr = ActiveSheet.UsedRange.Value2 Count = 1 ReDim OUT_arr(UBound(IN_arr, 2) - 1, Count) Found = 1 For i = 1 To UBound(IN_arr, 1) Found = 1 For c = 1 To UBound(IN_arr, 1) Comp1 = Right(IN_arr(i, 2), Len(IN_arr(i, 2)) - InStr(1, IN_arr(i, 2), "S_LA") - 3) 'Compare last section Comp2 = Right(IN_arr(c, 2), Len(IN_arr(c, 2)) - InStr(1, IN_arr(c, 2), "S_ZS") - 3) Comp3 = IN_arr(i, 1) 'Compare first section Comp4 = IN_arr(c, 1) If Comp1 = Comp2 And i <> c And Comp3 = Comp4 Then Found = 0 End If Next If Found = 0 Then 'do not keep row Else 'keep row If OUT_arr(UBound(IN_arr, 2) - 1, Count - 1) <> "" Then Count = Count + 1 ReDim Preserve OUT_arr(UBound(IN_arr, 2) - 1, Count) End If For cols = 0 To UBound(IN_arr, 2) - 1 OUT_arr(cols, Count - 1) = IN_arr(i, cols + 1) Next End If Next ActiveSheet.UsedRange.ClearContents ActiveSheet.Range("A1").Resize(Count, UBound(OUT_arr, 1) + 1).Value = Application.Transpose(OUT_arr) End SubПожалуйста, обратите внимание, что внесены некоторые небольшие изменения в код
Решение без VBA: Вставить новую колонку C Предполагая, что данные начинаются в строке 1, в поле C1 введите:
=CONCATENATE(A1,MID(B1,5,LEN(B1)-4))Скопируйте формулу в столбец C. Затем используйте команду удалить дубликаты feaure, настроенную на столбец C.
Comments