将具有公式和字符串的单元格连接在一起

时间:2017-07-14 01:36:28

标签: excel

我的公式列如下:

=(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))

3 个答案:

答案 0 :(得分:1)

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

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

此方法保留最左边的十进制数字并将其余部分丢弃。

enter image description here enter image description here

注意:您可以调整它以满足您的需求。一种方法是保留文本,这样你就可以在总和中返回它......就像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$1‌​4,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”。