Excel宏用于填充矩阵,其中包含具有条件的单元格中的单元格的总和

时间:2013-05-08 08:31:50

标签: excel excel-vba excel-2007 vba

我有一张excel工作簿,每天都在工作表上(不是连续几天),看起来像是ExampleSheet1。所有工作表都包含一个空列表事件,每个事件都有唯一的ID和名称。如果事件发生,则记录时间开始和结束时间,Excel计算事件的持续时间(以及其他)。

ExampleSheet1

   A         B        C            D        E        F
1  id        name     date         start    end      duration
2  100       foo      10.07.2013   16:00    18:30    2,50
3  101       bar      10.07.2013                         0,00
4  102       aaa      10.07.2013   12:00    3:30     15,50
5  103       bb       10.07.2013   10:00    12:00    2,00
6  104       ccc      10.07.2013   9:00     11:00    2,00

我希望自动计算概览,其中每个事件的持续时间按月汇总,如ExampleSheet2的C,D和E列。

ExampleSheet2

   A       B       C            D               E        
1  id      name    total in     total in        total in
                   2013-07      2013-08         2013-09
2  100     foo     12,00        34,00           ...
3  101     bar     32,00        12,50           ..
4  102     aaa     35,50        123,00
5  103     bb      3,00         5,00
6  104     ccc     8,00         4,50

SUMIF不适用于多个工作表,所以我首先想到的是从ExampleSheet2的C,D和E列的每一行调用类似下面的函数。但这会导致相当多的迭代,似乎是一个非常难看的解决方案。

function counter(targetID As Integer, targetDate As Integer)

    Integer i = 0
    for each worksheet in workbook(
        for each row(
            if column1 == targetID; then
                if month(column3) == targetDate; then
                    i = i + column6
        )

    )
    return i

由于我不熟悉Excel宏并且必须将Google和这些代码粘贴在一起,因此我会提示如何处理这个问题。感谢。

1 个答案:

答案 0 :(得分:0)

您不需要使用VBA。您可以使用SUMIF和INDIRECT的混合来在多个工作表上实现SUMIF。在下面的例子中,我在Sheet1和Sheet2的A列中有我的虚拟ID,在这些表的B列上有我的虚拟数据。在第三张纸的F栏中,我有我的纸张名称,在C栏中我添加了这个公式:

=SUM(SUMIF(INDIRECT($F$1:$F$2&"!"&"A1:A100"), A1, INDIRECT($F$1:$F$2&"!"&"B1:B100")))

现在这是一个数组公式,所以当你输入它时你想要按CTRL + SHIFT + ENTER来计算它作为一个数组,否则你将只得到第一页上的总和。

此解决方案很多 *多*更清洁。它唯一的“脏”部分是您需要在工作簿中的某个位置列出工作表名称以引用它们。如果您有很多工作表,可以使用一个简单的宏来遍历所有工作表并输出它们的名称以形成列表。

最后,您需要注意每次都需要在列表中添加工作表名称并更新范围以确保公式中包含所有内容。

编辑:不言而喻,您应该根据您的具体需求调整我的公式。我假设你知道如何使用SUMIF和SUMIFS,所以你现在应该知道如何使它适用于多个工作表。