Получение уникальных значений из столбца

У меня есть эта проблема, которую я все еще не могу решить. Возможно, я могу использовать функцию Application.Transpose но в этом столбце будут получены все уникальные значения. Я хочу сделать, чтобы получить уникальное значение в столбце, если другие значения столбца соответствуют определенному ключу. введите описание изображения здесь

Если я использую Application.Transpose, все уникальные значения в столбце C берутся. Я хочу получить только уникальные значения в C, если имя студента является. И вставьте его в столбец B недавно добавленной книги. Я использовал этот код для фильтрации уникальных значений в B и вставки его в столбце A недавно добавленной книги.

 dim var as variant dim lastrow as long dim obj as object set obj = CreateObject("Scripting.Dictionary") var = Application.Transpose(Range([B1], Cells(Rows.count, "B").End(xlUp))) For lastRow = 1 To UBound(var, 1) obj(var(lastRow)) = 1 Next Set wb2 = Workbooks.Add Range("A1:A" & obj.count) = Application.Transpose(obj.keys) 

Любая помощь приветствуется. Благодаря!

Решение NON VBA

  1. Скопируйте данные в временную таблицу.
  2. Выберите Col A и Col B
  3. Данные | Удалить дубликаты.
  4. AutoFilter на Col A для соответствующего имени

VBA SOLUTION (Использование коллекции)

 Sub Sample() Dim ws As Worksheet Dim Col As New Collection, itm Dim lRow As Long, i As Long Dim tempAr As Variant Set ws = Sheet2 With ws lRow = .Range("A" & .Rows.Count).End(xlUp).Row tempAr = .Range("A2:B" & lRow).Value For i = LBound(tempAr) To UBound(tempAr) If tempAr(i, 1) = "a" Then On Error Resume Next '<~~ This will ensure a unique collection Col.Add tempAr(i, 2), CStr(tempAr(i, 2)) On Error GoTo 0 End If Next i End With For Each itm In Col Debug.Print itm 'or 'Debug.Print "a"; "-"; itm 'or export it to worksheet Next itm End Sub 

Я согласен с Siddharth Rout, что использование Remove Duplicates – это, вероятно, путь.

Я немного изменил ваш код, чтобы он работал.

введите описание изображения здесь

 Sub Example() Dim wb2 As Excel.Workbook Dim var As Variant Dim x As Long Dim dict As Object Dim key As String Set dict = CreateObject("Scripting.Dictionary") var = Range("B1", Cells(Rows.Count, "C").End(xlUp)) For x = 1 To UBound(var, 1) If var(x, 1) = "a" Then key = var(x, 1) & "|" & var(x, 2) If Not dict.Exists(key) Then dict.Add key, var(x, 2) End If Next Set wb2 = Workbooks.Add wb2.ActiveSheet.Range("A1:A" & dict.Count) = Application.Transpose(dict.Items) End Sub 

Мы также можем добавить словарь для хранения уникальных значений в качестве ключей словаря для хранения уникальных идентификаторов. Таким образом, мы не должны дважды перебирать данные.

 Sub Example() Dim wb2 As Excel.Workbook Dim var As Variant Dim x As Long Dim MainDict As Object, SubDict As Object Dim MainKey As String, SubKey, arSubKeys Set MainDict = CreateObject("Scripting.Dictionary") var = Range("B1", Cells(Rows.Count, "C").End(xlUp)) For x = 1 To UBound(var, 1) MainKey = var(x, 1) SubKey = var(x, 2) If MainDict.Exists(MainKey) Then Set SubDict = MainDict(MainKey) Else Set SubDict = CreateObject("Scripting.Dictionary") MainDict.Add MainKey, SubDict End If If Not SubDict.Exists(SubKey) Then SubDict.Add SubKey, vbNullString Next Set SubDict = MainDict("a") arSubKeys = SubDict.Keys Set wb2 = Workbooks.Add wb2.ActiveSheet.Range("A1:A" & UBound(arSubKeys) + 1) = Application.Transpose(SubDict.Keys) Set SubDict = MainDict("b") arSubKeys = SubDict.Keys Set wb2 = Workbooks.Add wb2.ActiveSheet.Range("A1:A" & UBound(arSubKeys) + 1) = Application.Transpose(SubDict.Keys) End Sub 
Давайте будем гением компьютера.