Excel 如何识别和删除单元格中字符串中的单个字母?

Excel 如何识别和删除单元格中字符串中的单个字母?,excel,vba,Excel,Vba,我在Excel的列中有一个名称数据集。 但是,只有部分但并非所有姓名的末尾都附有字母(如John Doe a、Kai Jin、Johnny Desplat Lang B等) 有人能想出一种方法来删除每行名称末尾的字母(如果有)?这样,使用上面的例子,我将留下:John Doe、Kai Jin、Johnny Desplat Lang等 我相当熟悉VBA和Excel,并愿意尝试任何东西 谢谢你对这个问题的帮助!如果这似乎是一个基本问题,我会事先道歉,但我不知道如何开始解决它 “我对VBA和Excel

我在Excel的列中有一个名称数据集。 但是,只有部分但并非所有姓名的末尾都附有字母(如John Doe a、Kai Jin、Johnny Desplat Lang B等)

有人能想出一种方法来删除每行名称末尾的字母(如果有)?这样,使用上面的例子,我将留下:John Doe、Kai Jin、Johnny Desplat Lang等

我相当熟悉VBA和Excel,并愿意尝试任何东西

谢谢你对这个问题的帮助!如果这似乎是一个基本问题,我会事先道歉,但我不知道如何开始解决它

“我对VBA和Excel相当熟悉,愿意尝试任何东西。”

如果是这样,那么如果您希望避免VBA,可以使用简单的公式来实现。在
A1
中使用您的值:

=IF(MID(A1,LEN(A1)-1,1)=" ",LEFT(A1,LEN(A1)-2),A1)

如果必须使用VBA,我认为
Like
操作符很方便:

Sub Test()

Dim arr As Variant: arr = Array("John Doe A", "Kai Jin", "Johnny Desplat Lang B")

For Each el In arr
    If el Like "* ?" Then 'Or "* [A-Z]" if you must check for uppercase alpha.
        Debug.Print Left(el, Len(el) - 2)
    Else
        Debug.Print el
    End If
Next

End Sub

“我对VBA和Excel相当熟悉,愿意尝试任何东西。”

如果是这样,那么如果您希望避免VBA,可以使用简单的公式来实现。在
A1
中使用您的值:

=IF(MID(A1,LEN(A1)-1,1)=" ",LEFT(A1,LEN(A1)-2),A1)

如果必须使用VBA,我认为
Like
操作符很方便:

Sub Test()

Dim arr As Variant: arr = Array("John Doe A", "Kai Jin", "Johnny Desplat Lang B")

For Each el In arr
    If el Like "* ?" Then 'Or "* [A-Z]" if you must check for uppercase alpha.
        Debug.Print Left(el, Len(el) - 2)
    Else
        Debug.Print el
    End If
Next

End Sub

只是为了好玩,为了通过
过滤器()演示另一种方法
功能:

Function ShortenName(ByVal FullName As Variant) As String
'Purpose: remove a single last letter
    Dim n: n = Split(FullName, " "): n = Len(n(UBound(n)))
    ShortenName = Left(FullName, Len(FullName) + 2 * (n = 1))
End Function
解释

对全名应用
Split()
函数并隔离姓氏标记(通过
UBound()
)可以检查单个字母长度(变量
n


如果是单个字母,函数结果返回整个字符串长度减去2(最后一个字母加上前面的空格)(条件
n=1
则结果为
True
等于
-1
)或者,您可以编写:
ShortenName=Left(全名,Len(全名)-IIf(n=1,2,0))
只是为了好玩,为了演示通过
Filter()函数的另一种方法:

Function ShortenName(ByVal FullName As Variant) As String
'Purpose: remove a single last letter
    Dim n: n = Split(FullName, " "): n = Len(n(UBound(n)))
    ShortenName = Left(FullName, Len(FullName) + 2 * (n = 1))
End Function
解释

对全名应用
Split()
函数并隔离姓氏标记(通过
UBound()
)可以检查单个字母长度(变量
n


如果是单个字母,函数结果返回整个字符串长度减去2(最后一个字母加上前面的空格)(条件
n=1
则结果为
True
等于
-1
)或者,您可以编写:
ShortenName=Left(全名,Len(全名)-IIf(n=1,2,0))

我尝试了这两种方法,它们工作得非常好。谢谢你的帮助。有用,简短,简单。仅供参考,我通过Filter()添加了另一个解决方案。我尝试了这两种方法,效果非常好。谢谢你的帮助。有用,简短,简单。FYI通过Filter()添加了另一个解决方案,并发布了对您问题的延迟回复;如果有帮助,请随意投票:-)对您的问题发布了延迟回复;如果有帮助,请随时向上投票:-)