动态求和范围

时间:2015-06-15 01:43:37

标签: excel vba sum excel-2010

目前,我有一份医疗电子表格,其中包含我们提供服务的客户列表。我们有8种不同的临床类别,用不同的首字母缩略词表示 - HV,SV,CV,WV,CC,OV,TS和GS。

客户可以接收多种治疗方法,即HV,SV,CV - 在后台我们有一个计数器机制,可以将这些记录的每一个增加1.该计数器使用的公式为:
=(LEN('Parent Sheet'!F25)-LEN(SUBSTITUTE('Parent Sheet'!F25,'Parent Sheet'!$P$4,"")))/LEN('Parent Sheet'!$P$4)

Snapshot of spreadsheet

在表格底部,我们会得到一笔金额,用于宣传该周所发生的所有治疗 Summed Totals Sample

现在关于这一点的棘手部分是我们在这张表中有近一年的数据但是求和公式设置为:SUM(COLUMN 6: COLUMN 53)但由于需要增加超出此限制的条目,我们有调整总和公式。我们有300个SUM公式,将8个Criteria项目中的每一个相加,并将它们分配给HV,SV,SC,WV等计数器。

我们是否必须逐个手动调整,还是有更简单的方法? Snapshot of Counter enter image description here

非常感谢!

3 个答案:

答案 0 :(得分:1)

拥有300个sum公式并不是一个好主意。

Name your data range并将其包含在SUM公式中。因此,每次NAMED数据范围扩展时,总和就会根据该数据进行计算。以下是create a dynamic named rnage.

的方法

抱歉,我刚刚看到你的评论。以下是一个简单/原始的VBA片段。

  

范围(" B3:F12")是rangeValue;范围(" C18")是rngTotal。

Option Explicit

Sub SumAll()
Dim WS As Worksheet
Dim rngSum As Range
Dim rngData As Range
Dim rowCount As Integer
Dim colCount As Integer
Dim i As Integer
Dim varSum As Variant

    'assuming that your said mechanism increases the data range by 1 row

    Set WS = ThisWorkbook.Sheets("Sheet2")
    Set rngData = WS.Range("valueRange")
    Set rngSum = WS.Range("rngTotal")

    colCount = rngData.Columns.Count
    'to take the newly added row (by your internal mechanism) into consideration
    rowCount = rngData.Rows.Count + 1

    ReDim varSum(0 To colCount)

    For i = 0 To UBound(varSum, 1)
        varSum(i) = Application.Sum(rngData.Resize(rowCount, 1).Offset(, i))
    Next i

    'transpose variant array with totals to sheet range
    rngSum.Resize(colCount, 1).Value = Application.Transpose(varSum)

    'release objects in the memory
    Set rngSum = Nothing
    Set rngData = Nothing
    Set WS = Nothing
    Set varSum = Nothing
End Sub

屏幕:

enter image description here

答案 1 :(得分:1)

对我来说,我认为您应该稍微更改工作表布局,创建用户定义函数(UDF)并更改Sum行中的公式以进行有效的行/列添加(以使用Excel的公式填充)。唯一的问题是您需要将其保存为启用宏的文件。

您需要在公式中更改的是使用 $ 来限制公式填充发生时列和行的更改。

为了举例说明,请考虑:
data
假设第一个数据从第6行开始,并且不超过第15行(您可以使用顶部另一个数据间隙的想法)。将Sum行标题更改为以缩写开头,然后创建如下所示的UDF:

Option Explicit

' The oRngType refers to a cell where the abbreviation is stored
' The oRngCount refers to cells that the abbreviation is to be counted
' Say "HV" is stored in $C16, and the cells to count for HV is D$6:D$15,
' then the sum of HV for that date (D16) is calculated by formula
' `=CountType($C16, D$6:D$15)`

Function CountType(ByRef oRngType As Range, ByRef oRngCount) As Long
    Dim oRngVal As Variant, oVal As Variant, oTmp As Variant, sLookFor As String, count As Long
    sLookFor = Left(oRngType.Value, 2)
    oRngVal = oRngCount.Value ' Load all the values onto memory
    count = 0
    For Each oVal In oRngVal
        If Not IsEmpty(oVal) Then
            For Each oTmp In Split(oVal, ",")
                If InStr(1, oTmp, sLookFor, vbTextCompare) > 0 Then count = count + 1
            Next
        End If
    Next
    CountType = count
End Function

表格中的公式:
总和的列固定到第6到15行,而要查找的类型固定到列C
D16 | =CountType($C16,D$6:D$15)
D17 | =CountType($C17,D$6:D$15)
...
E16 | =CountType($C16,E$6:E$15)
E17 | =CountType($C17,E$6:E$15)

我创建UDF的方法是查找和计算一系列单元格(第二个参数)中单元格值(第一个参数)的外观。因此,您可以使用它来计算大范围细胞的治疗类型(G栏)。

现在如果你在F之后添加很多列,你只需要使用自动填充,相应的行和列将在那里。
AutoFill

您还可以创建另一个VBA Sub来为您添加行,列和公式,但这是一个不同的问题。

答案 2 :(得分:-1)

您可以使用bonCodigo建议的命名范围,或者您可以使用查找和替换,或者您可以在数据范围内插入列,Excel将自动为您更新公式。