VBA。如何找到字符串中第一个数字的位置

VBA。如何找到字符串中第一个数字的位置,vba,digit,Vba,Digit,我有字符串“ololo123”。 我需要得到第一个数字-1的位置。 如何设置搜索掩码?类似这样的操作应该可以帮到你: Public Function GetPositionOfFirstNumericCharacter(ByVal s As String) As Integer For i = 1 To Len(s) Dim currentCharacter As String currentCharacter = Mid(s, i, 1)

我有字符串“ololo123”。 我需要得到第一个数字-1的位置。
如何设置搜索掩码?

类似这样的操作应该可以帮到你:

Public Function GetPositionOfFirstNumericCharacter(ByVal s As String) As Integer
    For i = 1 To Len(s)
        Dim currentCharacter As String
        currentCharacter = Mid(s, i, 1)
        If IsNumeric(currentCharacter) = True Then
            GetPositionOfFirstNumericCharacter = i
            Exit Function
        End If
    Next i
End Function
你可以这样称呼它:

Dim iPosition as Integer
iPosition = GetPositionOfFirstNumericCharacter("ololo123")

如果速度是一个问题,这将比Robs(noi Rob)运行快一点:


你可以试试正则表达式,然后你会有两个问题。我的VBAfu不符合标准,但我会尝试一下:

Function FirstDigit(strData As String) As Integer
    Dim RE As Object REMatches As Object

    Set RE = CreateObject("vbscript.regexp")
    With RE
        .Pattern = "[0-9]"
    End With

    Set REMatches = RE.Execute(strData)
    FirstDigit = REMatches(0).FirstIndex
End Function

然后用
FirstDigit(“ololo123”)
调用它

不确定您的环境,但这在Excel 2010中起作用

'Added reference for Microsoft VBScript Regular Expressions 5.5

Const myString As String = "ololo123"
Dim regex As New RegExp
Dim regmatch As MatchCollection

regex.Pattern = "\d"
Set regmatch = regex.Execute(myString)
MsgBox (regmatch.Item(0).FirstIndex)   ' Outputs 5

我实际上有这个功能:

Public Function GetNumericPosition(ByVal s As String) As Integer
    Dim result As Integer
    Dim i As Integer
    Dim ii As Integer

    result = -1
    ii = Len(s)
    For i = 1 To ii
        If IsNumeric(Mid$(s, i, 1)) Then
            result = i
            Exit For
        End If
    Next
    GetNumericPosition = result
End Function

这里有一个轻量级的快速方法,可以避免添加regex/引用,从而有助于减少开销和提高可移植性,这应该是一个优势

Public Function GetNumLoc(xValue As String) As Integer

For GetNumLoc = 1 To Len(xValue)
    If Mid(xValue, GetNumLoc, 1) Like "#" Then Exit Function
Next

GetNumLoc = 0

End Function

@谢谢,我删除了这句话。你可以简化这个功能。您实际上不需要
currentCharacter
;您的测试可能是
如果是数字的(Mid(s,i,1)),那么…
@e100-非常正确。分解它会使它更具可读性,这就是我在回答如此复杂的问题时的目的,因为我的工作基础是OP可能需要更简单/更清晰的代码来帮助理解=)
Public Function GetNumLoc(xValue As String) As Integer

For GetNumLoc = 1 To Len(xValue)
    If Mid(xValue, GetNumLoc, 1) Like "#" Then Exit Function
Next

GetNumLoc = 0

End Function