【问题标题】:VBA Macro isn't finding a match even though values are an exact match即使值完全匹配,VBA 宏也找不到匹配项
【发布时间】:2018-08-13 21:43:49
【问题描述】:

我正在运行一个宏来循环查看基于多个条件的匹配项。我现在想再循环一次,其中 (i,13) = “帐户详细信息匹配但付款不同”,但使用列 (i,12) 作为与 (J, 14) 的匹配项。

当我添加这个循环时:

For i = 1 To UBound(PensionArr)
    match = False
    For J = 1 To UBound(PayrollArr)
        If CStr(PensionArr(i, 13)) = "Account details match but payment differs" Then

            If CStr(PensionArr(i, 12)) = CStr(PayrollArr(J, 14)) And CStr(PensionArr(i, 4)) = CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) = CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) = CStr(PayrollArr(J, 9)) Then
                PensionArr(i, 13) = "Complete match"
                Exit For


                'Looks for SC&AC Match but Amount doesn't
            ElseIf CStr(PensionArr(i, 4)) = CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) = CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) <> CStr(PayrollArr(J, 9)) Then
                PensionArr(i, 13) = "Account details match but payment differs"


                'Looks Amount Match but SC&AC don't
            ElseIf CStr(PensionArr(i, 4)) <> CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) <> CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) = CStr(PayrollArr(J, 9)) Then
                PensionArr(i, 13) = "Account details do not match but payment is correct"

            End If
        End If
    Next J
Next i

将 (i, 13) 填充为“未找到人员”,仅当此人不存在于第二张工作表中时才应作为结果。

如果没有上述循环,它会使用 2 个值中的 1 个填充 (i,13),具体取决于工作表之间不匹配的内容。在我添加上述循环之前,没有“找不到人”。

我的整个代码是:

Sub PensionCheckAccName()

    Application.ScreenUpdating = False
    Application.Calculation =     xlCalculationManual
    Application.EnableEvents = False

    Dim Pension As Worksheet
    Dim Payroll As Worksheet

    Dim cell As Range

    Dim i As Long, J As Long

    Dim PensionArr As Variant
    Dim PayrollArr As Variant

    Dim match As Boolean

    Dim PensionRng As Range
    Dim PayrollRng As Range

    Set Pension = ActiveWorkbook.Sheets("Pensions Bank")
    Set Payroll =  ActiveWorkbook.Sheets("PensionItrent")

    Set PensionRng = Pension.Range("A2",  Pension.Cells(Rows.Count, "A").End(xlUp).Offset(0, 13))
    Set PayrollRng = Payroll.Range("A2", Payroll.Cells(Rows.Count, "A").End(xlUp).Offset(0, 14))

    PensionArr = PensionRng.Value2
    PayrollArr = PayrollRng.Value2

    For i = 1 To UBound(PensionArr)
        match = False
        For J = 1 To UBound(PayrollArr)
            If CStr(PensionArr(i, 6)) = CStr(PayrollArr(J, 7)) And CStr(PensionArr(i, 13)) <> "Complete match" Then


                'Looks for a complete match across SC,AC,Amount

                If CStr(PensionArr(i, 4)) = CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) = CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) = CStr(PayrollArr(J, 9)) Then
                    PensionArr(i, 13) = "Complete match"
                    Exit For


                    'Looks for SC&AC Match but Amount doesn't
                ElseIf CStr(PensionArr(i, 4)) = CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) = CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) <> CStr(PayrollArr(J, 9)) Then
                    PensionArr(i, 13) = "Account details match but payment differs"


                    'Looks Amount Match but SC&AC don't
                ElseIf CStr(PensionArr(i, 4)) <> CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) <> CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) = CStr(PayrollArr(J, 9)) Then
                    PensionArr(i, 13) = "Account details do not match but payment is correct"

                End If
            End If
        Next J
    Next i


    For i = 1 To UBound(PensionArr)
        match = False
        For J = 1 To UBound(PayrollArr)
            If CStr(PensionArr(i, 13)) = "Account details match but payment differs" Then

                If CStr(PensionArr(i, 12)) = CStr(PayrollArr(J, 14)) And CStr(PensionArr(i, 4)) = CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) = CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) = CStr(PayrollArr(J, 9)) Then
                    PensionArr(i, 13) = "Complete match"
                    Exit For


                    'Looks for SC&AC Match but Amount doesn't
                ElseIf CStr(PensionArr(i, 4)) = CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) = CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) <> CStr(PayrollArr(J, 9)) Then
                    PensionArr(i, 13) = "Account details match but payment differs"


                    'Looks Amount Match but SC&AC don't
                ElseIf CStr(PensionArr(i, 4)) <> CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) <> CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) = CStr(PayrollArr(J, 9)) Then
                    PensionArr(i, 13) = "Account details do not match but payment is correct"

                End If
            End If
        Next J
    Next i


    For i = 1 To UBound(PensionArr)
        match = False
        For J = 1 To UBound(PayrollArr)
            If CStr(PensionArr(i, 13)) = "Person not found" Then

                If CStr(PensionArr(i, 12)) = CStr(PayrollArr(J, 14)) And CStr(PensionArr(i, 4)) = CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) = CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) = CStr(PayrollArr(J, 9)) Then
                    PensionArr(i, 13) = "Complete match"
                    Exit For


                    'Looks for SC&AC Match but Amount doesn't
                ElseIf CStr(PensionArr(i, 4)) = CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) = CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) <> CStr(PayrollArr(J, 9)) Then
                    PensionArr(i, 13) = "Account details match but payment differs"


                    'Looks Amount Match but SC&AC don't
                ElseIf CStr(PensionArr(i, 4)) <> CStr(PayrollArr(J, 5)) And CStr(PensionArr(i, 5)) <> CStr(PayrollArr(J, 6)) And CStr(PensionArr(i, 8)) = CStr(PayrollArr(J, 9)) Then
                    PensionArr(i, 13) = "Account details do not match but payment is correct"
                End If
            End If
        Next J
    Next i

    For i = 1 To UBound(PensionArr)
        If PensionArr(i, 13) = "" Then
            PensionArr(i, 13) = "Person not found"
        End If
    Next i

    PensionRng.Value = PensionArr

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True


