【发布时间】:2016-05-25 15:39:56
【问题描述】:
以我过去的一个 questions
我想要完成的事情为基础:
我正在寻找并使用基于多个标准的 VBA 代码突出显示重复的 Upcharges:
- 产品的 XID(A 列)
- 升压标准 1(CT 柱)
- 充电标准 2(CU 列)
- Upcharge 类型(列 CV)和
- Upcharge 水平(CW 列)
如果电子表格中有多个实例/行共享/匹配所有这些条件,则意味着 Upcharge 是重复的。正如我在上面链接的上一篇文章中所见:
我的尝试:
- 创建了一个通用公式(见下文),该公式插入到 Helper 列中,并一直复制到电子表格中,指出哪些 Upcharges 是重复的。这种方法太耗费资源并且耗时太长(所有公式计算需要 8-10 分钟,但过滤时不会滞后)。然后我尝试了
- 将通用公式演变为条件格式公式,并通过 VBA 代码将其应用于 Upcharge Name 列。(过滤时花费相同的时间和滞后)
- 我还研究过是否可以使用
scripting.dictionary,但我不确定如何(或是否)可以使用多维数组。
现在我终于找到了我认为会更快的方法,
我希望使用的更快的方法: 将上述列转储到多维数组中,在数组中找到重复的“行”,然后突出显示相应的电子表格行。
我对更快方法的尝试: 这是我填充多维数组的方法
Sub populateArray()
Dim arrXID() As Variant, arrUpchargeOne() As Variant, arrUpchargeTwo() As Variant, arrUpchargeType() As Variant, arrUpchargeLevel() As Variant
Dim arrAllData() As Variant
Dim i As Long, lrow As Long
lrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
arrXID = Range("A2:A" & lrow) 'amend column number
arrUpchargeOne = Range("CT2:CT" & lrow)
arrUpchargeTwo = Range("CU2:CU" & lrow)
arrUpchargeType = Range("CV2:CV" & lrow)
arrUpchargeLevel = Range("CW2:CW" & lrow)
ReDim arrAllData(1 To UBound(arrXID, 1), 4) As Variant
For i = 1 To UBound(arrXID, 1)
arrAllData(i, 0) = arrXID(i, 1)
arrAllData(i, 1) = arrUpchargeOne(i, 1)
arrAllData(i, 2) = arrUpchargeTwo(i, 1)
arrAllData(i, 3) = arrUpchargeType(i, 1)
arrAllData(i, 4) = arrUpchargeLevel(i, 1)
Next i
End Sub
我可以将列放入数组中,但我从那里卡住了。我不确定如何检查数组中重复的“行”。
我的问题:
- 有没有一种方法可以应用我在上一篇文章中第一次尝试的公式(见下文)并将其应用到数组中?:
- 或者,更好的是,有没有更快的方法可以在数组中找到重复的“行”?
- 那么如何在电子表格行中突出显示与数组中标记为重复的“行”相对应的 Upcharge Name (CS) 单元格?
我之前帖子中的公式供参考:
=AND(SUMPRODUCT(($A$2:$A$" & lastRow & "=$A2)*($CT$2:$CT$" & lastRow & "=$CT2)*($CU$2:$CU$" & lastRow & "=$CU2)*($CV$2:$CV$" & lastRow & "=$CV2)*($CW$2:$CW$" & lastRow & "=$CW2))>1,$CT2 <> """")"
Returns TRUE if Upcharge is a duplicate
【问题讨论】:
-
SUMPRODUCT 函数应替换为 COUNTIFS 函数;后者通常占计算负载(和时间)的 25-35%。也可以使用完整的列引用而不会造成损害。例如
=AND(COUNTIFS(A:A, A2,CT:CT, CT2,CU:CU, CU2,CV:CV, CV2,CW:CW, CW2)>1, SIGN(LEN(CT2)))大约需要 80 秒。不是真的可以接受,但在里面放了一个别针。
标签: arrays excel vba multidimensional-array conditional-formatting