Об'єднайте дублікати в Excel, підсумовуйте деякі стовпці та зважуйте середнє значення інших


2

У мене є велика таблиця Excel із дублюючими рядками, мені потрібно згустити дублікати в один рядок з деякими підсумками стовпців, а інші середньозваженими. Це можливо? Це перелік пошукових термінів Google, а деякі терміни відображаються десять разів інші, лише один раз, але важливо для збереження даних точними під час об’єднання.

А ................ Б ....... С .......... Д ...... Е ...... F .......... G ..... H ..... I ....... J

Термін ............ Кліки..Попередження ... AvCTR ... AvBid ... Вартість .... AvPos..Conv. £ Conv..CRate

календар пригод 5572 147355 0,04 0,12 658,01 5,21 328 2,01 0,06

календар пригод 5719 084078 0,07 0,15 883,38 4,05 234 3,78 0,04

календар пригод 3398 070341 0,05 0,16 540,52 5,58 226 2,39 0,07

календар пригод 3078 108016 0,03 0,09 274,54 4,69 194 1,42 0,06

календар пригод 4948 140714 0,04 0,13 619,11 4,02 184 3,36 0,04

календар пригод 2193 088628 0.02 0.14 312.10 4.69 142 2.20 0.06

календар пригод 0861 077904 0.01 0,11 097.07 5.89 036 2.70 0.04

календар пригод 0104 000635 0,16 0,12 012,63 2,03 004 3,16 0,04

календар пригод 0034 000927 0,04 0,11 003,82 4,53 002 1,91 0,06

календар календаря 0007 000082 0,09 0,11 000,76 5,09 001 0,76 0,14

Я хочу перетворити вищезазначене на нижче, не роблячи це вручну? IE видаляють дублікати і суму B, C, F і H і роблять середньозважене на D, E, G, I і J.

Це частина дуже великої електронної таблиці.

календар пригод 25914 718680 0,04 0,13 3401,94 4,68 1351 2,68 0,05

Я міг би задовольнити лише середнє значення D, E, G, I та J

Я обчислюю середньозважене значення, поділяючи кліки в даних рядків на загальну кількість кліків за це дублюване слово, множуючи цей дріб на дані комірки, а потім підсумовуючи стовпець дублікатів. Сума для загальної суми виглядала приблизно так: = ($ B2 / $ B15 * E2) + ($ B3 / $ B15 * E3) + ($ B4 / $ B15 * E4) + ($ B5 / $ B15 * E5) + ($ B6 / $ B15 * E6) + ($ B7 / $ B15‌ * E7) + ($ B8 / $ B15 * E8) + ($ B9 / $ B15 * E9) + ($ B10 / $ B15 * E10) + ($ B11 / $ B15 * E11)

Я помилився у своєму запиті для стовпця £ / conv. Він НЕ хоче, щоб він був середнім зваженим числом кліків, він хоче бути зважений конверсіями АБО як я це зробив, обчислюючи згодом від загальної вартості, поділеної на загальна кількість конверсій (я займався цим, перш ніж запускати макрос, видаляючи фігури і вводячи нулі).


Я не експерт Excel, тому не впевнений, чи можливо це використовувати, але це досить стандартні речі для інструменту бази даних. Можливо, ви захочете подивитися на такий продукт, як Microsoft Access, який надзвичайно простий у використанні без зайвих технічних знань, і інвестиції в його вивчення можуть бути вартими зусиль, якщо ви працюєте в роботі, керованій аналізом, як реклама PPC. Ви, ймовірно, можете завантажити пробну версію Access, щоб перевірити, чи підходить вона вам, або ви можете подивитися на безкоштовний інструмент, наприклад, OpenOffice Base; однак, я думаю, що MS Office набагато більш відшліфований та простий у використанні, ніж OpenOffice.

Відповіді:


1

Кожен рядок коменту коментується. Тож легко адаптувати код для подібних завдань

Що це робить

  • Цей макрос VBA поєднує всі унікальні рядки у скопійованому аркуші.
    Він розглядає значення стовпця А, щоб визначити, який стовпець є дублікатом
  • Він підсумовує стовпці B, C, F і H.
  • він обчислює середнє значення для D, E, G, I та J.
    Він не використовує середньозваженого, оскільки я досі не знаю, як саме ви їх обчислюєте

