考虑以下文本字符串。
(*4,14)(7,15)(10,13)(9,12)-(1,8)(2,6)-5,3-11
我的目标是计算这个字符串中每个单独的数字前有多少个左括号("("))、括号外的逗号和连字符(例如,数字10前有3个左括号,11前有6个左括号和3个连字符)。
我现在的解决方案是先把每个独立数字前面剩余的文本串召回来,简单来说就是 =LEFT(A1,(FIND("1",A1,1)-1))
但是,Excel会调用出现在第一个 "1 "之前的字符串(即。(*4,
),而不是从字符串中的实际数字 "1 "开始调用剩余的字符串(即。(*4,14)(7,15)(10,13)(9,12)-(
).
附注,有什么办法可以计算出括号外的逗号数量吗?
如果能得到帮助,将非常感激
如果你有一个版本的Excel与 FILTERXML
函数(Windows Excel 2013+),您可以使用。
=SUM(LEN(FILTERXML("<t>" & SUBSTITUTE(SUBSTITUTE(A1,"(","<s>"),")","</s>") & "</t>","//t")))- LEN(SUBSTITUTE(FILTERXML("<t>" & SUBSTITUTE(SUBSTITUTE(A1,"(","<s>"),")","</s>") & "</t>","//t"),",",""))
该公式创建一个xml,其中 s
节点是括号内的内容,而括号内的 t
节点就是其他一切。
如果你没有 FILTERXML
函数,最好采用VBA方案。 这取决于你的Excel版本,以及它是Windows还是MAC。
Option Explicit
Function countChars(SourceString As String, SourceNumber As Variant, _
CountChar As String, Optional countRight As Boolean = False) As Long
Dim NumberDouble As Double
Dim NumberString As String
Dim NumberLength As Long
Dim StringLength As Long
Dim CurrentStart As Long
Dim CurrentFound As Long
Dim i As Long
Dim isFound As Boolean
StringLength = Len(SourceString)
If VarType(SourceNumber) = 8 Then
If Not IsNumeric(SourceNumber) Then _
Exit Function ' SourceNumber is not numeric.
End If
NumberDouble = Val(SourceNumber)
If NumberDouble <> Int(NumberDouble) Then _
Exit Function ' SourceNumber is not an integer.
NumberString = CStr(NumberDouble)
NumberLength = Len(NumberString)
CurrentStart = 1
Do
CurrentFound = InStr(CurrentStart, SourceString, NumberString)
GoSub checkNumber
If isFound Then
GoSub countTheChars
Exit Do
End If
CurrentStart = CurrentFound + 1
Loop Until CurrentFound = 0
Exit Function
countTheChars: ' Can be written better.
If Not countRight Then
For i = 1 To CurrentFound - 1
If Mid(SourceString, i, 1) = CountChar Then
countChars = countChars + 1
End If
Next i
Else
For i = CurrentFound + 1 To StringLength
If Mid(SourceString, i, 1) = CountChar Then
countChars = countChars + 1
End If
Next i
End If
checkNumber: ' Check for adjacent numbers.
Select Case CurrentFound
Case 0: Exit Function ' NumberString (initially) not found.
Case 1 ' NumberString found at the beginning.
isFound = Not _
IsNumeric(Mid(SourceString, CurrentFound + NumberLength, 1))
Case StringLength - NumberLength + 1 ' NumberString found at the end.
isFound = Not _
IsNumeric(Mid(SourceString, CurrentFound - 1, 1))
Case Else ' NumberString found in the middle.
isFound = Not _
IsNumeric(Mid(SourceString, CurrentFound + NumberLength, 1)) _
And Not IsNumeric(Mid(SourceString, CurrentFound - 1, 1))
End Select
Return
End Function