Можно ли как-то сделать сводную таблицу с помощью формул, где выборка будет по искоммоу столбцу, а в остальных будет подсчет уникальных значений каждого из них?
По примеру из вложения: Необходимо сделать выборку для каждого уникального "Софта". Подсчитать кол-во клиентов для которых он установлен + кол-во уникальных урлов и отдельно сматчить коды услуг в строчку, что бы на выходе получилось что-то типа: win11 2 2 k11, k12 win10 1 1 k13 AntiMW 3 2 k49,k50 и т.д.
Сложность еще в том, что в таблице под миллион строк и любые эксперименты с формулами убивают мне эксель) Я так понимаю необходимо сделать сначала выборку уникальных по одному столбцу на второй лист, и потом уже как-то на основе этой выборки делать остальные? Или как-то через сводные это реализуется?
Добрый день. Есть таблица на 5 столбцов
Можно ли как-то сделать сводную таблицу с помощью формул, где выборка будет по искоммоу столбцу, а в остальных будет подсчет уникальных значений каждого из них?
По примеру из вложения: Необходимо сделать выборку для каждого уникального "Софта". Подсчитать кол-во клиентов для которых он установлен + кол-во уникальных урлов и отдельно сматчить коды услуг в строчку, что бы на выходе получилось что-то типа: win11 2 2 k11, k12 win10 1 1 k13 AntiMW 3 2 k49,k50 и т.д.
Сложность еще в том, что в таблице под миллион строк и любые эксперименты с формулами убивают мне эксель) Я так понимаю необходимо сделать сначала выборку уникальных по одному столбцу на второй лист, и потом уже как-то на основе этой выборки делать остальные? Или как-то через сводные это реализуется?gwelw
Порядка 2000тыс уникальных. На самом деле не принципиально чем это делать, макросами, Пивотом или ВБА. Топик формул, потому что первые в голову пришли они)
Порядка 2000тыс уникальных. На самом деле не принципиально чем это делать, макросами, Пивотом или ВБА. Топик формул, потому что первые в голову пришли они)
надо сначала в модель данных всю таблицу перенести же?
да, надо в модель. Если так некомфортно, то можно прямо в PQ это же сделать [vba]
Код
let Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], group = Table.Group( Source, "Софт", {{"clients", each List.Count(List.Distinct([Клиент]))}, {"urls", each List.Count(List.Distinct([Урл на софт]))}, {"services", each Text.Combine(List.Distinct([Код услуги]), ", ")}} ) in group
надо сначала в модель данных всю таблицу перенести же?
да, надо в модель. Если так некомфортно, то можно прямо в PQ это же сделать [vba]
Код
let Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], group = Table.Group( Source, "Софт", {{"clients", each List.Count(List.Distinct([Клиент]))}, {"urls", each List.Count(List.Distinct([Урл на софт]))}, {"services", each Text.Combine(List.Distinct([Код услуги]), ", ")}} ) in group
Эксель пишет что памяти на такое не хватает:) Напрямую через PQ с трудом, но съело. Не мог еще PQ запустить у себя, в примере входные данные поменял, норм подтянулось, спасибо!
Эксель пишет что памяти на такое не хватает:) Напрямую через PQ с трудом, но съело. Не мог еще PQ запустить у себя, в примере входные данные поменял, норм подтянулось, спасибо!gwelw
gwelw, попробуйте макросом, может понравится )) [vba]
Код
Sub svod() Dim a, i&, t$, d1 As Object, d2 As Object, d3 As Object Dim el, col
Set d1 = CreateObject("Scripting.Dictionary"): d1.comparemode = 1 Set d2 = CreateObject("Scripting.Dictionary"): d2.comparemode = 1 Set d3 = CreateObject("Scripting.Dictionary"): d3.comparemode = 1
'тут можно взять данные в массив любым способом a = Range("E2", Cells(Rows.Count, "A").End(xlUp)).Value
On Error Resume Next For i = 1 To UBound(a) t = a(i, 2) If Not d1.exists(t) Then d1.Add t, New Collection d2.Add t, New Collection d3.Add t, New Collection End If d1.Item(t).Add a(i, 1), a(i, 1) d2.Item(t).Add a(i, 5), a(i, 5) d3.Item(t).Add a(i, 4), a(i, 4) Next On Error GoTo 0
ReDim a(1 To d1.Count + 1, 1 To 4) i = 1 a(i, 1) = "Названия строк" a(i, 2) = "n_clients" a(i, 3) = "n_urls" a(i, 4) = "svs_codes"
For Each el In d1.keys t = "": i = i + 1 For Each col In d3.Item(el) t = t & ", " & col Next a(i, 1) = el a(i, 2) = d1.Item(el).Count a(i, 3) = d2.Item(el).Count a(i, 4) = Mid(t, 3) Next
Workbooks.Add.Sheets(1).[a1:d1].Resize(d1.Count + 1) = a End Sub
[/vba] Вместо Distinct тут коллекции. В словарях.
gwelw, попробуйте макросом, может понравится )) [vba]
Код
Sub svod() Dim a, i&, t$, d1 As Object, d2 As Object, d3 As Object Dim el, col
Set d1 = CreateObject("Scripting.Dictionary"): d1.comparemode = 1 Set d2 = CreateObject("Scripting.Dictionary"): d2.comparemode = 1 Set d3 = CreateObject("Scripting.Dictionary"): d3.comparemode = 1
'тут можно взять данные в массив любым способом a = Range("E2", Cells(Rows.Count, "A").End(xlUp)).Value
On Error Resume Next For i = 1 To UBound(a) t = a(i, 2) If Not d1.exists(t) Then d1.Add t, New Collection d2.Add t, New Collection d3.Add t, New Collection End If d1.Item(t).Add a(i, 1), a(i, 1) d2.Item(t).Add a(i, 5), a(i, 5) d3.Item(t).Add a(i, 4), a(i, 4) Next On Error GoTo 0
ReDim a(1 To d1.Count + 1, 1 To 4) i = 1 a(i, 1) = "Названия строк" a(i, 2) = "n_clients" a(i, 3) = "n_urls" a(i, 4) = "svs_codes"
For Each el In d1.keys t = "": i = i + 1 For Each col In d3.Item(el) t = t & ", " & col Next a(i, 1) = el a(i, 2) = d1.Item(el).Count a(i, 3) = d2.Item(el).Count a(i, 4) = Mid(t, 3) Next
Workbooks.Add.Sheets(1).[a1:d1].Resize(d1.Count + 1) = a End Sub
[/vba] Вместо Distinct тут коллекции. В словарях.Hugo
gwelw, тоже поковырял.. пробовал 2500 строчек.. через формулы больше 5 минут висит.... в файле на 500 на 1-2 минуты. Со сводной удобней.... но если виснет то не вариант. Макрос Hugo то быстро, то помедленней))))
gwelw, тоже поковырял.. пробовал 2500 строчек.. через формулы больше 5 минут висит.... в файле на 500 на 1-2 минуты. Со сводной удобней.... но если виснет то не вариант. Макрос Hugo то быстро, то помедленней))))cmivadwot
Макрос быстро, менее секунды, раз 5 выполнил.. Тормозить может создание книги - ну так можно выводить в уже созданную, или на текущий лист, или на уже добавленный лист, не суть. А файл завис, пришлось выключить пересчёт и тогда его открывать. Вот время 10 раз без выгрузки в книгу массива: 0,015625 1,171875E-02 1,171875E-02 0,0078125 1,171875E-02 0,0078125 1,171875E-02 1,171875E-02 0,0078125 1,171875E-02
Макрос быстро, менее секунды, раз 5 выполнил.. Тормозить может создание книги - ну так можно выводить в уже созданную, или на текущий лист, или на уже добавленный лист, не суть. А файл завис, пришлось выключить пересчёт и тогда его открывать. Вот время 10 раз без выгрузки в книгу массива: 0,015625 1,171875E-02 1,171875E-02 0,0078125 1,171875E-02 0,0078125 1,171875E-02 1,171875E-02 0,0078125 1,171875E-02Hugo
Hugo, да макрос быстро, мне осталось только не понятно... Количество пользоватей.. должны быть только уникалиные.. или один может иметь разный софт и в итоге его нужно считать как два)))
Hugo, да макрос быстро, мне осталось только не понятно... Количество пользоватей.. должны быть только уникалиные.. или один может иметь разный софт и в итоге его нужно считать как два)))cmivadwot
cmivadwot, на скринах ничего не понять, файл опять завис - не успел отключить пересчёт (( Напишите понятно словами как нужно считать, что там не правильно сейчас в макросе, какой результат нужен по этому файлу? Только если будет пример - уберите все формулы ))
cmivadwot, на скринах ничего не понять, файл опять завис - не успел отключить пересчёт (( Напишите понятно словами как нужно считать, что там не правильно сейчас в макросе, какой результат нужен по этому файлу? Только если будет пример - уберите все формулы ))Hugo
Hugo, автор темы не я))) вечером уменьшу до 100 строк и выложу, чтоб не подвисало. Скрины с телефона... На телефоне читабельно. На скрине результат по макросу и формулам. Словами примерно так - если попадаются 2 ивановых с виндой 10 и одинаковыми "к". То макрос их считает за одного.
Hugo, автор темы не я))) вечером уменьшу до 100 строк и выложу, чтоб не подвисало. Скрины с телефона... На телефоне читабельно. На скрине результат по макросу и формулам. Словами примерно так - если попадаются 2 ивановых с виндой 10 и одинаковыми "к". То макрос их считает за одного.cmivadwot
Сообщение отредактировал cmivadwot - Среда, 01.11.2023, 18:05
Hugo, у меня в формуле считает количество услуг "к" у клиента, а потом они перечисляются, а нужно уникальные УРЛ, а потом перечислять услуги "к". Файл открылся? в файле , где сводные... уже вставлено.. посчитано, что получается по формуле, и что получается по макросу ...
Hugo, у меня в формуле считает количество услуг "к" у клиента, а потом они перечисляются, а нужно уникальные УРЛ, а потом перечислять услуги "к". Файл открылся? в файле , где сводные... уже вставлено.. посчитано, что получается по формуле, и что получается по макросу ...cmivadwot
Сообщение отредактировал cmivadwot - Среда, 01.11.2023, 19:48