希望限制重复但不删除

时间:2019-02-08 23:42:02

标签: excel vba

全部!

我对JS和Python有一定的经验,但是对VBA来说还比较陌生。到目前为止,我已经写了一些成功的脚本,包括:

1)在我希望所有单元格都为空的列中定位值,并在找到这些单元格后,删除它们周围的整行

2)在需要字符串的列中找到空值,并用字符串替换所说的空值

3)找到重复项并将其删除

现在,我要执行的操作类似于3),但更为复杂。我想搜索一列中的重复项,而不是删除所有重复项并留下一个,我想编写一个脚本来查找重复项,并保留3、5、10或20个重复项。这是我的问题的简化表:

+-----------+------------------------+--------+
|   Name    |         Email          | Animal |
+-----------+------------------------+--------+
| Lauretta  | Lauretta@barnyard.com  | Pig    |
| Irwin     | Irwin@barnyard.com     | Cat    |
| Leigh     | Leigh@barnyard.com     | Donkey |
| Eloy      | Eloy@barnyard.com      | Horse  |
| Elaina    | Elaina@barnyard.com    | Spider |
| Trinity   | Trinity@barnyard.com   | Pig    |
| Kanisha   | Kanisha@barnyard.com   | Pig    |
| Minna     | Minna@barnyard.com     | Spider |
| Shantelle | Shantelle@barnyard.com | Cat    |
| Renea     | Renea@barnyard.com     | Cat    |
| Catherina | Catherina@barnyard.com | Spider |
| Jamika    | Jamika@barnyard.com    | Horse  |
| Delphine  | Delphine@barnyard.com  | Pig    |
| Kristian  | Kristian@barnyard.com  | Horse  |
| Arlie     | Arlie@barnyard.com     | Spider |
| Katelynn  | Katelynn@barnyard.com  | Pig    |
| Philip    | Philip@barnyard.com    | Pig    |
| Antonette | Antonette@barnyard.com | Cat    |
| Ellamae   | Ellamae@barnyard.com   | Spider |
+-----------+------------------------+--------+

场景:我想随机邀请每只动物中的最多三只(随机选择,但不破坏交易)邀请我主持的晚会。

问题:如何删除重复项,但保留每只动物的 3 而不是仅仅 1 ?在我的现实生活中,我的联系人数据库中有成千上万的动物,而不仅仅是二十种,而且我还拥有蝙蝠,山羊,兔子等。我还考虑在将来的某个时候增加我的访客列表,邀请5、10甚至每只动物20只。

所需的成品看起来像这样(这也涉及排序-排序也不会破坏交易):

+-----------+------------------------+--------+
|   Name    |         Email          | Animal |
+-----------+------------------------+--------+
| Lauretta  | Lauretta@barnyard.com  | Pig    |
| Kanisha   | Kanisha@barnyard.com   | Pig    |
| Katelynn  | Katelynn@barnyard.com  | Pig    |
| Irwin     | Irwin@barnyard.com     | Cat    |
| Renea     | Renea@barnyard.com     | Cat    |
| Antonette | Antonette@barnyard.com | Cat    |
| Leigh     | Leigh@barnyard.com     | Donkey |
| Eloy      | Eloy@barnyard.com      | Horse  |
| Jamika    | Jamika@barnyard.com    | Horse  |
| Kristian  | Kristian@barnyard.com  | Horse  |
| Elaina    | Elaina@barnyard.com    | Spider |
| Catherina | Catherina@barnyard.com | Spider |
| Ellamae   | Ellamae@barnyard.com   | Spider |
+-----------+------------------------+--------+

任何帮助都将不胜感激! :)

2 个答案:

答案 0 :(得分:1)

使用COUNTIF确定数字。自下而上开始工作,并在每次当前数量超过静态最大值时删除。

with worksheets("sheet1")

    dim i as long mx as long

    mx = 5   'set the maximum number of any animal

    for i=.cells(.rows.count, "C").end(xlup).row to mx step -1
        if application.countif(.range("C:C"), .cells(i, "C")) > mx then
            .cells(i, "C").entirerow.delete
        end if
    next i

end with

答案 1 :(得分:0)

您不需要VBA。

添加一个助手列,也许名为“ Count”

D2:  =COUNTIF($C$2:C2,C2)

然后填写。

然后使用计数<=3

进行过滤

您还可以对列表进行排序,以将所有动物聚集在一起。