将具有公式和string的单元格汇总在一起

我有一个公式如下的列:

=(2+3*6+8) & "KB" 

基本上,每个单元格是一个公式和string连接(使用& )。 我想要添加所有这些单元格。 我尝试了以下的东西:

a) =SUM(B2:B21)给我一个0的总和。

b)使用=B2+B3...给我一个#VALUE错误。

c)我也尝试过这样的事情 – 没有工作,给了总和0=SUM(IF(ISNUMBER(FIND("KB",$C$2:$C$14)),VALUE(LEFT($C$2:$C$14,FIND("KB",$C$2:$C$14)-1)),0))

在VBA中创build自己的SUM函数。 尝试这个:

=StripTextAndSum(A2:A4) – 返回60
=StripTextAndAverage(A2:A4) – 返回20

这个方法保留最左边的十进制数字,并把剩下的扔掉。

在这里输入图像说明 在这里输入图像说明

注意:你可以调整这个以适应你的需求。 一种方法是保留文本,所以你可以返回总和….就像150MB(我假设KB表示千字节)。 让我知道如果你喜欢这个想法,我会做到的。

编辑:正如@DirkReichel所指出的那样,使用IsNumeric取而代之,这已经变得更高效了,但是我也保留了所有其他的function。 IsLetter也是一个有用的function。

 Public Function StripTextAndSum(myRange As Range) Dim r As Range Dim n As Double n = 0 For Each r In myRange.Cells n = n + ParseNumberFromString(r.Text) Next r StripTextAndSum = n End Function Public Function StripTextAndAverage(myRange As Range) Dim n As Double n = StripTextAndSum(myRange) StripTextAndAverage = n / (myRange.Cells.Count * 1#) End Function Public Function ParseNumberFromString(s As String) As Double ParseNumberFromString = Left(s, GetLastNumberIndex(s)) End Function Public Function GetFirstLetterIndex(s As String) As Integer Dim i As Integer For i = 1 To Len(s) Step 1 If IsLetter(Mid(s, i, 1)) = True Then GetFirstLetterIndex = i Exit Function End If Next i End Function Public Function GetLastNumberIndex(s As String) As Integer Dim i As Integer For i = Len(s) To 1 Step -1 If IsNumeric(Left(s, i)) = True Then GetLastNumberIndex = i Exit Function End If Next i End Function Function IsLetter(s As String) As Boolean Dim i As Integer For i = 1 To Len(s) If LCase(Mid(s, i, 1)) <> UCase(Mid(s, i, 1)) = True Then IsLetter = True Else IsLetter = False Exit For End If Next End Function 

我通常只是将KB移到下一列并左alignment。

这样,它仍然看起来相同,但第一列只有实际的数字,你可以操纵你的心脏的内容math。

或者,假设它们都是千字节(如果您只是想添加数字位,这似乎是一个要求),请不要将KB放在数据区域中。

而是将标题从例如“已Used memory更改为“已Used memory (KB)

你真的用如下的对峙丑陋的怪物填充你的漂亮的电子表格吗? 🙂

 =SUM(IF(ISNUMBER(FIND("KB",$C$2:$C$14)),VALUE(LEFT($C$2:$C$1‌​4,FIND("KB",$C$2:$C$‌​14)-1)),0)) 

如果你需要保持你的专栏,你总是可以使用数组公式来获得总和:

 =sum(value(left(b2:b21,len(b2:b21)-2))) 

您将需要input数组公式(按Ctrl+Shift+Enter提交)

基本上这是把一个单元格的最左边的块(除了最后两个字符,我们知道是'KB'),使用value()将其转换为数字, sum()将其加起来。 以数组公式的formsinput它只是让我们在列表b2:b21中的每个单元格中执行此操作。

正如@paxdiablo提到的,尽pipe如此,最好是重组,这样你就不必把你的价值作为文本来处理了。 我的做法是input值并通过格式添加“KB”。 您可以使用类似0.00 "KB"的自定义格式,因此该单元格只能保存值17,但显示为“17.00 KB”。