我有一系列客户名称。这个数组充满了重复数据,因为订单行中的其他数据可能会有所不同。此数据没有唯一标识符,我需要将一个订单中的数据与阵列中拥有该客户的所有行进行比较。
我无法让for循环搜索所有与客户匹配的行。
任何帮助将不胜感激!
Dim prodlog As String
Dim orddate As Variant
Dim cus As String
Dim owner As String
Dim orddate2 As Variant
Dim owner2 As String
Dim LogCusts As Variant
LogCusts = Application.Transpose(Range("F3", Range("F" & Rows.count).End(xlUp)))
Dim loglen As Integer
loglen = UBound(LogCusts) - LBound(LogCusts)
Dim cust2 As Variant
For Each cust2 In LogCusts
Dim custrow As Integer
custrow = Application.Match(cust2, LogCusts, False) + 1
prodlog = Range(Cells(custrow, 5), Cells(custrow, 5)).Value
orddate = Range(Cells(custrow, 2), Cells(custrow, 2)).Value
cus = Range(Cells(custrow, 6), Cells(custrow, 6)).Value
owner = Range(Cells(custrow, 7), Cells(custrow, 7)).Value
databook.Activate
logjam.Select
orddate2 = Range(Cells(custrow + 1, 5), Cells(custrow + 1, 5)).Value
owner2 = Range(Cells(custrow + 1, 7), Cells(custrow + 1, 7)).Value
If IsEmpty(orddate) Then
Exit For
End If
If IsEmpty(prodlog) Then
trackbook.Activate
masterlog.Select
Range(Cells(custrow, 2), Cells(custrow, 17)).Clear
Else: While cus = cust2
If orddate = orddate2 And owner = owner2 Then
Range(Cells(custrow, 8), Cells(custrow, 8)).Value = prodlog
End If
Wend
End If
Next cust2
答案 0 :(得分:1)
有几种方法可以做你想做的事。最简单的可能是使用像@Richard Morgan这样的词典,在他给你的评论中建议。
您也可以遍历数组并使用正确的名称创建一个新数组。
示例代码:
Private Sub UniqueArray(oldData as Variant) as Collection
Set UniqueArray = New Collection
Dim i as integer
Dim j as integer
Dim foundFlag as boolean
For i = 1 to oldData.Count
foundFlag = False
FOr j = i + 1 to oldData.Count
If oldData(i) = oldData(j) then
foundFlag = True
End If
Next j
If not foundFlag then UniqueArray.Add oldData(i)
Next
同样,我认为使用字典可能更好,但这应该有效。
答案 1 :(得分:1)
哇看起来很复杂,你试过在当前数组旁边创建一个表并使用公式:
=IF(MAX(COUNTIF(A2:A11,A2:A11))>1,"Duplicates","No Duplicates")
如果存在重复,则会显示Duplicates
,如果存在,则显示No Duplicates
。当然是来自A2-A11。
或者为了使事情变得非常简单,您可以使用条件格式,输入类似
的内容=COUNTIF($B$2:$B$11,B2)=1
表示仅出现一次的值的项目。您可以稍微修改以获得阵列的颜色方案。然后在侧面扔一个Key,告诉哪个颜色表示有多少重复。
不知道这是否有帮助,但我尽量远离VBA。