我的公式列如下:
=(2+3*6+8) & "KB"
基本上,每个单元格都是一个公式和字符串连接(使用&
)。我想要添加所有这些单元格。我尝试了以下事项:
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))
答案 0 :(得分:1)
在VBA中创建自己的SUM函数。试试这个:
=StripTextAndSum(A2:A4)
- 返回60
=StripTextAndAverage(A2:A4)
- 返回20
此方法保留最左边的十进制数字并将其余部分丢弃。
注意:您可以调整它以满足您的需求。一种方法是保留文本,这样你就可以在总和中返回它......就像150MB(我假设KB意味着千字节)。如果你喜欢这个想法,请告诉我,我会做到。
编辑:正如@DirkReichel指出的那样,使用IsNumeric
可以提高效率,但我保留了所有其他功能。 IsLetter
也很有用。
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
答案 1 :(得分:0)
我通常只是将KB
移到下一列并左对齐。
这样,它仍然看起来相同,但第一列只有实数,你可以用数学方式操纵你心中的内容。
或者,假设它们全部以千字节为单位(如果您只是想添加数字位,这似乎是一个要求),请不要将KB
放在数据区域中。
而是将标题从例如Used memory
更改为Used memory (KB)
。
你真的希望用如下的丑陋怪物填充你漂亮的电子表格吗? : - )
=SUM(IF(ISNUMBER(FIND("KB",$C$2:$C$14)),VALUE(LEFT($C$2:$C$14,FIND("KB",$C$2:$C$14)-1)),0))
答案 2 :(得分:-1)
如果您需要保持列的原样,您可以始终使用数组公式来获得总和:
=sum(value(left(b2:b21,len(b2:b21)-2)))
您需要将其作为数组公式输入(按Ctrl+Shift+Enter
提交)
基本上这是取一个单元格的最左边的块(除了最后两个字符,我们知道'KB'),使用value()
将其转换为数字,sum()
为加起来。将其作为数组公式输入,只需让我们一次性对列表b2:b21中的每个单元格执行此操作。
正如@paxdiablo所提到的,最好重组一下,这样你就不必首先将你的值作为文本来处理。我的方法是输入值并通过格式添加“KB”。您可以使用0.00 "KB"
之类的自定义格式,因此单元格仅保留值17,但显示为“17.00 KB”。