交易集示例:
请注意显示的 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",""))
问题是这也会导致我的电脑崩溃。我如何才能有效地找到重复项并删除它们而不删除第三行?
第二个解决方案示例:
答案1
这似乎适用于小数据集。尝试一下并根据需要进行调整。我用反转消息标记单元格 F。
这将查找 C 列,直到找到一个空单元格。如果有空单元格,则需要调整 Do Until 循环。
我正在跳过之前已标记的单元格(不是空单元格 F)
请注意,它只会将 1 个单元格标记为匹配。
Sub FlagReversals()
Dim MyExit As String
Dim PosLoc
Dim NegLoc
Dim NegAmt
Dim PosAmt
Range("C2").Select
Do Until IsEmpty(ActiveCell)
If ActiveCell.Value < 0 And IsEmpty(ActiveCell.Offset(0, 3).Value) Then
NegLoc = ActiveCell.Address
Acct = ActiveCell.Offset(0, -2)
NegAmt = ActiveCell.Value
PosAmt = Abs(ActiveCell.Value)
MyExit = "False"
Do Until MyExit = "True"
If ActiveCell.Offset(-1, 0).Row > 1 Then
ActiveCell.Offset(-1, 0).Select
Else
Range(NegLoc).Select
ActiveCell.Offset(1, 0).Select
MyExit = "True"
End If
If Acct = ActiveCell.Offset(0, -2) And IsEmpty(ActiveCell.Offset(0, 3).Value) And MyExit = "False" Then
If PosAmt = ActiveCell.Value Then
' found the match (by account and value)
ActiveCell.Offset(0, 3).Value = "Reversal from address " & NegLoc
PosLoc = ActiveCell.Address
Range(NegLoc).Select
ActiveCell.Offset(0, 3).Value = "Reversal from address " & PosLoc
MyExit = "True"
End If
End If
Loop
End If
ActiveCell.Offset(1, 0).Select
Loop
End Sub
编辑:当未找到匹配项时清理无限循环。