VBA:加上不规则的范围

Excel工作表的图片来说明下面的解释

嗨,大家好,

我一直在使用Stackoverflow几个月,通常,我设法find解决scheme,直到现在我所有的VBA挑战:

我需要一些帮助来创build一个macros,这些macros在“avg”字的行之间添加列E上的所有值。 结果应显示在显示“Sum here”标签的单元格上。 “avg”和“sum here”两个文本仅仅是为了举例说明,“avg”可以被任何其他的词代替,“sum here”实际上应该是它上面的值的聚合。

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

最后,列D上的值只是“求和”单元的期望值的例子。

这是我曾经试过的:

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 

此外,正如你所看到的,我不知道如何使用variables来定义范围。 我最初的想法是把这个代码与某种“做某事”或/和“对于我= 1到X”和“下一个我”…但我看不出如何组合它。

非常感谢!

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

 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 

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

我给出了公式的两个版本 – 易失版本(每次更改电子表格中的任何内容时更新)以及非易失版本(只在需要时才更新)。

应在第6行input公式 – 将$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)) 

编辑:以为我会添加一个UDF来计算它,如果你是VBA之后。

在要显示小计的行中使用函数=AddSubTotal() ,或使用=AddSubTotal("pop",6)来使用“pop”而不是“avg” 。

 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 

下面的VBA例程假定

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

你可以很容易地修改这个例程来执行这些值的平均值,并将这些结果放在例如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 

在这里输入图像说明

更改:昏暗的起点作为范围昏暗的终点作为范围

要:Dim startingpoint As Variant Dim endingpoint As Variant

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