Beliebt

L├Âschen doppelter Transaktionen - VBA oder Funktion - Microsoft Excel, Worksheet-Funktion, VBA, Microsoft Excel-2016

Beispiel f├╝r ein Transaktionsset:

Beispiel f├╝r ein Transaktionsset

Beachten Sie die 3 angezeigten Transaktionen. Die beiden gr├╝n hervorgehobenen Transaktionen sind diejenigen, die ich l├Âschen oder kennzeichnen m├Âchte (spielt keine Rolle).

Mit VBA ist der Code viel zu klobig. Der Code braucht ewig, um da zu laufen

  1. Ich durchlaufe jede Transaktion in Spalte C, bis ich ein Negativ finde.
  2. Spalte E als Absolutwertziel festlegen, wenn nicht Null, sonst Absolutwert D.
  3. Definieren Sie den Bereich f├╝r ein bestimmtes Konto, damit ich mit dem Durchlaufen beginnen kann, um in Schritt 2 einen Wert zu finden.
  4. Wenn ich den Wert finde, l├Âsche ich beide Zeilen (eine, die ein Negativ enth├Ąlt, und die andere, die kein Negativ ist).

Ich entschuldige mich daf├╝r, dass ich Code nicht kommentiere. Dies war noch nicht zu 100% erledigt.

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

Also habe ich beschlossen, eine Funktion zu schreiben, um zu sehen, ob sie schneller ist.

  1. Spalte F: ├ťberpr├╝fen Sie, ob die Transaktion negativ ist. Wenn ja, erstellen Sie einen Schl├╝ssel mit der Kontonummer abs (Spalte D), abs (Spalte E). =IF((C91<0),A91&ABS(D91)&ABS(E91))
  2. Spalte G: Erstellen Sie eine Schl├╝sselkontonummer, Spalte D, Spalte E. =A91&D91&E91
  3. Spalte H: Pr├╝fen Sie mit, ob Spalte F innerhalb von G existiert Match. =IFERROR(MATCH(F91,$G$1:G91,0),FALSE)
  4. Spalte I: ├ťberpr├╝fen Sie, ob die tats├Ąchliche Zellenzeile mit der Spalte H ab Schritt ├╝bereinstimmt. =IFERROR(MATCH(ROW(H91),H:H,0),FALSE)
  5. Spalte J: ├ťberpr├╝fen Sie, ob H oder ich Nummer sind (MATCH Wenn dies der Fall ist, werden sie als Stornierungen gekennzeichnet und k├Ânnen vom Benutzer gel├Âscht werden. =IF(OR(ISNUMBER(H91),ISNUMBER(I91)),"Reversal",IF(C91=0,"Zero",""))

Das Problem ist, dass auch dies meinen Computer zum Absturz bringt. Wie kann ich Duplikate effektiv finden und entfernen, ohne die dritte Zeile zu entfernen?

Zweite L├Âsungsprobe:

Zweite L├Âsungsprobe

Antworten:

1 f├╝r Antwort Ôäľ 1

Dies scheint mit einem kleinen Datensatz zu funktionieren. Probieren Sie es aus und passen Sie es nach Bedarf an. Ich markiere Zelle F mit einer Umkehrnachricht.

Das durchsucht Spalte C, bis es eine leere Zelle findet. Wenn Sie leere Zellen haben, m├╝ssen Sie die Do Until-Schleife anpassen.

Ich ├╝berspringe Zellen, die zuvor markiert wurden (nicht leere Zelle F)

Beachten Sie, dass nur 1 Zelle als ├╝bereinstimmend markiert wird.

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

Bearbeiten: Endlosschleife aufger├Ąumt, wenn keine ├ťbereinstimmung gefunden wurde.