VBA-用于循环的sumifs-是否有更有效的方法?

VBA-用于循环的sumifs-是否有更有效的方法?,vba,excel,sumifs,Vba,Excel,Sumifs,我试图构建一个宏来计算几个SUMIF,在不同的工作表上查找条件。这是我目前掌握的代码: Sub SumPerYear() Dim NoClients As Long NoClients = Worksheets("Temp").Range("A2").End(xlDown).Row - 1 Sheets("Temp").Activate For i = 2 To NoClients + 1 'Fill 2015 € in column E Cells(i, 5).Valu

我试图构建一个宏来计算几个SUMIF,在不同的工作表上查找条件。这是我目前掌握的代码:

Sub SumPerYear()

Dim NoClients As Long
NoClients = Worksheets("Temp").Range("A2").End(xlDown).Row - 1

Sheets("Temp").Activate

For i = 2 To NoClients + 1

    'Fill 2015 € in column E
    Cells(i, 5).Value2 = Application.SumIfs(Worksheets("Q ALL").Range("I:I"), _
        Worksheets("Q ALL").Range("A:A"), 2015, _
        Worksheets("Q ALL").Range("D:D"), Worksheets("Temp").Range("A" & i).Value2, _
        Worksheets("Q ALL").Range("C:C"), True)

    'Fill 2015 # in column F
    Cells(i, 6).Value2 = Application.CountIfs( _
        Worksheets("Q ALL").Range("A:A"), 2015, _
        Worksheets("Q ALL").Range("D:D"), Worksheets("Temp").Range("A" & i).Value2, _
        Worksheets("Q ALL").Range("C:C"), True)

    'Fill 2016 € in column G
    Cells(i, 7).Value2 = Application.SumIfs(Worksheets("Q ALL").Range("I:I"), _
        Worksheets("Q ALL").Range("A:A"), 2016, _
        Worksheets("Q ALL").Range("D:D"), Worksheets("Temp").Range("A" & i).Value2, _
        Worksheets("Q ALL").Range("C:C"), True)

    'Fill 2016 # in column H
    Cells(i, 8).Value2 = Application.CountIfs( _
        Worksheets("Q ALL").Range("A:A"), 2016, _
        Worksheets("Q ALL").Range("D:D"), Worksheets("Temp").Range("A" & i).Value2, _
        Worksheets("Q ALL").Range("C:C"), True)

    'Fill 2017 € in column I
    Cells(i, 9).Value2 = Application.SumIfs(Worksheets("Q ALL").Range("I:I"), _
        Worksheets("Q ALL").Range("A:A"), 2017, _
        Worksheets("Q ALL").Range("D:D"), Worksheets("Temp").Range("A" & i).Value2, _
        Worksheets("Q ALL").Range("C:C"), True)

    'Fill 2017 # in column J
    Cells(i, 10).Value2 = Application.CountIfs( _
        Worksheets("Q ALL").Range("A:A"), 2017, _
        Worksheets("Q ALL").Range("D:D"), Worksheets("Temp").Range("A" & i).Value2, _
        Worksheets("Q ALL").Range("C:C"), True)

    'Fill Tot € in column K
    Cells(i, 11).Value2 = Cells(i, 5) + Cells(i, 7) + Cells(i, 9)

    'Fill Tot # in column L
    Cells(i, 12).Value2 = Cells(i, 6) + Cells(i, 8) + Cells(i, 10)

Next i

End Sub
这段代码可以工作,但因为有数千条记录,所以需要很长时间才能完成。有没有办法提高效率/速度


谢谢你的意见

不幸的是,应用程序方法在大量单元格上工作得太慢,所以您应该编写一些代码,这并不像您的代码那么好和简单。 主要思想如下:

Dim arrA as Variant 'change Variant to your type
Dim arrCD as Variant
Dim arr as Variant
Dim i as long
Dim k as integer
Dim NoClients As Long
NoClients = Worksheets("Temp").Range("A2").End(xlDown).Row - 1

'assign Ranges to arrays
'we can't assign non-contiguous range, so we create two arrays
arrA = Range("A:A")
arrCD = Range("C:D")
ReDim arr(UBound(arrA), 3)
ReDim outArr(NoClients, 5 to 10)
'loop and fill third merged array
For i = 1 To UBound(arrA)
    arr(i, 0) = arrA(i, 1)
    arr(i, 1) = arrCD(i, 1)
    arr(i, 2) = arrCD(i, 2)
Next i

'the rest of code You just loop through
For k = 2 To NoClients + 1 'get client
    For i = 1 To UBound(arr) 'count summuries for him
        if (arr(i,0) = 2016) and (arr(i,1) = true) and (arr(i,2) = _
            Worksheets("Temp").Range("A" & k).Value2) then
            'sumifs replacement
            outArr(k, 5) = outArr(k, 5)  + Worksheets("Q ALL").Cells(1+i, "I").Value2
            'countifs replacement
            outArr(k, 6) = outArr(k, 6) + 1 
        end if
    Next i
Next k

Worksheets("Temp").Range("A2").Value2 = outArr 'prints array on sheet with top left corner at A2

不要使用循环函数-它需要花费太多的时间来完成,那么我如何才能以不同的方式来完成呢?你有什么建议吗?为什么不直接将SUMIF输入第2行,然后将它们复制下来?谢谢你的帮助。我知道您在解决方案(arr)中创建了一个新阵列,这是否会使SUMIF计算更快?你能举一个例子说明在for循环中sumif应该是什么样子吗?@Geert我在一些细节上误解了你的任务,所以代码思想有了一点改变。我们在客户列表中循环,我们根据数据数组计算每个客户的摘要,这些摘要放入outArr二维数组中,其中第一个维度是客户机编号,第二个维度是数据存储。第二个维度命名为(5到10),以便更好地理解索引的含义-它们等于相应的列号。最后一个字符串是打印数组的好技巧。我相信它会工作得更好,因为任何计算,即使是很多计算,在内存中都比在工作表中快得多。