将重复值放在不同的关键字时发出警告

时间:2013-12-05 12:58:25

标签: excel excel-vba vba

我们说我有一张包含多列的工作表,但为了举例,我只放了2。 我想要达到的目的是在同一个人被安排到不同的团队时向用户发出警告。 (可能有重复的人,但不允许他们分开参加团队)

首先我想我会过滤它,所以我只能看到副本,然后检查同一个人是否被安排在两个不同的团队中。但现在我发现它不可能过滤重复项。然后我想使用条件格式并检查cell.color.interior是否已更改,但我注意到它没有改变它! stackoverflow上提供的解决方案对我来说还不够。由于我的工作表已经过度拥挤,我也不想要一个可存活的列或一个额外的列。

Example:  
Value A      Value B  
Tom          Team 1   
Ben          Team 1   
Tom          Team 1  <- possible  
Elle         Team 2   
Tom          Team 2 <- not possible, give warning!  
Rick         Team 2

这个名单还在继续。 有人知道我可以在将同一个人安排到不同的团队时向用户发出警告吗? 或者如何查看工作表中的重复值或将其放在vba的范围内?

谢谢!

1 个答案:

答案 0 :(得分:0)

那么,由于你无法对表格进行排序,因此需要采用更为残酷或复杂的方法。

1)首先是一种简单快捷的方法 虽然您仍然可以添加临时列,对其进行编号,然后根据值A字段对工作表进行排序,然后只需遍历单元格,查找实例

Cells(curRow,rowNumOfValueA).value = Cells(curRow-1,rowNumOfValueA).value

发生这种情况时,请检查每个项目的“ValueB”列中的值是否相同。如果是这样,继续下一行。如果没有,请以某种方式标记行 - 设置内部颜色通常是一种很好的方法。然后,您可以根据添加的列对表进行排序,删除列然后执行操作。

2)第二个蛮力 从第一行开始,获取ValueA和ValueB中的值,调用它们,例如findMeA和findMeB

a)从下一行开始,检查ValueA是否与findMeA匹配。如果没有,请转到下一行。如果匹配,请确保ValueB也匹配findMeB。如果没有,请在完成完整性检查时标记该行或将其索引添加到数组以进行报告。

b)移动到下一行,如果它为空,则返回(2)。如果不是,请返回(a)

正如你可能看到的那样,随着行数的增加,蛮力方法会越来越令人讨厌。只有10行数据,需要完成9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1次搜索,除非您犯了逻辑错误并检查每一行的每一行。只需10行即可进行100次检查。 - 10 ^ 2

另一方面,如果您先对表格进行排序 - 您可以在每N行只检查N次。 10行需要10次检查,1000行需要1000次检查。 (我不知道如何轻松计算1000 + 999 + 998 + .... + 1,但它很大。实际上,它大约是500,000(1000 + 999 + 1 + 998 + 2 + 997 + 3) ... 499 + 501 + 500)。 - 即1000 + 499 * 1000 + 500

因此,随着列表的增长,蛮力成倍增长,但排序优先方法需要线性时间。两倍大等于两倍。

分类方法:10项 - 10项检查。 1000项1000检查。 蛮力:10项 - 55项检查。 1000项500,500项检查。

即使在最坏的情况下,蛮力也需要500倍于排序方法。如果它只是几个项目,我只是建议强制它。使用VBA进行的超过50万次检查似乎并不那么令人愉快,所以我会对表单进行排序,或者至少 - 在报告实际工作表的问题之前,先复制并排序然后对其进行操作。