Пример набора транзакций:
Обратите внимание на 3 показанные транзакции. Две транзакции, выделенные зеленым цветом, - это те, которые я хотел бы удалить или пометить (не имеет значения).
Используя VBA, код слишком неуклюжий. Код работает вечно, потому что
- Я перебираю каждую транзакцию в столбце C, пока не найду отрицательный результат.
- Установите столбец E в качестве цели абсолютного значения, если не ноль, иначе абсолютное значение D.
- Определите диапазон для конкретной учетной записи, чтобы я мог начать цикл по ней, чтобы найти значение на шаге 2.
- Если я нахожу значение, я удаляю обе строки (одну, содержащую отрицательный, и одну, которая не является отрицательной).
Мои извинения за не комментирование кода. Это еще не было сделано на 100%.
Sub ReversalScrub()
Dim AccountNumber As String
Dim TargetAmount As Double
Dim TargetRange As Range
Dim Transactions As Range
Dim Transaction As Variant
Dim DeletionCount As Integer
Set RawTransactions = Worksheets("RawTransactions")
With RawTransactions
Set Transactions = .Range("C1", .Range("C2").End(xlDown))
End With
TransactionRow = 2
Do Until TransactionRow = Transactions.Rows.Count
If Range("C" & TransactionRow).Value < 0 Then
If Range("C" & TransactionRow).Offset(0, 2).Value < 0 Then
TargetAmount = Abs(Range("C" & TransactionRow).Offset(0, 2).Value)
Else
TargetAmount = Abs(Range("C" & TransactionRow).Offset(0, 1).Value)
End If
AccountNumber = Range("C" & TransactionRow).Offset(0, -2).Value
Set TargetRange = GetAccountRange(AccountNumber, RawTransactions)
CurrentRow = TargetRange.Row
Do Until CurrentRow = TargetRange.Rows.Count - 1
If (TargetAmount = Range("E" & CurrentRow).Value Or TargetAmount = Range("D" & CurrentRow).Value) Then
Range("A" & CurrentRow).EntireRow.Delete
Range("C" & TransactionRow).EntireRow.Delete
CurrentRow = CurrentRow - 2
Exit Do
End If
CurrentRow = CurrentRow + 1
Loop
End If
TransactionRow = TransactionRow + 1
Loop
End Sub
Тогда я решил написать функцию, чтобы увидеть, будет ли она быстрее.
- Столбец F: проверьте, является ли транзакция отрицательной. Если это так, создайте ключ, используя номер счета, abs(столбец D), abs(столбец E).
=IF((C91<0),A91&ABS(D91)&ABS(E91))
- Столбец G: Создайте номер ключевого счета, столбец D, столбец E.
=A91&D91&E91
- Столбец H: Проверьте, существует ли столбец F в G, используя
Match
.=IFERROR(MATCH(F91,$G$1:G91,0),FALSE)
- Столбец I: Проверьте, соответствует ли фактическая строка ячейки столбцу H из шага.
=IFERROR(MATCH(ROW(H91),H:H,0),FALSE)
- Столбец J: Проверьте, является ли H или I числом (вывод
MATCH
), если это так, они помечаются как отмены, и пользователь может удалить их.=IF(OR(ISNUMBER(H91),ISNUMBER(I91)),"Reversal",IF(C91=0,"Zero",""))
Проблема в том, что это тоже сбивает мой компьютер. Как я могу эффективно найти дубликаты и удалить их, не удаляя третий ряд?
Второй образец раствора: