首页 > 解决方案 > 如何使用重复的 SUMIFS 函数缩短 VBA 代码?

问题描述

我根据单元格中值的变化在 VBA 中编写了一些 SUMIFS

例如,单元格 A23 是带有 Total 和 UK 的下拉菜单

If A23 = "Total" Then
Result.Range("A24").Value =     WorkSheetFunction.Sumifs(Range(B:B)),
Range(C:C)), "Year",
Range(D:D)), "Group")

If A23 = "UK" Then
Result.Range("A24").Value = WorkSheetFunction.Sumifs(Range(B:B)),
Range(C:C)), "Year",
Range(D:D)), "Group",
Range(E:E)), "UK")

根据上面的例子,第二个代码是第一个代码的重复,但包含一个额外的范围来选择“英国”

有没有一种方法可以缩短代码,而不是不断地重写它,这样我就可以简单地连接我想要包含的任何其他范围?

所以理想情况下我可以有类似的东西:

Test = Result.Range("A24").Value = WorkSheetFunction.Sumifs(Range(B:B)),
Range(C:C)), "Year",
Range(D:D)), "Group"

If A23 = Total Then
A24 = Test)

If A23 = UK Then
A24 = Test &, Range(E:E), "UK")

这可能吗?如果可以,我该怎么做?

标签: vbafunctionconcatenationrepeatsumifs

解决方案


(这个答案主要是为了回应包含实际代码的第二条评论 - 虽然看起来你正在做的实际操作有点不同?)

因此,正如我所说,您需要通过将单独的部分保存在变量中来简化代码

Dim strFormula as String
Dim rngLIC as Range
Dim rngRegion as Range
Dim rngYear as Range

Set rngLIC = Range(rngHeaders.Find(LIC) , rngHeaders.Find(LIC).End(xlDown))
Set rngRegion = Range(rngHeaders.Find(Year), rngHeaders.Find(Year).End(xlDown))
Set rngYear = Range(rngHeaders.Find(Year), rngHeaders.Find(Year).End(xlDown))

'and I think you'll need to add others for the extra bit you wanted to fix, but you get the pattern

strFormula = "=SUMIFS(" & _
                rngLIC.Address(xlA1) & "," & _
                rngRegion.Address(xlA1) & ", A23," & _
                rngYear.Address(xlA1) & ", ""Year 0"")"

'Then add the replace bit I detailed above if necessary to add bits to the formula

该代码应该希望与您在评论中添加的代码片段完全相同。这有帮助吗?(如果是,请投票,因为我正在努力建立自己的声誉!!)


推荐阅读