我将以一个例子开始我的问题,否则将难以解释。
A B C D E (ID)
1 word letter 1
test blabla
other
2 word letter 2
number
3 test true 3
4 other false 4
5 word letter Yes 5
6 word letter Yes 6
7 test letter 7
目标是什么?
如果我试着用语言解释目标,那就很难理解;它也很难解释:)无论如何我还添加了我的代码,如果你对VBA很好,你会比文本更好地理解代码。
如果一个值(在这个例子中:word)也在其他行中,那么我们需要检查C列,如果在C列中有一个值,我们在C列中找到一个以上的值(在这个例子中:字母),我们需要重新检查,如果在A列中,该值也会出现一次以上。
所以我已经制作了一个SUB,它的工作原理! :)但如果单元格中有更多值,则不会。因此,在单元格中只有1个值的示例中,如第6行和第6行中所示。 7,D列返回:是
到目前为止,这是我的代码。
Sub duplicates()
Dim source As Range
Dim source2 As Range
For Each source In Range("A1", Range("A" & Rows.Count).End(xlUp))
If source.Value <> "" Then
For Each source2 In Range("A1", Range("A" & Rows.Count).End(xlUp))
If source.Value = source2.Value And source.Offset(0, 4).Value <> source2.Offset (0, 4).Value Then
If source.Offset(0, 2).Value = source2.Offset(0, 2).Value Then
source.Offset(0, 3) = "Yes"
End If
End If
Next source2
End If
Next source
End Sub
所以,我们应该回归:第1行和第1行是2也是。希望你了解我的目标。 希望有人可以提供帮助。
答案 0 :(得分:0)
我的建议如下:
A)附加功能会检查作为数组传递给函数的每个单元格的每个元素:
Function AnyEqual(ColA, ColB) As Boolean
Dim itemA, itemB
For Each itemA In ColA
For Each itemB In ColB
If itemA = itemB Then
AnyEqual = True
Exit Function
End If
Next
Next
End Function
B)您的代码中进行了一些更改 - 将其放在For Each source2
循环中,而不是内部代码:
If AnyEqual(Split(source, Chr(10)), Split(source2, Chr(10))) And _
source.Offset(0, 4).Value <> source2.Offset(0, 4).Value Then
If AnyEqual(Split(source.Offset(0, 2), Chr(10)), _
Split(source2.Offset(0, 2), Chr(10))) Then
source.Offset(0, 3) = "Yes"
End If
End If
根据您提供的数据,它似乎工作正常。我希望这是你所寻找的,因为理解你的需求有点复杂。