Мне предстоит отфильтровать большой массив ФИО с номерами страниц и напротив каждой фамилии проставить страницы, на которых она встречается через запятую. Во вложении образец того, что мне нужно сделать.
Голову сломал, но не могу ничего придумать, как ручной ввод. Может быть есть здесь специалисты, которые помогут написать простой алгоритм?
Пож-а-а-а-луйста...
Добрый день, друзья!
Мне предстоит отфильтровать большой массив ФИО с номерами страниц и напротив каждой фамилии проставить страницы, на которых она встречается через запятую. Во вложении образец того, что мне нужно сделать.
Голову сломал, но не могу ничего придумать, как ручной ввод. Может быть есть здесь специалисты, которые помогут написать простой алгоритм?
Для произвольного количества повторов без макроса сложно А с макросом легко [vba]
Код
Sub tt() r0_ = 2 r1_ = Cells(Rows.Count, 1).End(3).Row If r1_ < r0_ Then Exit Sub nr_ = r1_ - r0_ + 1 c1_ = 9 ar = Cells(r0_, 1).Resize(nr_, 2) Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To nr_ If .Exists(ar(i, 1)) Then .Item(ar(i, 1)) = .Item(ar(i, 1)) & ", " & ar(i, 2) Else .Item(ar(i, 1)) = ar(i, 2) End If Next i r11_ = Cells(Rows.Count, c1_).End(3).Row Cells(r0_, c1_).Resize(r11_ - r0_ + 1, 2).ClearContents Cells(r0_, c1_).Resize(.Count, 1) = Application.Transpose(.Keys) Cells(r0_, c1_ + 1).Resize(.Count, 1) = Application.Transpose(.Items) End With End Sub
[/vba]
Прохлопал я сначала [moder]Тимур, измените название темы. "Выборка данных" слишком общее название - это нарушение Правил форума[/moder]
Для произвольного количества повторов без макроса сложно А с макросом легко [vba]
Код
Sub tt() r0_ = 2 r1_ = Cells(Rows.Count, 1).End(3).Row If r1_ < r0_ Then Exit Sub nr_ = r1_ - r0_ + 1 c1_ = 9 ar = Cells(r0_, 1).Resize(nr_, 2) Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To nr_ If .Exists(ar(i, 1)) Then .Item(ar(i, 1)) = .Item(ar(i, 1)) & ", " & ar(i, 2) Else .Item(ar(i, 1)) = ar(i, 2) End If Next i r11_ = Cells(Rows.Count, c1_).End(3).Row Cells(r0_, c1_).Resize(r11_ - r0_ + 1, 2).ClearContents Cells(r0_, c1_).Resize(.Count, 1) = Application.Transpose(.Keys) Cells(r0_, c1_ + 1).Resize(.Count, 1) = Application.Transpose(.Items) End With End Sub
[/vba]
Прохлопал я сначала [moder]Тимур, измените название темы. "Выборка данных" слишком общее название - это нарушение Правил форума[/moder]_Boroda_
Sub test() Dim z, i&, j&, m&, t$: z = Range("A2:B" & Range("A" & Rows.Count).End(xlUp).Row).Value With CreateObject("scripting.dictionary"): .CompareMode = 1 For i = 1 To UBound(z): t = z(i, 1) If .exists(t) = False Then m = m + 1: .Item(t) = m: For j = 1 To UBound(z, 2): z(m, j) = z(i, j): Next Else z(.Item(t), 2) = z(.Item(t), 2) & "," & z(i, 2) End If Next Range("I2").Resize(.Count, UBound(z, 2)).Value = z Range("J2:J" & Range("J" & Rows.Count).End(xlUp).Row).HorizontalAlignment = xlRight End With End Sub
[/vba]
Barbos_TN, еще вариант ,кнопка test
[vba]
Код
Sub test() Dim z, i&, j&, m&, t$: z = Range("A2:B" & Range("A" & Rows.Count).End(xlUp).Row).Value With CreateObject("scripting.dictionary"): .CompareMode = 1 For i = 1 To UBound(z): t = z(i, 1) If .exists(t) = False Then m = m + 1: .Item(t) = m: For j = 1 To UBound(z, 2): z(m, j) = z(i, j): Next Else z(.Item(t), 2) = z(.Item(t), 2) & "," & z(i, 2) End If Next Range("I2").Resize(.Count, UBound(z, 2)).Value = z Range("J2:J" & Range("J" & Rows.Count).End(xlUp).Row).HorizontalAlignment = xlRight End With End Sub