【发布时间】:2019-06-03 09:22:58
【问题描述】:
我有一张包含大量数据的大表,但我正在查看的是该表的六列 - 一起从事特定工作的人的姓名。像这样的:
+-------+--------+--------+-------+--------+-------+
| 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 可以让它运行得更快。
我查看了许多可能的答案。首先,我来到这里:Populate unique values into a VBA array from Excel,并查看了 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 在Quicker way to get all unique values of a column in VBA? 中的回答:
Sheets("Data").Select
Range("BE:BJ").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("Crew").Range("A:A"), Unique:=True
但同样,我无法将多列中的信息合二为一。第三次尝试,我查看了来自How to extract unique values from two columns Excel VBA 的 Gary's Student 的回答并尝试了这个:
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
(只尝试了其中的两列,看看我是否可以这样解决,但没有)
我真的很茫然。正如您可能从上面看到的那样,我正在疯狂地四处游荡,并尝试从三个不同的角度来解决这个问题,但一无所获。我觉得必须有办法让第一个工作,如果没有别的,因为它几乎工作。但我不明白。
我想我可以为四个单独的列运行它,然后有一个将四个合并为一个的过程。但即便如此,我也不确定如何删除会导致的重复项(如上表所示,名称可以出现在任何列中)。
只要我能得到一个包含唯一名称列表的列,并且不需要花费数小时来处理,我想我并不介意我是如何到达那里的。
【问题讨论】:
-
退后一步 - 在顶部的数据中,您有六列。您基本上是在尝试从列中提取所有唯一名称吗?我不太清楚你最终是如何得到预期结果的。
-
是的。我想从这六列中提取所有唯一值。抱歉没有说清楚。
标签: excel vba unique-values