У меня есть большая таблица с большим количеством данных, но я смотрю на шесть столбцов этой таблицы - имена людей, которые вместе занимались определенной работой. Примерно так:
+-------+--------+--------+-------+--------+-------+
| 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 |
+--------+
Я хочу иметь возможность идентифицировать все уникальные записи из этих шести столбцов, а затем разместить их на другом листе. Моей первой мыслью было сделать это с помощью формул, и это сработало (я использовал INDEX MATCH с COUNTIF в разделе MATCH), но в таблице есть 11 000 записей и 1200 различных имен, которые потенциально могут быть задействованы, и это заняло большинство дня для обработки. Я надеялся, что использование VBA ускорит его работу.
Я посмотрел на несколько возможных ответов. Сначала я пошел сюда: Заполнение уникальных значений в массив VBA из 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).
Затем я попробовал это, основываясь на ответе Джереми Томпсона в Более быстрый способ получить все уникальные значения столбца в VBA? :
Sheets("Data").Select
Range("BE:BJ").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("Crew").Range("A:A"), Unique:=True
Но, опять же, я не мог заставить ее складывать информацию из нескольких столбцов в один. В третьей попытке я посмотрел ответ ученика Гэри из Как извлечь уникальные значения из двух столбцов Excel VBA и попробовал это:
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
(попробовал только два столбца в этом, чтобы посмотреть, смогу ли я понять это таким образом, но нет)
Я действительно в растерянности. Как вы, вероятно, можете видеть из вышесказанного, я дико вертлюсь и пытался подойти к этому с трех разных точек зрения и абсолютно ничего не достиг. Я чувствую, что должен быть способ заставить первый работать, если не сказать больше, потому что он почти работал. Но я не понимаю.
Полагаю, я мог бы запустить его для четырех отдельных столбцов, а затем создать процесс, объединяющий четыре в один. Но даже тогда я не уверен, как бы я удалил дубликаты, которые в результате (как вы можете видеть в таблице выше, имена могут появляться в любом столбце).
Пока я могу получить один столбец со списком уникальных имен, и обработка не займет несколько часов, я полагаю, что я не против того, как туда добраться.