在Excel中组合重复项,总结一些列并加权平均其他列


2

我有一个包含重复行的大型excel电子表格,我需要将重复项压缩成一行,其中一些列总和,其他列加权平均值。那可能吗?这是一个Google搜索字词列表,有些字词只显示十次其他条款,但在合并时保持数据准确非常重要。

A................B.......C..........D......E......F..........G.....H.....I.......J

Term............Clicks..Impre...AvCTR...AvBid...Cost....AvPos..Conv.£Conv..CRate

advent calendar 5572    147355  0.04    0.12    658.01  5.21    328 2.01    0.06

advent calendar 5719    084078  0.07    0.15    883.38  4.05    234 3.78    0.04

advent calendar 3398    070341  0.05    0.16    540.52  5.58    226 2.39    0.07

advent calendar 3078    108016  0.03    0.09    274.54  4.69    194 1.42    0.06

advent calendar 4948    140714  0.04    0.13    619.11  4.02    184 3.36    0.04

advent calendar 2193    088628  0.02    0.14    312.10  4.69    142 2.20    0.06

advent calendar 0861    077904  0.01    0.11    097.07  5.89    036 2.70    0.04

advent calendar 0104    000635  0.16    0.12    012.63  2.03    004 3.16    0.04

advent calendar 0034    000927  0.04    0.11    003.82  4.53    002 1.91    0.06

advent calendar 0007    000082  0.09    0.11    000.76  5.09    001 0.76    0.14

我想将上面的内容转换成下面而不用手动操作? I.E.删除重复项并将B,C,F和H相加,并对D,E,G,I和J进行加权平均。

这是一个非常大的电子表格的一部分。

advent calendar 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列I.它不希望是通过转换加权或通过转换加权的点击加权平均加权,或者通过计算总费用除以总转化次数之后计算得出(我之前处理过)我通过删除数字并输入零来运行宏。


我不是Excel专家,因此不确定是否可以使用它,但它是数据库工具的标准配置。您可能希望查看像Microsoft Access这样的产品,这种产品在没有太多技术知识的情况下使用起来非常简单,如果您正在从事像PPC广告这样的分析驱动的工作,那么学习它的投资可能是非常值得的。您可以下载Access的试用版以查看它是否适合您,或者您可以查看OpenOffice Base等免费工具;但是,我认为MS Office比OpenOffice更加精致和易于使用。

Answers:


1

每个代码行都有注释。因此,它很容易适应类似任务的代码

它能做什么

  • 此VBA宏组合了复制工作表中的所有唯一行。
    它查看A列值以确定哪个列是重复的
  • 它总结了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

如果您能够将结果信息放在另一张表格中......

将A列复制到新工作表,然后选择新列并转到数据/删除重复项(或选择数据并按 Alt键 + 一个 中号 )。

对于需要的数据

  • 总结, =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行,每行包含一个搜索词及其数据,其中一些搜索词是相同的但有单独的数据。我需要在工作表中找到唯一的术语,但我需要获得与已删除的重复项相关联的所有数据,即在上面的示例中,我需要一行“advent calendar”和总点击次数,总展示次数从删除的行中获得的等等?干杯理查德(住在英国柴郡!)很奇怪?
RichardR

现在您有了数据列表(在新工作表的A列中没有重复项,您可以在添加旧数据的所有总计时引用该数据。例如,假设 advent calendar 那是在A2 =SUMIF(OldData!A:A,newData!A2,OldData!B:B) 会从原始表格中给出总共B栏中所有数字的相应数字 advent calendar 在原始工作表的A列中
SeanC

谢谢你的帮助,我无法完成这项工作。然而,你的一个论坛朋友制作了一个完美完成工作的宏。
RichardR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.