End Sub

任何帮助都会很好,因为我正在尝试使用上面的代码来比较基于多个值的每个工作表,但是有很多行,其中 4 列中有 3 列是相同的,并且它们仅在第 4 列中唯一.当我尝试使用第 4 列使行唯一以进行比较(第一个循环)时,它与 136 行不匹配。

我很久没有使用 VBA,所以欢迎任何提示。

如果您需要更多信息,请告诉我

非常感谢,

马特

【问题讨论】:

  • 此外,下面的 excel 公式使用我试图在我的 VBA 宏中使用的相同标准找到匹配项,不确定这是否对我的上述问题有帮助。 {=INDEX(PensionItrent!K:K,MATCH(1,(D174=PensionItrent!E:E)*('PensionItrent!E174=PensionItrent!F:F)*('PensionItrent!L174=PensionItrent!N :N)*('养老金银行'!H174=PensionItrent!I:I),0))}
  • 您比较的文本中是否有任何文本大小写差异?比如可能导致文本不匹配的“Joe”与“joe”?如果是这样,您可以添加 Option Compare Text 以忽略文本大小写。
  • 你能发布一些示例数据吗?
  • 嗨,我无法提供准确的数据,因为它没有被屏蔽,但有 6 列是数字,我将这些列格式化为没有小数位的数字。 2列是数量,我格式化为自定义格式(底部右侧),2列是通用的,它们是唯一包含文本的列,但列的格式不是文本。令我感到奇怪的是,如果我执行一个公式来执行我的宏应该执行的操作,它会按预期工作并找到匹配项,但如果我在 Sub 中使用附加循环,则它根本不起作用。跨度>
  • 我可以提供列名。从表一开始:交易类型、起始排序代码、起始帐号、目的地排序代码、目的地帐号、目的地账户名称、目的地账户代码、金额、处理日期。RTI 参考用户姓氏、参考、匹配状态、调查状态,完成人,完成日期从表 2 - 发起排序代码,发起帐户编号,发起帐户名称,付款类型,目标帐户排序代码,目标帐户号码,目标帐户名称,收款人姓名,付款值,参考姓氏,名字 1,字段7、工资单号

标签: vba excel


【解决方案1】:

问题是我的循环顺序。我在最后设置了“未找到人员”,但在设置之前尝试遍历 (i, 13) 中设置的行。

然后,我将问题顶部的问题循环移到最后,一切都已设置完毕,并且立即生效。

我只需要重新排序我的循环,让它做我想做的事。

感谢您的尝试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多