考虑到多种情况,如何将一列中的单元格与另一列中的单元格匹配?

时间:2013-06-05 13:00:14

标签: excel vba excel-vba comparison

我希望将我的每日销售存款交易记录(多个分行中的多个存款)与我在线下载的银行帐户交易历史记录相匹配。此表的目的是验证销售存款是否确实存入我的帐户。

A到C列中的单元格是从在线银行对帐单中“复制并粘贴”的,而D到F列中的单元格是由另一个工作人员制作的单独的Excel文件“复制并粘贴”的。

Transaction date(A1) | Transaction Type(B1) | Amount(C1) | Sales Date (D1) | Source(E1)   | Date Deposited (F1) | Amount(G1)   
6-3-13(A2)           | Cash Deposit(B2)     | $20(C2)    | 6-2-13(D2)      | Branch 1(E2) | 6-3-13(F2)          | $60(G2)  
6-3-13(A3)           | Check Deposit(B3)    | $50(C3)    | 6-2-13(D3)      | Branch 2(E3) | 6-3-13(F3)          | $20(G3)  
6-3-13(A4)           | Cash Deposit(B4)     | $60(C4)    | 6-3-13(D4)      | Branch 1(E4) | 6-3-13(F4)          | $80(G4)  
6-3-13(A5)           | Cash Withdrawal (B5) | $80(C5)    | 6-3-13(D5)      | Branch 2(E5) | 6-3-13(F5)          | $50(G5)  
(blank) (A6)         | (blank)(B6)          | (blank)(C6)| 6-3-13(D6)      | Branch3(E6)  | 6-3-13(F6)          | $50(G6)

由于在细胞C2至C6中发现细胞G2,因此H2应该说“沉积”。 G3和G5也是如此。另一方面,G4和G6在银行的交易历史中找不到,因此,它应该在H4和H6中说“MISSING”。
请注意,仅当A = F且B =现金或支票存款时,才应比较G列和C列。由于B5表示交易是退出,因此不计算C5。

2 个答案:

答案 0 :(得分:0)

这是一个冗长但有希望可读的实现:

Sub check()
    Dim bankRange As Range
    Set bankRange = Range("A2")

    Do While Not IsEmpty(bankRange)
        Dim transType As String
        transType = Trim(bankRange.Offset(0, 1).Value2)
        If transType = "Cash Deposit" Or transType = "Check Deposit" Then
            Dim bankDate As Date, bankAmount As Double
            bankDate = bankRange.Value2
            bankAmount = bankRange.Offset(0, 2).Value2

            Dim sellRange As Range
            Set sellRange = Range("F2")
            Dim matched As Boolean
            matched = False
            Do While Not IsEmpty(sellRange)
                Dim sellStatusRange As Range, sellStatus As String
                Set sellStatusRange = sellRange.Offset(0, 2)
                sellStatus = sellStatusRange.Value2

                If sellStatus <> "DEPOSITED" Then
                    ' By default consider not matched
                    sellStatusRange.Value2 = "MISSING"

                    Dim sellDate As Date, sellAmount As Double
                    sellDate = sellRange.Value2
                    sellAmount = sellRange.Offset(0, 1).Value2

                    If matched = False And sellDate = bankDate And sellAmount = bankAmount Then
                        sellStatusRange.Value2 = "DEPOSITED"
                        matched = True
                    End If
                End If

                Set sellRange = sellRange.Offset(1)
            Loop
        End If
        Set bankRange = bankRange.Offset(1)
    Loop
End Sub

它只是通过银行存款并将下一个匹配的卖出标记为“已存入”。

答案 1 :(得分:0)

不使用VBA,您需要一些辅助列。首先添加一个列E并将此公式放入其中=IF(IFERROR(FIND("Deposit",B2),0)>0,CONCATENATE(A2,"_",C2),"") FIND子句将检测它是否是存款。如果它不是存款,那么它将不会使用该条目。

H列中添加此公式=CONCATENATE(G2,"_",H2)

现在输入端有一列,输出端有一列,每列都有你要比较的信息。

J列中添加此公式=VLOOKUP(I2,$E$2:$E$6,1,FALSE)。它将在E列中搜索与该值匹配的内容。在专栏K中,请使用此公式=IF(I2=J2,"Deposited","Missing")

修改 不同的方法可以更好地考虑同一存款的多个实例。

首先插入一列E并使用此公式=IF(IFERROR(FIND("Deposit",B2),0)>0,CONCATENATE(A2,"_",C2),"")

此栏在存款时将日期和金额放在一起。

使用I

创建列=CONCATENATE(G2,"_",H2)

创建列J,其中第一行为=IF(COUNTIF($E$2:$E$6,I2)>0,"Deposit","Missing")

对于列J的下一行,请使用此公式=IF(COUNTIF($E$2:$E$6,I3)-COUNTIF(I$2:I2,I3)>0,"Deposit","Missing")并将其复制下来。新公式将扣除先前行中的任何实例,以便它不会重复计算事务。