我有一张包含大量数据的大表,但我正在查看的是该表的六列 - 一起从事特定工作的人的姓名。像这样的东西:
+-------+--------+--------+-------+--------+-------+
| Name1 | Name2 | Name3 | Name4 | Name5 | Name6 |
+-------+--------+--------+-------+--------+-------+
| Rod | Jane | | | | |
| Jane | Freddy | Peter | Paul | | |
| Paul | | | | | |
| Mary | Jane | Rod | Peter | Freddy | Paul |
| Paul | Rod | Freddy | | | |
+-------+--------+--------+-------+--------+-------+
我想要结束的是这个(在另一张纸上):
+--------+
| Name |
+--------+
| Rod |
| Jane |
| Freddy |
| Peter |
| Paul |
| Mary |
+--------+
我希望能够识别这六列中的所有唯一条目,然后将它们填充到不同的工作表上。我的第一个想法是用公式来做,这很有效(我在 MATCH 部分使用了带有 COUNTIF 的 INDEX MATCH),但是表中有 11000 条记录和 1200 条不同的名称可能涉及,而且它占用了大部分处理的日期。我想,希望,使用 VBA 会使它运行得更快。
我查看了许多可能的答案。首先,我去了这里:从 Excel 将唯一值填充到 VBA 数组中,并查看了 brettdj 的答案(因为我有点理解它的去向),最后得到以下代码:
Dim X
Dim objDict As Object
Dim lngRow As Long
Sheets("Data").Select
Set objDict = CreateObject("Scripting.Dictionary")
X = Application.Transpose(Range([be2], Cells(Rows.Count, "BE").End(xlUp)))
For lngRow = 1 To UBound(X, 1)
objDict(X(lngRow)) = 1
Next
Sheets("Crew").Select
Range("A2:A" & objDict.Count) = Application.Transpose(objDict.keys)
End Sub
对于一列(BE 是上表中的 Name1 列 - Data 是存储数据的工作表,Crew 是我想要唯一值去的工作表),它工作得很好。但我一生无法弄清楚如何让它从多列(BE到BJ)中获取值。
然后我尝试了这个,从 Jeremy Thompson 的答案中获得更快的方式来获取 VBA 中列的所有唯一值?:
Sheets("Data").Select
Range("BE:BJ").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("Crew").Range("A:A"), Unique:=True
但同样,我无法将多列中的信息合二为一。第三次尝试,我从如何从两列 Excel VBA 中提取唯一值中查看了 Gary 的学生回答并尝试了这个:
Dim Na As Long, Nc As Long, Ne As Long
Dim i As Long
Na = Sheets("Stroke Data").Cells(Rows.Count, "BE").End(xlUp).Row
Nc = Sheets("Stroke Data").Cells(Rows.Count, "BF").End(xlUp).Row
Ne = 1
For i = 1 To Na
Cells(Ne, "E").Value = Cells(i, "A").Value
Ne = Ne + 1
Next i
For i = 1 To Na
Cells(Ne, "E").Value = Cells(i, "C").Value
Ne = Ne + 1
Next i
Sheets("Fail").Range("A:A").RemoveDuplicates Columns:=1, Header:=xlNo
(只尝试了其中的两列,看看我是否能以这种方式弄清楚,但没有)
我真的很茫然。正如您可能从上面看到的那样,我正在疯狂地四处游荡,并试图从三个不同的角度来解决这个问题,但一无所获。我觉得一定有办法让第一个工作,如果没有别的,因为它几乎工作了。但我不明白。
我想我可以为四个单独的列运行它,然后有一个将这四个列合并为一个的过程。但即便如此,我不确定如何删除会导致的重复项(如上表所示,名称可以出现在任何列中)。
只要我能得到一个包含唯一名称列表的列,并且不需要几个小时来处理,我想我真的不介意我是如何到达那里的。