Як використовувати

  • відкрийте робочу книжку даних і натисніть ALT+F11
  • скопіюйте та вставте код десь або в новий модуль
  • налаштувати, AVcols()і SUMcols()якщо ви хочете обчислити суму чи середнє значення в інших стовпцях
  • закрийте редактор VBA і виберіть / перегляньте аркуш, який потрібно комбінувати
  • натисніть ALT+ F8та виконайте макросcombineduplicates

Sub combineduplicates()                 '### starts our macro
Application.ScreenUpdating = False      '### Excel wont update its screen while executing this macro. This is a huge performace boost
Dim AVcols()                            '### declare an empty array for our average columns
Dim SUMcols()                           '### declare a second empty array for our sum columns
Dim AVtemp()                            '### declare a third empty array for our temporal values we need to calculate a weighted average

AVcols() = Array(4, 5, 7, 9, 10)        '### we use the first array to store our columns for calculating an average
SUMcols() = Array(2, 3, 6, 8)           '### the second array stores the columns which should be summed up
Mcol = 2                                '### whats the multiplier column for our weighted average?

ActiveSheet.Copy Before:=Sheets(1)      '### take a copy of our activesheet. this way we don't touch the original data
'### the next line sets our range for searching dublicates. Starting at cell A2 and ending at the last used cell in column A
Set searchrange = Range([A2], Columns(1).Find(what:="*", after:=[A1], searchdirection:=xlPrevious))
For Each cell In searchrange            '### now we start looping through each cell of our searchrange

    ReDim AVtemp(UBound(AVcols) + 1, 0) '### make our temp array 2-dimensional and reser it from the previous loop
    For i = 0 To UBound(AVcols)         '### save values from start row for average calculating into the temp array
        AVtemp(i, UBound(AVtemp, 2)) = CDbl(Cells(cell.Row, AVcols(i)))     '### still filling the temp array
    Next i                              '### go ahead to the next column
    AVtemp(UBound(AVcols) + 1, UBound(AVtemp, 2)) = CDbl(Cells(cell.Row, Mcol)) '### save the clicks too

    Set search = searchrange.Find(cell, after:=cell, lookat:=xlWhole)   '### searches for a dublicate. If no dub exists, it finds only itself
    Do While search.Address <> cell.Address     '### until we find our starting cell again, these rows are all dublicates

        For i = 0 To UBound(SUMcols)    '### loop through all columns for calculating the sum
            '### next line sums up the cell in our starting row and its counterpart in its dublicate row
            Cells(cell.Row, SUMcols(i)) = CDbl(Cells(cell.Row, SUMcols(i))) + CDbl(Cells(search.Row, SUMcols(i)))
        Next i                          '### go ahead to the next column

        ReDim Preserve AVtemp(UBound(AVcols) + 1, UBound(AVtemp, 2) + 1)    '### expand the temp array so we have enough space to fill with values
        For i = 0 To UBound(AVcols)     '### loop through all columns for calculating the weighted average
            '### the next line saves the value in our temp array, but now for the duplicate rows
            AVtemp(i, UBound(AVtemp, 2)) = CDbl(Cells(search.Row, AVcols(i)))
        Next i                          '### go ahead to the next column
        AVtemp(UBound(AVcols) + 1, UBound(AVtemp, 2)) = CDbl(Cells(search.Row, Mcol))   '### save the clicks too

        search.EntireRow.Delete         '### we are finished with this row. Delete the whole row
        Set search = searchrange.Find(cell, after:=cell)    '### and search the next dublicate after our starting row
    Loop

    If search.Row = cell.Row Then       '### ok, now we have to calculate the average. All needed values are temporarly stored in our temp array
        For i = 0 To UBound(AVcols)     '### start with looping through all average columns
            average = 0                 '### reset the variable from the last loop
            For j = 0 To UBound(AVtemp, 2)              '### start looping through the data from all dublicated rows
                clicks = AVtemp(UBound(AVcols) + 1, j)  '### take the clicks for that row from the array
                sumclicks = Cells(cell.Row, Mcol)       '### take the summed up  clicks for all dublicated rows
                addaverage = AVtemp(i, j)               '### take the value which should be multiplied
                average = average + (clicks / sumclicks * addaverage)   '### now calculate the weighted average and sum it up with the old one
            Next j                      '### goto next data of dublicate rows
            Cells(cell.Row, AVcols(i)) = average    '### when finished with calculating, write the result to the workbook
        Next i                          '### go ahead to the next average column
    End If                              '### only the end line of our condition

