【问题标题】:VBA: adding up irregular rangesVBA:添加不规则范围
【发布时间】:2016-08-23 08:52:51
【问题描述】:

我需要一些帮助来创建一个宏,该宏将 E 列上的所有值添加到带有“avg”字样的行之间。结果应显示在显示“Sum here”标签的单元格上。文本“avg”和“sum here”都只是为了说明示例,“avg”可以替换为任何其他单词,“sum here”实际上应该是它上面的值的聚合。

真正的挑战是 E 列上的范围数是可变的,所以我想找到一个能够处理 E 列上“n”个范围的宏。

最后,D 列的值只是“sum here”单元格的期望值的示例。

这是我迄今为止尝试过的:

        Sub Macro1()
'
' Macro1 Macro
'
Dim sumhere As Range
Dim startingpoint As Range
Dim endingpoint As Range

'
    Range("C17").Select
    Selection.End(xlDown).Select
    If ActiveCell = "avg" Then
        ActiveCell.Offset(rowoffset:=0, columnoffset:=2).Select
        
        
        Set sumhere = ActiveCell
        Set startingpoint = ActiveCell.Offset(rowoffset:=-1, columnoffset:=0)
        
        
        Selection.End(xlUp).Select
        If (ActiveCell.Value) = "Sum here" Then
        Set endingpoint = ActiveCell.Offset(rowoffset:=1, columnoffset:=0)
        sumhere.Formula = "=sum(range(startingpoint:endingpoint)"
        
        
            
        Else
        Selection.End(xlUp).Select
        If (ActiveCell.Value) = "Sum here" Then
        Set endingpoint = ActiveCell.Offset(rowoffset:=1, columnoffset:=0)
        sumhere.Formula = "=Sum(Range(startingpoint.adress:endingpoint.adress))"
        
     
        Else: End If
        End If
    
    End If

End Sub

此外,如您所见,我不知道如何使用变量定义范围。我最初的想法是将此代码与某种“do while”或/和“for i= 1 to x”和“next i”结合起来。但我看不到如何组合它。

【问题讨论】:

  • 您好!请向我们展示您的尝试?
  • 首先将总数设置为 0,然后循环遍历每一行,或者 (a) 如果 C 列不是“avg”(或您使用的任何值),然后将 E 列的值添加到总计,或 (b) 如果 C 列是“平均”(或您使用的任何内容),则将总计写入 E 列并将总计再次设置为 0。

标签: vba excel sum range


【解决方案1】:

仅使用公式,并提供 A 列在每个小计行上只有 avg(或任何文本)。

我给出了公式的两个版本 - 易失版本(每次更改电子表格上的任何内容时都会更新)和非易失版本(仅在需要时更新)。

公式应在第 6 行输入 - 将 $E6 更改为您需要的任何行。

(易失性)

=SUM(OFFSET($E6,IFERROR(LOOKUP(2,1/($A$1:INDEX($A:$A,ROW()-1)<>""),ROW($A$1:INDEX($A:$A,ROW()-1))),0)-ROW()+1,,ROW()-1-IFERROR(LOOKUP(2,1/($A$1:INDEX($A:$A,ROW()-1)<>""),ROW($A$1:INDEX($A:$A,ROW()-1))),0)))

(非易失性):

=SUM(INDEX($E:$E,IFERROR(LOOKUP(2,1/($A$1:INDEX($A:$A,ROW()-1)<>""),ROW($A$1:INDEX($A:$A,ROW()-1))),0)+1):INDEX($E:$E,ROW()-1)) 

或者如果您不介意使用辅助列:

在 B6 单元格中:

=IFERROR(LOOKUP(2,1/($A$1:INDEX($A:$A,ROW()-1)<>""),ROW($A$1:INDEX($A:$A,ROW()-1))),0)

在 E6 中:(易失性)

=SUM(OFFSET($E6,$B6-ROW()+1,,ROW()-1-$B6))

或(非易失性):

=SUM(INDEX($E:$E,$B6):INDEX($E:$E,ROW()-1))

编辑: 如果您使用 VBA,我想我会添加一个 UDF 来计算它。

在您希望显示小计的行中使用函数=AddSubTotal(),或使用=AddSubTotal("pop",6) 使用“pop”而不是“avg”对列 F(第 6 列)中的所有内容求和。

Public Function AddSubTotal(Optional Delim As String = "avg", Optional ColNumber = 5) As Double

    Dim rCaller As Range
    Dim rPrevious As Range
    Dim rSumRange As Range

    Set rCaller = Application.Caller

    With rCaller.Parent
        Set rPrevious = .Range(.Cells(1, 1), .Cells(rCaller.Row - 1, 1)).Find(Delim, , , , , xlPrevious)
        If Not rPrevious Is Nothing Then
            Set rSumRange = rPrevious.Offset(1, ColNumber - 1).Resize(rCaller.Row - rPrevious.Row - 1)
        Else
            Set rSumRange = .Range(.Cells(1, ColNumber), .Cells(rCaller.Row - 1, ColNumber))
        End If
    End With

    AddSubTotal = WorksheetFunction.Sum(rSumRange)

End Function

【讨论】:

    【解决方案2】:

    以下 VBA 例程假定

    • 您的数据位于 C:E 列中
    • 在该范围内没有其他相关(没有数字)
    • 您要显示总和的“关键字”是avg
    • avg(关键字)在宏中被硬编码

    您可以轻松地修改此例程以执行这些值的平均值,并将这些结果放在例如 D 列中

    以上任何一项都很容易修改


    Option Explicit
    Sub TotalSubRanges()
        Dim vSrc As Variant, rSrc As Range
        Dim dAdd As Double
        Dim I As Long
        Const sKey As String = "avg"
    
    Set rSrc = Range(Cells(1, "C"), Cells(Rows.Count, "C").End(xlUp)).Resize(columnsize:=3)
    vSrc = rSrc
    
    'Do the "work" in a VBA array, as this will
    '  execute much faster than working directly
    '  on the worksheet
    
    For I = 1 To UBound(vSrc, 1)
        If vSrc(I, 1) = sKey Then
            vSrc(I, 3) = dAdd
            dAdd = 0
        Else
            If IsNumeric(vSrc(I, 3)) Then dAdd = dAdd + vSrc(I, 3)
        End If
    Next I
    
    'write the results back to the worksheet
    ' and conditionally format the "sum" cells
    With rSrc
        .EntireColumn.Clear
        .Value = vSrc
        .Columns(3).AutoFit
        .EntireColumn.ColumnWidth = .Columns(3).ColumnWidth
        .FormatConditions.Delete
        .FormatConditions.Add _
            Type:=xlExpression, _
            Formula1:="=" & .Item(1, 1).Address(False, True) & "=""" & sKey & """"
            With .FormatConditions(1)
                .Interior.ColorIndex = 6
            End With
    End With 
    
    End Sub
    

    【讨论】:

      【解决方案3】:

      当然你只需要这样的东西:

      Sub sums()
      Dim i As Integer, j As Integer, k As Integer
      
      j = Range("C1048576").End(xlUp).Row
      k = 1
      
      For i = 1 To j
          If Range("C" & i).Value <> "" Then
              Range("E" & i).Value = "=Sum(E" & k & ":E" & i - 1 & ")"
              k = i + 1
          End If
      Next i
      
      End Sub
      

      【讨论】:

        【解决方案4】:

        改变: 将起点暗淡为范围 将终点暗淡为范围

        到: 变体变暗起点 变暗端点作为变体

        由于公式中使用了起点和终点,您不能将它们定义为范围。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多