【问题标题】:How to shorten VBA code using repeated SUMIFS function?如何使用重复的 SUMIFS 函数缩短 VBA 代码?
【发布时间】:2020-10-09 16:38:45
【问题描述】:

我已经根据单元格中值的变化在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")

根据上面的示例,第二个代码是第一个代码的重复,但包含一个额外的范围以选择“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")

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

【问题讨论】:

    标签: vba function concatenation repeat sumifs


    【解决方案1】:

    (发布此答案主要是为了回应第二条评论,其中包含实际代码 - 尽管看起来您正在执行的实际操作有点不同?)

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

    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
    
    

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

    【讨论】:

    • 现在的问题是我想做一个 For Next 循环的地方。所以对于 a = 0 到 7 Result.Cells(27 + a, 2).Value = WorksheetFunction.Sumifs(Range........
    • 抱歉,这个问题描述的不是很清楚?出了什么问题?如果您希望范围向下移动或其他什么,那么只需在每个循环的末尾添加一行来表示例如set rngLIC = rngLIC.Offset(a, 0)
    【解决方案2】:

    您可以在单元格中输入实际函数,而不是在 vba 中进行worksheetfunction 计算吗? (做工作表函数计算不会真正在单元格中输入公式,只是返回输出值)

    可能是这样的:

    Dim strFormula as String
    strFormula = "=SUMIFS(B:B, C:C, ""Year"", D:D, ""Group"")"
    'Thats the basic formula
    
    If Result.Range("A23").Value = "UK" Then
        strFormula = replace(strFormula, ")", "E:E, ""UK"")")
        'that replaces the end bracket with the extra condition
    End If
    
    Result.Range("A4").FormulaA1 = strFormula
    

    【讨论】:

    • 如果你只想要最后的输出值,而不是留下的公式,你总是可以在之后添加一行来解决这个问题,比如 Result.Range("A4").FormulaR1C1 = Result.Range("A4").Value 也许......
    • 谢谢,当我尝试使用 _ 换行时,出现预期的语句结束错误。我正在使用的实际代码是 WorksheetFunction.SumIfs(Range(rngHeaders.Find(LIC) , rngHeaders.Find(LIC).End(xlDown)), _ Range(rngHeaders.Find(Region), rngHeaders.Find(Region ).End(xlDown)), Result.Range(A23), _ Range(rngHeaders.Find(Year), rngHeaders.Find(Year).End(xlDown)), "Year 0")
    • 当我尝试执行 For Next 循环时,不确定这是否有效
    • 预期的语句结束错误 - 您是否尝试在文本字符串中插入换行符?如果是这种情况,您需要结束字符串(放入双引号 " ),然后放入 '&' 和换行符(按任意顺序),然​​后在下一行再次恢复字符串。有效地添加将字符串的两个单独部分放在一起。
    • 不过,看看你的代码,dim 一个负载范围也可能是更好的做法,而不是在公式的中途进行所有这些 .find 操作并混淆事情......跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多