Next                                    '### from here we start over with the next cell of our searchrange
                                        '### Note: This is a NEW unique value since we already deleted all old dublicates
Application.ScreenUpdating = True       '### re-enable our screen updating
End Sub                                 '### ends our macro

Погляньте на мою тестову робочу книжку, якщо у вас виникли проблеми із запуском макросу.


Шановна Ніксда, це геніально. Дивовижно, що це дозволило мені об’єднати дані з понад тисячі дублікатів і зробити мої наступні кілька тижнів набагато кращими. СПАСИБІ. Молодці.
RichardR

Я радий, що це допомогло. якщо ви покажете, як ви підраховуєте середньозважену кількість, я можу допомогти трохи більше. З якими стовпцями помножуються "середні значення"? Відредагуйте своє початкове запитання, якщо ви хочете.
nixda

Я обчислюю середньозважене значення, поділяючи кліки в даних рядків на загальну кількість кліків за це дублюване слово, множуючи цей дріб на дані комірки, а потім підсумовуючи стовпець дублікатів. Сума для загальної суми виглядала приблизно так: = ($ B2 / $ B15 * E2) + ($ B3 / $ B15 * E3) + ($ B4 / $ B15 * E4) + ($ B5 / $ B15 * E5) + ($ B6 / $ B15 * E6) + ($ B7 / $ B15 * E7) + ($ B8 / $ B15 * E8) + ($ B9 / $ B15 * E9) + ($ B10 / $ B15 * E10) + ($ B11 / $ B15 * E11) Ця сума була на тестовому аркуші, який мав десять рядів. Як ви думаєте, ви могли б це зробити в макросі? Ура: Ричард
RichardR

Зроблено. Дивіться редагування. Я замінив середній розрахунок середньозваженим обчисленням
nixda

Привіт, дивовижно. Ви не повірите, що у мене виникли проблеми з цим, це дало мені повідомлення про помилку переповнення часу запуску, проте я скоротив аркуш за розміром. Поки я не сортував аркуш розсилу за клацаннями! Тоді це було добре, це не сподобалось аркушу ні в пошуковій терміні, ні в порядку перетворення. Ще раз дякую вам. Там повинні бути інші з такими звітами Google, як моя!
RichardR

1

Якщо ви можете стояти, розміщуючи отриману інформацію на іншому аркуші ...

Скопіюйте стовпець А на новий аркуш, потім виберіть новий стовпець та перейдіть до Дані / Видалити копії (або виберіть дані та натисніть Alt+ A, M).

Для даних, які повинні бути

  • підсумовано, =SUMIF(OriginalData!A:A,NewData!A2,OriginalData!B:B)
  • середнє зважене, SUMPRODUCT(OldData!B2:B1000,OriginalData!D2:D1000,--(OriginalData!A2:A1000=NewData!A2)/SUMIF(OriginalData!A:A,OriginalData!A2,OriginalData!B:B)
    • зауважте, що ви можете замінити клітинку зі свого нового аркуша на SUMIF; це, можливо, те саме

Я з радістю покладу інформацію на інший аркуш. Я бачу, як видалити дублікати, але я не можу зрозуміти, що ви маєте на увазі після цього? Мій звіт про пошук містить 5000 рядків з кожним пошуковим терміном та його даними, деякі з цих пошукових термінів ідентичні, але мають індивідуальні дані. Мені потрібно знайти унікальні терміни на аркуші, але мені потрібно мати всі дані, які були пов’язані з видаленими дублікатами, тобто у наведеному вище прикладі мені потрібен один рядок із "календарем надходження" та загальним числом кліків, загальним числом показів тощо, зібрані з видалених рядків? вітає Річарда (живе в Чеширі, Великобританія!) дивно?
RichardR

тепер у вас є ваш список даних (без дублікатів у стовпці А нового аркуша, ви можете посилатися, що при складанні всіх підсумків від старих даних. Наприклад, якщо припустити advent calendar, що в А2, то =SUMIF(OldData!A:A,newData!A2,OldData!B:B)ви отримаєте загальну кількість усіх цифр у стовпець B з вашого оригінального аркуша, де він відповідає відповідній advent calendarколонці A оригінального аркуша
SeanC

Дякую за допомогу, я не зміг зробити цю роботу. Однак один з ваших друзів на форумі створив макрос, який виконав цю роботу ідеально.
RichardR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.