【发布时间】: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、工资单号