[英]How do I recall the correct number from a text string in Excel?
考虑以下文本字符串:
(*4,14)(7,15)(10,13)(9,12)-(1,8)(2,6)-5,3-11
我的目标是计算该字符串中每个单独数字之前有多少个左括号(“(”)、括号外的逗号和连字符(例如,数字 10 前面的 3 个左括号、6 个左括号和前面的 3 个连字符) 11)。
我当前的解决方案是首先调用每个单独数字前面的剩余文本字符串,只需=LEFT(A1,(FIND("1",A1,1)-1))
,但碰巧 Excel 会调用出现的字符串在第一个“1”之前(即(*4,
),而不是从字符串中的实际数字“1”中调用剩余的字符串(即(*4,14)(7,15)(10,13)(9,12)-(
)。
旁注,关于如何计算括号外逗号数量的任何想法?
帮助将不胜感激!
如果您有带有FILTERXML
function 的 Excel 版本(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
function,最好使用 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.