我录制了一个宏,确保选择了使用相对引用,但是在运行宏时,sum函数总是选择单元格上方将出现总数的8个单元格,即使我使用 Ctrl +
Shift +
向上箭头以选择正上方的所有非空白单元格:
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
任何意见或建议都将是一个巨大的帮助
答案 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
要将此功能合并到您的代码中,请尝试使用此功能:
ActiveCell.FormulaR1C1 = "=SUM(" & ActiveCell.Offset(-1).Address(ReferenceStyle:=xlR1C1) & ":" & ActiveCell.Offset(-1).End(xlUp).Address(ReferenceStyle:=xlR1C1) & ")"
解释:
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