在excel中列出flavor名称并给出味道总和

时间:2016-01-26 11:57:03

标签: excel excel-vba vlookup vba

我一直在寻找如何做到这一点,我已经尝试了vlookup并且我可以手动合并数据,但是我想要做的是采取一堆垂直对齐的风味名称在多张纸上,在最后一张纸上抓住所有这些口味,合并它们,然后给我一些总量的调味料。我也试图让它自动更新,因为我更新了我需要的量,以便我做出任何数量的果汁。

我会尝试做一个例子,因为我无法在此处上传表格。

一张可能看起来像这样

French Vanilla  20
Pineapple       16
Sweet Cream     10
Mango           8
Coconut         4
                0
Strawberry      30
NY Cheesecake   20
                0
                0
                0
                0

第二张可能看起来像这样

Passion Fruit    20
Mango            10
Coconut          10
Koolada          2
                 0
                 0

Blueberry Candy  10
Banana Split     6
Strawberry       12
Mango            12
                 0
                 0

我试图做的是获取最后一张表来提取所有这些名称和数字,将匹配的名称放在一起,并添加匹配名称中的数字。我不需要它按字母顺序排列我只需要它自动更新,因为我在第一张纸上输入不同的金额。

2 个答案:

答案 0 :(得分:0)

您还没有说过是否有其他没有数据的工作表,或者数据出现在哪些列中。我已经假设数据总是在A:B列中并且没有&除了那些表之外,工作簿中还有其他任何内容 此代码每次都会创建一个新的报告表 - 运行两次它会崩溃,因为它会尝试创建一个名为“报告”的第二张表。 (所以每次都要删除报告表)。 可能有更好的方法,这个代码肯定可以改进,以满足您的需求。

Public Sub Report()

    Dim wrkSht As Worksheet
    Dim wrkSht_rpt As Worksheet
    Dim lLastRow As Long
    Dim lLastRow_rpt As Long

    'Create a new sheet to put the report on.
    Set wrkSht_rpt = Worksheets.Add
    wrkSht_rpt.Name = "Report"

    'Get the data from each sheet and paste into columns A:B on the report sheet.
    For Each wrkSht In ThisWorkbook.Worksheets
        lLastRow = 0
        With wrkSht
            If .Name <> wrkSht_rpt.Name Then

                'If there's no data in column A this will throw an error.
                On Error Resume Next
                lLastRow_rpt = wrkSht_rpt.Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
                lLastRow = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
                On Error GoTo 0

                If lLastRow > 0 Then
                    'There's data on the sheet, so copy it to the report sheet.
                    .Range(.Cells(1, 1), .Cells(lLastRow, 2)).Copy _
                        Destination:=wrkSht_rpt.Cells(lLastRow_rpt + 1, 1)
                End If
            End If
        End With
    Next wrkSht

    lLastRow = 0
    lLastRow_rpt = 0

    With wrkSht_rpt
        'Find last row in column A on report.
        lLastRow_rpt = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row

        'Copy all flavours to column D.
        .Range(.Cells(1, 1), .Cells(lLastRow_rpt, 1)).Copy _
            Destination:=.Cells(1, 4)

        'Sort the column, this will place all blanks at the bottom.
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=.Range(.Cells(1, 4), .Cells(lLastRow_rpt, 4)), Order:=xlAscending
        .Sort.SetRange .Range(.Cells(1, 4), .Cells(lLastRow_rpt, 4))
        .Sort.Header = xlNo
        .Sort.SortMethod = xlPinYin
        .Sort.Apply

        'Remove duplicates and find new last row in column D.
        'The new last row is stored in a separate variable as we need to original to use
        'within the SUMIF formula.
        .Range(.Cells(1, 4), .Cells(lLastRow_rpt, 4)).RemoveDuplicates 1, xlNo
        lLastRow = .Columns(4).Find("*", , , , xlByColumns, xlPrevious).Row

        'Add a formula to add everything up, then copy paste values.
        With .Range(.Cells(1, 5), .Cells(lLastRow, 5))
            .FormulaR1C1 = _
                "=SUMIF(R1C1:R" & lLastRow_rpt & "C1,RC4,R1C2:R" & lLastRow_rpt & "C2)"
            .Copy
            .PasteSpecial xlPasteValues
        End With

        .Range("A1:C1").EntireColumn.Delete
        .Columns(1).AutoFit

    End With

End Sub

答案 1 :(得分:0)

我已将此作为单独的答案添加,因为它与我的第一个答案完全不同。

在工作簿中的某个位置创建工作表名称列表。例如在A1中放置了Norse Temple 30ML&#39;,在A2 put&#39; Norse Temple 15ML&#39;等等。命名这个范围 - 我在我的例子中将它命名为SheetList。

创建此公式: =SUMPRODUCT(SUMIF(INDIRECT("'" & SheetList & "'!B:B"),"Nicotine 100mg",INDIRECT("'" & SheetList & "'!C:C")))

&#39;尼古丁100毫克&#39;可以用单元格引用替换,以便您可以向下拖动。

此方法将要求您在报告页面上手动创建成分列表,但将为您完成添加。它也会在您更新数字时更新 - VBA方法需要手动执行代码。

如果你想要一个VBA解决方案我可以创建一个 - 只需要找到时间。

链接到我找到解决方案的位置:http://www.mrexcel.com/forum/excel-questions/119020-sumif-multiple-sheets.html