我是初学者,您能帮我解决这个问题吗?
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)
的结果。
答案 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()
此方法的好处是,如果任一列中的值都发生更改,则该值将自动更新,而无需任何其他干预。