Sumif跨多个工作表,特定行和列

时间:2015-12-17 18:00:25

标签: excel vba excel-vba

我有20张(为简单起见,我们说三张),我需要将每张纸张与一张主要标签相加,其中包含所有数据。每个工作表用于不同的业务实体,但每个工作表具有相同的格式:

Format: Business 1000 Format: Business 1000

Format: Business 2000 Format: Business 2000

我将每月数据插入DATA选项卡,并需要一个宏进入工作表1,2,3等,并针对匹配B列(业务单位代码)的DATA选项卡运行一个sumif。我也将每月运行一次,因此Row3将具有实际或预测。

问题:

  • DATA标签被删除并重置下个月的数据,因此所有sumif必须更改为值。
  • 并非所有行都相同,有些可能有5-6个项目,然后是总和的总和,例如:旅行可能包括酒店,停车,用餐,汽车租赁。所以SumIF只能在B列有代码的地方运行。否则不要做任何事。
  • 我不知道如何在sumif中编写相对引用。我可以通过VBA对列进行编码,并告诉它在每个非空白单元格中输入“Text”。虽然我不能告诉它改变或有相关的细胞数据。

然后对于下个月(当数据选项卡被重置时)必须填写下一列。如果它更简单,我可以在活动月份的列中添加另一行X,因此宏可以检查是否存在X该行,然后对该列进行总和。

运行求和很简单,如果将粘贴复制到所有非空白行,然后仅重新复制为值。但是当我有20多张床单时,并不是每个月都需要这样做。

1 个答案:

答案 0 :(得分:0)

好的,这里有一个你想做的例子。在这个例子中,我已经把它留给你在本月填写的代码中设置代码。

更改Const ColumnNumber = 4的值以更改本月填写的列4=D, 5=E etc(道歉我只在R1C1参考样式中工作)。

FirstRow似乎总是4,但我已将其保留在那里,以防您需要更改它。

Worksheetfunction.sumif以与正常sumif相同的顺序获取参数,因此我传入数据表的第1列中的范围,与条件相同的行的单元格c,以及数据表的第2列作为和范围。

使用worksheetfunction.sumif会将值返回到单元格,而不是公式,以便解决数据表被删除和重新创建的问题。

我也留下了让你用其他东西填充绿色行的选项。

    Const ColumnNumber = 4
    Const FirstRow = 4

    Sub LoopSomeSheets()

        Dim sht As Worksheet

        'go through each sheet in the workbook
        For Each sht In ThisWorkbook.Sheets
            'ignore the sheet named "data"
            If sht.Name <> "data" Then

                Dim LastRow As Long
                'figure out where the sheet ends
                LastRow = sht.cells.SpecialCells(xlCellTypeLastCell).Row

                'variable to sum totals
                Dim RunningTotal as Double 

                For i = FirstRow To LastRow

                    If sht.Cells(i, 3).value = "SUM" Then
                        'Put the total value in the sum cell
                        sht.Cells(i, ColumnNumber).value = RunningTotal
                        'reset the total for the next group
                        RunningTotal = 0
                    Else

                        Dim SumOfData as Double
                        'get the sumif value
                        SumOfData = _
                         WorksheetFunction.SumIf(Sheets("data").Columns(1), sht.Cells(i, 2), Sheets("data").Columns(2))
                        'add to the running total
                        RunningTotal = RunningTotal + SumOfData 
                        'then update the cell
                        sht.Cells(i, ColumnNumber).value = SumOfData 
                    End If
                Next i
            End If
        Next sht
    End Sub