如何解决VBA使用多个条件和带有标识符的标签项将数据与其自身进行比较
有人可以建议VBA解决方案提供帮助吗?我正在尝试将数据行(多个条件)与同一数据集中的其他行进行比较,然后用一个标识符进行标记,以供以后使用。这是一个较大的VBA代码项目的一部分,我正在寻找一种方法来尽可能高效地比较数据,因为数据可能超过1万行。到目前为止,我尝试使用if / then数组进行的所有操作均无法产生预期的结果,并将行与自身进行比较,这是不必要的。我不精通VBA,因此可能忽略了一个简单的解决方案。
示例代码尝试和附加数据。任何帮助将不胜感激。
Arr1 = WS.ListObjects("mockdata").DataBodyRange.Value
For i = 1 To UBound(Arr1)
If Arr1(i,1) = "AC" Then
For j = 1 To UBound(Arr1)
'concat doctype/reference/amount for comparison
If Arr1(i,1) & Arr1(i,4) & Arr1(i,3) = Arr1(j,1) & Arr1(j,4) & Arr1(j,3) * -1 Then
Arr1(i,7) = "ZD"
ElseIf Arr1(i,3) <> Arr1(j,7) = "CFWD"
End If
Exit For
Next j
ElseIf Arr1(i,1) = "XJ" Then
For j = 1 To UBound(Arr1)
If Arr1(j,1) = "PY" Then
For k = 1 To UBound(Arr1)
'concat reference/co for comparison
If Arr1(i,5) = Arr1(k,4) & Arr1(k,5) And Arr1(i,3) + Arr1(k,3) = "0" Then
Arr1(i,7) = "ZD"
ElseIf Arr1(i,3) <> "0" Then
Arr1(i,7) = "Variance"
'if ref match but co does not
ElseIf Arr1(i,4) = Arr1(k,4) And Arr1(i,3) = "0" And Arr1(1,5) <> Arr1(k,5) Then
Arr1(i,7) = "Cross Co"
ElseIf Arr1(i,3) <> "0" And Arr1(1,7) = "Cross Co/Variance"
End If
Next k
End If
Next j
ElseIf Arr1(i,1) = "PY" Then
For j = 1 To UBound(Arr1)
If Arr1(j,1) = "XJ" Then
For k = 1 To UBound(Arr1)
'concat reference/co for comparison
If Arr1(i,7) = "Cross Co/Variance"
End If
Next k
End If
Next j
End If
Next i
Range("A2").Resize(UBound(Arr1,1),7).Value = Arr1
解决方法
原始答案将在下面保留,但这是此数据集的有效版本。但是,您的原始代码中缺少一些内容:没有像您期望的结果所示那样以XJ类型生成“ CFWD”的检查,因此您仍然需要解决这个问题。另外,在您的交流中,您没有可以返回ZD结果的选择
Sub RUNME()
arr1 = Sheet1.ListObjects("mockdata").DataBodyRange.Value
For i = 1 To UBound(arr1)
If arr1(i,1) = "AC" Then
For j = 1 To UBound(arr1)
'concat doctype/reference/amount for comparison
If arr1(i,1) & arr1(i,4) & arr1(i,3) = arr1(j,1) & arr1(j,4) & arr1(j,3) * -1 Then
arr1(i,7) = "ZD"
ElseIf arr1(i,3) <> arr1(j,7) = "CFWD"
End If
Exit For
Next j
ElseIf arr1(i,1) = "XJ" Then
For j = 1 To UBound(arr1)
If arr1(j,1) = "PY" Then
If j = i Then
'skip this line we don't need to compare to itself
Else
If arr1(i,5) = arr1(j,5) Then
If arr1(i,3) + arr1(j,3) <> "0" Then
arr1(i,7) = "Variance"
ElseIf arr1(i,3) = "0" Then
arr1(i,7) = "ZD"
End If
ElseIf arr1(i,4) = arr1(j,4) Then
If arr1(i,5) <> arr1(j,5) Then
If arr1(i,3) <> 0 Then
arr1(i,7) = "Cross Co"
ElseIf arr1(i,3) = 0 Then
arr1(i,7) = "Cross Co/Variance"
End If
End If
End If
End If
End If
Next j
ElseIf arr1(i,1) = "PY" Then
For j = 1 To UBound(arr1)
If arr1(j,1) = "XJ" Then
If j = i Then
'skip this line we don't need to compare to itself
Else
If arr1(i,7) = "Cross Co/Variance"
End If
End If
End If
End If
End If
Next j
End If
Next i
Range("A2").Resize(UBound(arr1,1),7).Value = arr1
End Sub
下面的原始答案
您的逻辑存在缺陷。
任何时候,您都要进行一组比较(如果在此处声明),并且还要检查双重真实条件,则需要先检查双重真实条件,否则您的单一真实将结束比较然后您将获得所得到的结果。
如果我们有2列,则简化:
x-正确 y-是
如果我们执行以下操作:
if x = True then
b = Yes
elseif x = true and y = true
b = YesYes
end if
代码将在第一次检查后退出,并且从不评估elseif
您需要相应地对If语句重新排序。我正在尝试为您找到可行的修复程序,但我并没有真正遵循您的逻辑检查-如果您可以澄清这一点,我可以再次查看。
我也不确定您是否需要进行3次深循环。
我确实做到了以下几点:
ElseIf Arr1(i,1) = "XJ" Then
For j = 1 To UBound(Arr1)
If Arr1(j,1) = "PY" Then
For k = 1 To UBound(Arr1)
'concat reference/co for comparison
If Arr1(i,4) = Arr1(k,4) Then
If Arr1(i,3) + Arr1(k,3) = "0" And Arr1(1,5) <> Arr1(k,5) Then
Arr1(i,7) = "Cross Co"
ElseIf Arr1(i,3) <> "0" And Arr1(1,7) = "Cross Co/Variance"
End If
ElseIf Arr1(i,4) & Arr1(i,5) = Arr1(k,4) & Arr1(k,5) Then
If Arr1(i,3) <> "0" Then
Arr1(i,7) = "Variance"
ElseIf Arr1(i,3) = "0" Then
Arr1(i,7) = "ZD"
End If
End If
Next k
End If
Next j
与其进行5次比较,失败并进行另外5次比较,不如将其分解成一个,然后再进行另一个较小的集合。这可能有助于加快整个过程
编辑:多看一点我看不到在示例数据集中满足您当前“方差”条件的情况。
ElseIf Arr1(i,5) And Arr1(i,3) <> "0" Then
Arr1(i,7) = "Variance"
您希望获得差异的行是第15和9行
Arr1(9,4)和Arr1(9,5)将给出“ 781498071220055”
Arr1(15,4)和Arr1(15,5)将给出“ 781498071220008”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。