繁体   English   中英

如何从 Excel 中的文本字符串中调用正确的数字?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM