Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 删除所有以特定字母开头的单词的第一个字符,Excel中的第一个单词除外_String_Vba_Excel_User Defined Functions - Fatal编程技术网

String 删除所有以特定字母开头的单词的第一个字符,Excel中的第一个单词除外

String 删除所有以特定字母开头的单词的第一个字符,Excel中的第一个单词除外,string,vba,excel,user-defined-functions,String,Vba,Excel,User Defined Functions,我正在尝试构建一个UDF,该UDF将查看单元格,并删除除第一个单词外所有以字母“El”开头的单词的第一个字符。 单元格A1中的值为: El agua、El asma、El arca、Elhambre、El aguila、Elements 在将调用UDF函数的单元格B1中,我希望结果为: Elagua、lasma、arca、lambre、aguila、elements 我的代码如下: Function exceptFirst(MyString As String) Dim X As

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

单元格A1中的值为:

El agua、El asma、El arca、Elhambre、El aguila、Elements

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

Elagua、lasma、arca、lambre、aguila、elements

我的代码如下:

    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”,但它不排除第一个单词中出现的
非常感谢您的帮助。

正如Patrick所建议的,您可以使用
拆分
功能来实现所需的输出

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

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

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)
和另一个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

EDIT我假设您希望
El
在替换和检测第一个实例时区分大小写。如果不是这样,只需将
选项Compare
语句从
Binary
更改为
Text
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

使用
Split
函数的过程中插入一个空格。这不就是
=replacement(A1,,,,,,,,,,,,,,)
@Slai我想你的公式只有在第一个短语以
El
开头时才有效吗