如何编辑总和公式以选择动态范围的单元格?

时间:2017-09-25 21:03:15

标签: excel vba excel-vba excel-formula

我录制了一个宏,确保选择了使用相对引用,但是在运行宏时,sum函数总是选择单元格上方将出现总数的8个单元格,即使我使用 Ctrl + Shift + 向上箭头以选择How the formula was entered正上方的所有非空白单元格:

ActiveCell.FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)

我已经看过以下类似于我想要实现的内容,但是我的反思是如此,并且无法弄清楚如何修改我的代码,它将对每个向上移动的单元进行求和。列,直到它碰到一个空白单元格。

目标是能够在工作表中的不同点输入小计,在这些小点中,小计的总和范围不同。

如果它有助于查看上下文,这就是整个宏的样子:

Sub InsertTotal()
'
' InsertTotal Macro
' Insert blank rows, bold line and total amount
'
' Keyboard Shortcut: Ctrl+y
'
    ActiveCell.Rows("1:2").EntireRow.Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    ActiveCell.Offset(0, 7).Range("A1").Select
    Selection.Font.Bold = True
    ActiveCell.FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)"
    ActiveCell.Offset(-1, -7).Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    ActiveCell.Select
End Sub

任何意见或建议都将是一个巨大的帮助

2 个答案:

答案 0 :(得分:0)

Public Function sumAbove(ByVal CellSelected As Range) As Double
    Dim FirstSelected As Range
    Dim TopMostNonBlankCell As Range

    Set FirstSelected = CellSelected.Cells(1) 'if user inputs more than one cell, we use only the first

    If FirstSelected.Offset(-1).Value2 = vbNullString Then 'we check, if the value above FirstSelected is blank
        Set TopMostNonBlankCell = FirstSelected
    Else 'If it is not blank, we use CTRL+SHIFT+UP
        Set TopMostNonBlankCell = FirstSelected.End(xlUp)
    End If
    'Some error handling should be put above, to handle if the sumAbove is used in first row.

    sumAbove = WorksheetFunction.Sum(Range(TopMostNonBlankCell, CellSelected).Value2)
End Function

EDIT1

要将此功能合并到您的代码中,请尝试使用此功能:
ActiveCell.FormulaR1C1 = "=SUM(" & ActiveCell.Offset(-1).Address(ReferenceStyle:=xlR1C1) & ":" & ActiveCell.Offset(-1).End(xlUp).Address(ReferenceStyle:=xlR1C1) & ")"

解释:

  • 为避免循环引用,我们需要将活动单元格偏移-1行。
  • 您可以简化代码以使用默认的A1引用表示法:ActiveCell.Formula = "=SUM(" & ActiveCell.Offset(-1).Address & ":" & ActiveCell.Offset(-1).End(xlUp).Address & ")"。结果是一样的。
  • 您需要一些异常处理(请参阅上面的函数)。
  • 为了使代码更有效和可读,有些范围变量如Set ActiveCellMinusRow = ActiveCell.Offset(-1),并在我提出的代码中使用它。

答案 1 :(得分:0)

这是我使用的解决方案,因为它涵盖了我将在其将使用的数据集中考虑的所有选项。

If ActiveCell.Offset(-2) = "" Then
    ActiveCell.Formula = "=SUM(" & ActiveCell.Offset(-1).Address & ":" & ActiveCell.Offset(-1).Address & ")"
Else
    ActiveCell.Formula = "=SUM(" & ActiveCell.Offset(-1).Address & ":" & ActiveCell.Offset(-1).End(xlUp).Address & ")"
End If