2016-08-23 104 views
4

Pic of the Excel Sheet to illustrate the explanation belowVBA:加入了不规则的范围

家伙嗨,

我一直在使用#1几个月,并且通常,我设法找到直到现在我所有的VBA挑战的解决方案:

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

真正的挑战是,范围在E列的数量是可变的,所以我想找到一个宏,它能够应付在列E.范围内的“n”个

最后,列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 

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

非常感谢你!

+0

嗨Suances!请告诉我们你试过了什么? –

+1

只需将总数设置为0,然后循环遍历每一行,并且(a)如果列C不是“平均”(或任何您使用的),则将列E的值添加到总数中,或者(b)如果C列是“avg”(或任何您使用的)将总数写入E列并将总数再次设置为0。 – YowE3K

回答

1

当然,你只需要像:

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 
2

只使用公式,并提供每个小计行的列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)) 

编辑: 想我会一个UDF添加到如果你是在VBA之后计算它。

在希望显示小计的行中使用函数=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 
1

变化: 昏暗起点作为范围 昏暗endingpoint作为范围

到: 昏暗起点作为变 昏暗endingpoint作为变

作为起点和endingpoint在公式中使用的,你不能将它们定义为Range。

2

下面的VBA程序认为

  • 你的数据是在列C:é
  • 没有别的相关的(没有数字),在这个范围内
  • 你的“关键词”,你想展示总和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 

enter image description here