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”)或者在单元格公式中加上“=”来调用。