Удаление строк на основе повторяющихся ячеек и содержимого второго столбца (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


Я был бы признателен за любую помощь или руководство, которое вы могли бы мне дать.
700   2  

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

    Ничего не найдено.