Excel VBA:search一个string来查找第一个非文本字符

单元格在string中包含字符的混合,例如:

Abcdef_8765
QWERTY3_JJHH
Xyz9mnop

我需要find第一个非A-Za-z字符,这样我才能去掉string的后续剩余部分。

所以结果是:

ABCDEF
QWERTY
XYZ

如果我确切地知道我在找什么angular色,我知道如何做到这一点,但是我不直观地抓住如何find除了 A-Za-z 之外 A-Za-z任何其他angular色。

顺便说一句,这是打算在一个VBBA解决scheme中使用。

====================

编辑:

我已经成功了以下…

 a = "abc123" b = Len(a) For x = 1 To b c = (Mid(a, x, 1) Like "[a-zA-Z]") If c = False Then d = Left(a, x - 1) Exit Sub End If Next x 

我偶然发现了一个合适的解决scheme,还是注定要破? 我只问,因为我看着道格兰西的解决scheme,似乎更实质。 (顺便说一下,我还没有testing道格的解决scheme)

下面的正则expression式看起来从第一个非AZ字符中删除。

 Function StrChange(strIn As String) As String Dim objRegEx As Object Set objRegEx = CreateObject("vbscript.regexp") With objRegEx .ignorecase = True .Pattern = "^([az]+)([^az].*)" .Global = True StrChange = .Replace(strIn, "$1") End With End Function 

这是一个不使用RegEx的简单方法。 我故意不使用正则expression式,因为另外两个答案是基于RegEx的。 RegEx肯定更快,但这几乎同样快。 速度的差异几乎可以忽略不计。

 Function GetWord(Rng As Range) Dim i As Long, pos As Long For i = 1 To Len(Rng.Value) Select Case Asc(Mid(Rng.Value, i, 1)) Case 65 To 90, 97 To 122 Case Else: pos = i: Exit For End Select Next i GetWord = Left(Rng.Value, pos - 1) End Function 

用法

 =GetWord(A1) 

在这里输入图像说明

编辑

从评论后续。 微调代码(Courtesy @brettdj)。

 Function GetWord(Rng As Range) Dim i As Long, pos As Long Dim sString As String sString = UCase$(Rng.Value) For i = 1 To Len(sString) Select Case Asc(Mid$(sString, i, 1)) Case 65 To 90 Case Else: pos = i: Exit For End Select Next i GetWord = Left(Rng.Value, pos - 1) End Function 

更多后续。

这是我从来没有尝试过的东西。 我做了我的代码与RegXp的实际testing,我很惊讶地看到我的代码比我没有预料到的RegXp更快。

我testing了10K单元,每个单元有2256个string

我放在Cell A1:A10000

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeSiddharth

在这里输入图像说明

接下来我运行了这个testing

在这里输入图像说明

你可以使用一个简单的正则expression式来指定一个数字后跟任何东西,并使用这个函数来replace任何符合该模式的东西:

 Function Regex_Replace(strOriginal As String, strPattern As String, strReplacement, varIgnoreCase As Boolean) As String Dim objRegExp As Object Set objRegExp = CreateObject("vbscript.regexp") With objRegExp .Pattern = strPattern .IgnoreCase = varIgnoreCase .Global = True End With Regex_Replace = objRegExp.Replace(strOriginal, strReplacement) Set objRegExp = Nothing End Function 

你会这样称呼它:

 Sub DeleteAfterNums() Dim cell As Excel.Range 'Change "Selection" to your range For Each cell In Selection '"\d.+" is a numeral and whatever follows it cell.Value = Regex_Replace(cell.Value, "\d.+", "", True) Next cell End Sub 

这是一个轻量级和快速的方法,避免正则expression式/参考添加,从而帮助开销和可移植性应该是一个优势。

 Public Function GetText(xValue As String) As Variant For GetText = 1 To Len(xValue) If UCase(Mid(xValue, GetText, 1)) Like "[!AZ]" Then GetText = Left(xValue, GetText - 1): Exit Function Next GetText = xValue End Function 

然后通过使用vba中的GetText(“Submission String”)或者在单元格公式中加上“=”来调用。