如何在VBA中减去2个或更多动态列的总和?

时间:2019-07-17 17:30:06

标签: vba dynamic sum

我是初学者,您能帮我解决这个问题吗?

2个动态列“ F:G”,我需要对每个列求和,然后在不使用宏录制的情况下减去结果-(我不希望用户查看公式)

我尝试了下面的代码,但是它没有返回减去F-G列的结果,而是返回了最后一行的最后一个单元格的减法。

Sub testsum()
    Dim B As Integer
    Dim W As Integer
    Dim LastCell As String

    ActiveSheet.Select
    Range("F3").Select
         Selection.End(xlDown).Select
         LastCell = ActiveCell.Address(False, False)
         ActiveCell.Offset(1, 0).Select
         ActiveCell.Value = "=sum(f3:" & LastCell & ")"

    Range("G3").Select
         Selection.End(xlDown).Select
         LastCell = ActiveCell.Address(False, False)
         ActiveCell.Offset(1, 0).Select
         ActiveCell.Value = "=sum(G3:" & LastCell & ")"

    Worksheets(1).Range("G1").Value = B - W

End Sub

我希望在其他工作表上重新创建=Sum(F:F)-Sum(G:G)的结果。

1 个答案:

答案 0 :(得分:0)

建议您避免在代码中使用.Select。在某些情况下,您可能需要使用它,但是普通的VBA用户可能永远都不会遇到在生命周期中必须使用.Select的单个实例。

首先,我们想将工作表设置为一个包含要查看的列的变量。然后,我们要分配两个单独的范围-一个用于F列,一个用于G。这样可以更轻松地管理范围,并且通常可以使代码更简洁,更易于阅读。

然后将范围加到自己的变量中,最终结果将是它们的减去。

Sub TestSum()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)

    Dim RngF As Range, RngG As Range
    Set RngF = ws.Range(ws.Range("F3"), ws.Cells(lastRow(ws, "F"), "F"))
    Set RngG = ws.Range(ws.Range("G3"), ws.Cells(lastRow(ws, "G"), "G"))

    Dim SumF As Long, SumG As Long
    SumF = Application.WorksheetFunction.Sum(RngF)
    SumG = Application.WorksheetFunction.Sum(RngG)

    ws.Range("G1").Value = SumF - SumG

End Sub

Function lastRow(ByVal ws As Worksheet, Optional ByVal col As Variant = 1) As Long
    lastRow = ws.Cells(ws.Rows.Count, col).End(xlUp).Row
End Function

但是,您可以创建自己的自定义公式-更好地称为UDF( U ser D 定义的 F 连接)。我了解您不希望用户看到原始公式,但是我不确定您对隐藏所有内容的感觉如何,而只看到名称。

所有操作均与上述操作相同-除了不是让Sub将值应用于工作表,而是将值分配给函数本身。

Function getSum() As Long

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)

    Dim RngF As Range, RngG As Range
    Set RngF = ws.Range(ws.Range("F3"), ws.Cells(lastRow(ws, "F"), "F"))
    Set RngG = ws.Range(ws.Range("G3"), ws.Cells(lastRow(ws, "G"), "G"))

    Dim SumF As Long, SumG As Long
    SumF = Application.WorksheetFunction.Sum(RngF)
    SumG = Application.WorksheetFunction.Sum(RngG)

    getSum = SumF - SumG

End Function

Function lastRow(ByVal ws As Worksheet, Optional ByVal col As Variant = 1) As Long
    lastRow = ws.Cells(ws.Rows.Count, col).End(xlUp).Row
End Function

然后在工作表的G1中,键入以下公式:

=getSum()

此方法的好处是,如果任一列中的值都发生更改,则该值将自动更新,而无需任何其他干预。