【问题标题】:Deleting the first character of all the words starting with specific letters except for the first word in Excel删除所有以特定字母开头的单词的第一个字符,Excel中的第一个单词除外
【发布时间】:2018-07-05 18:41:55
【问题描述】:

我正在尝试构建一个 UDF,它将查看一个单元格并删除所有以字母“El”开头的单词的第一个字符除了第一个单词。

单元格 A1 中的值将是:

El agua, El asma, El arca, Elhambre, El aguila, Elements

在将调用 UDF 函数的单元格 B1 中,我希望结果为:

埃尔 agua, l asma, l arca, lhambre, l aguila, lements

我的代码如下:

    Function exceptFirst(MyString As String)
    Dim X As Long
    Dim Tempstr As String
    Tempstr = ""
    For X = 1 To Len(MyString)
        If Mid(MyString, X, 2) = "El" Then

            Tempstr = Tempstr

        Else

            Tempstr = Tempstr & Mid(MyString, X, 1)


        End If
    Next
    exceptFirst = Tempstr
    End Function

代码正在删除所有以“EL”开头的词中的所有“E”,但它不是排除 strong> 第一个 出现 第一个单词。 非常感谢您的帮助,并在此先感谢您。

【问题讨论】:

  • 使用Split函数。
  • 不就是=SUBSTITUTE(A1, ", El", ", l")
  • @Slai 我认为你的公式只有在第一个短语以 El 开头时才有效

标签: string vba excel user-defined-functions


【解决方案1】:

还有另一个UDF,使用Split & Join

Option Explicit
Option Compare Binary 'to ensure case sensitive
Function exceptFirst(S As String) As String
    Dim V As Variant
    Dim I As Long
    Dim bFirst As Boolean

bFirst = False
V = Split(S, ", ")

For I = LBound(V) To UBound(V)
    Select Case bFirst
        Case False
            If V(I) Like "El*" Then bFirst = True
        Case True
            If V(I) Like "El*" Then V(I) = Mid(V(I), 2)
    End Select
Next I

exceptFirst = Join(V, ", ")

End Function

编辑我假设您希望 El 区分大小写,无论是替换还是检测哪个是第一个实例。如果不是这种情况,只需将Option Compare 语句从Binary 更改为Text

【讨论】:

    【解决方案2】:

    正如Patrick 建议的那样,您可以使用Split 函数来实现所需的输出...

    Function exceptFirst(ByVal MyString As String) As String
    Dim i As Long
    Dim Tempstr As String
    Dim str() As String
    
    str() = Split(MyString, ", ")
    
    Tempstr = str(0)
    For i = 1 To UBound(str)
        If LCase(Left(str(i), 2)) = "el" Then
            Tempstr = Tempstr & ", " & Right(str(i), Len(str(i)) - 1)
        Else
            Tempstr = Tempstr & ", " & str(i)
        End If
    Next i
    exceptFirst = Tempstr
    End Function
    

    【讨论】:

      【解决方案3】:

      这是我使用您提供的示例成功构建的:

      Option Explicit
      
      Function exceptFirst(MyString As String) As String
      
          Dim varArr      As Variant
          Dim cnt         As Long
          Dim result      As String
      
          varArr = Split(MyString, ", ")
      
          For cnt = LBound(varArr) To UBound(varArr)
              If cnt > 0 Then
                  If UCase(Left(varArr(cnt), 2)) = "EL" Then
                      result = result & Right(varArr(cnt), Len(varArr(cnt)) - 1) & ", "
                  Else
                      result = result & varArr(cnt) & ", "
                  End If
              Else
                  result = varArr(0) & ", "
              End If
          Next cnt
      
          exceptFirst = Left(result, Len(result) - 2)
      
      End Function
      
      Public Sub TestMe()
      
          Debug.Print exceptFirst("El agua, El asma, Elhambre, El aguila, cska, Elements")
      
      End Sub
      

      它有点滥用Left() 和Right() 的用法,但代码提供了你所需要的。棘手的部分是它被, 剥离并在循环中将其添加回来。代码最后,返回字符串时,去掉最后一个逗号和空格:exceptFirst = Left(result, Len(result) - 2)

      【讨论】:

        【解决方案4】:

        还有regex:

        Sub RegexTest()
            Dim strInput As String, strPat As String
            Dim rX As New RegExp
        
            strPat = "(?:\s)(e)(?=l)"
            strInput = "El agua, Elhambre, El sol, elanore, bella"
            Debug.Print "Input: " & strInput
            Debug.Print "Expected output: El agua, lhambre, l sol, lanore, bella"
        
            With rX
                .Global = True
                .MultiLine = True
                .IgnoreCase = True
                .Pattern = strPat
            End With
        
            Debug.Print "Output: " & rX.Replace(strInput, " ")
        End Sub
        

        应该给你什么

        Input:           El agua, Elhambre, El sol, elanore, bella    
        Expected output: El agua, lhambre, l sol, lanore, bella   
        Output:          El agua, lhambre, l sol, lanore, bella
        

        模式可以改进 - 我不知道为什么它在非捕获组中捕获e 之前的空间......但在这种情况下,黑客是在replace.

        【讨论】:

          猜你喜欢
          • 2022-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多