dynamic求和范围

目前我有一份医疗电子表格,里面有我们提供服务的客户名单。 我们有8个不同的临床类别,用不同的首字母缩略词表示 – HV,SV,CV,WV,CC,OV,TS和GS。

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

电子表格的快照

然后在表格的底部,我们有一个总和,用来表示那周发生的所有治疗。
总计总计样本

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

我们是否必须逐个手动调整,还是有一个更简单的方法呢? 计数器的快照在这里输入图像说明

非常感谢你!

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

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

举一个例子来说明,考虑一下:
数据
假设第一个数据从第6行开始,并且不超过第15行(可以使用顶部的另一个数据间隙的概念)。 修改Sum行标题以缩写开头,然后像下面那样创build一个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行,并且要查找的types固定到列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)

我创buildUDF的方法是在单元格范围(第二个参数)中查找和计算单元格值(第一个参数)的外观。 所以你可以用它来计算大范围细胞的治疗types(G列)。

现在,如果在F之后添加许多列,则只需使用自动填充,相应的行和列就会在那里。
自动填充

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

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

命名您的数据范围并将其包含在SUM公式中。 所以每当NAMED数据范围扩大时,总和就会根据这个值来计算。 这里是如何创build一个dynamic的名为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 

屏幕:

在这里输入图像说明

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