【发布时间】:2013-12-03 15:49:35
【问题描述】:
我的问题可能看起来太简单了,但不幸的是我只是 VBA 的初学者。
我有一个包含三列的表格,其中第一列包含公司名称(B 列),第二个董事姓名(C 列),第三个 - 董事 ID(D 列)和所有公司的列表(F 列)。一家公司有多个不同的董事,因此在 B 栏中,公司名称的重复次数与该公司的董事人数一样多。一些公司可以共用同一个董事,因此在 C 和 D 列中有重复的名称和 ID。但是,根据数据,一些名称在一家公司内重复了好几次(有点冗余信息)。
这是我的表格示例
所以我的目标是删除(删除)这些冗余信息,即删除特定公司的董事重复项,同时保留由于几家公司共享一个或多个董事这一事实而导致的重复项。从技术上讲,我需要选择与某个公司相对应的董事范围及其 ID,然后按 ID 删除重复项。然后对每家公司重复一遍。由于我有 500 家公司,我想以某种方式实现自动化
这是我在 VBA 中构建的代码(删除重复函数+for 循环):
Sub test()
Dim rcompany As Variant
For X = 0 To 500
rcompany = Range("F2").Offset(X, 0)
Dim c As Range, r As Range
For Each c In Range("B1:B23500")
If c.Value = rcompany Then
If r Is Nothing Then
Set r = c.Offset
Else
Set r = Union(r, c)
End If
End If
Next c
Union(r, r.Offset(, 1), r.Offset(, 2)).RemoveDuplicates Columns:=3, Header:=xlNo
Next
End Sub
此代码的问题在于,如果我在没有循环的情况下运行它(对于特定公司),它运行良好。但是,一旦我添加了 for 循环,它在第一步中效果很好,但随后它开始删除整个 D 列中的所有重复项,但不在根据公司名称的范围内。
你能帮我吗?如何改进?
【问题讨论】:
-
如果董事姓名和公司在 2 行中相同,则删除其中 1 行?还是我过于简化了?
-
我不太确定 col F 与 col B 的差异如何? col B 1 公司和 col F 是他担任董事的所有公司吗?
-
关于删除,不幸的是它与您所理解的有点不同。就是这样:例如,有一家公司 BlueWings,它有 3 个董事,ID 为 1 的 John(重复两次),ID 为 2 的 Mark(三次)和 ID 为 3 的 Jack(一次)。总体而言,该公司在 C 和 D 列中将有 2+3+1=6 行,因此 BlueWings 在 B 列中分别重复 6 次。
-
我需要做的是仅删除 Jack 的 C 和 D 列中的重复项和 BlueWings 的 Mark,而不是删除整个 C 和 D 列中的重复项,因为这些人可能会为其他公司重复。
-
关于 F 列,它与 B 列的不同之处在于它仅包含唯一名称,即列出名称彼此跟随而没有任何重复的位置。而我之前评论的 B 列中包含重复的公司名称。