2010-08-23 16 views

Odpowiedz

8

Coś jak to powinno wystarczyć dla Ciebie:

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 

Następnie można nazwać tak:

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

Możesz uprościć funkcję. Tak naprawdę nie potrzebujesz 'currentCharacter'; twoim testem może być 'If IsNumeric (Mid (s, i, 1)) Then ...' – e100

+0

@ e100 - bardzo prawdziwe. Złamanie go sprawia, że ​​jest on bardziej czytelny i to jest właśnie dla mnie, gdy odpowiadam na pytanie o ten poziom złożoności, ponieważ pracuję na podstawie tego, że OP może potrzebować prostszego/klarownego kodu, aby pomóc w zrozumieniu =) – Rob

0

Jeśli prędkość jest problem, to będzie działać nieco szybciej niż rabuje (noi Rob):

Public Sub Example() 
    Const myString As String = "ololo123" 
    Dim position As Long 
    position = GetFirstNumeric(myString) 
    If position > 0 Then 
     MsgBox "Found numeric at postion " & position & "." 
    Else 
     MsgBox "Numeric not found." 
    End If 
End Sub 

Public Function GetFirstNumeric(ByVal value As String) As Long 
    Dim i As Long 
    Dim bytValue() As Byte 
    Dim lngRtnVal As Long 
    bytValue = value 
    For i = 0 To UBound(bytValue) Step 2 
     Select Case bytValue(i) 
      Case vbKey0 To vbKey9 
       If bytValue(i + 1) = 0 Then 
        lngRtnVal = (i \ 2) + 1 
        Exit For 
       End If 
     End Select 
    Next 
    GetFirstNumeric = lngRtnVal 
End Function 
1

Możesz spróbować regex, a wtedy będziesz miał dwa problemy. Moja VBAfu nie jest do tabaki, ale dam mu szansę:

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 

Następnie wystarczy połączyć go z FirstDigit("ololo123").

+0

+1 Widzę, że mieliśmy podobne myśli, byłeś trochę szybszy! –

2

Nie wiesz, od środowiska, ale to działało w programie 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 
2

I rzeczywiście mają taką funkcję:

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 
7

Tutaj jest lekka i szybka metoda, która pozwala uniknąć uzupełnień regex/referencyjnych, w związku z tym pomoc w zakresie kosztów ogólnych i transportu powinna stanowić zaletę.

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 
Powiązane problemy