2010-08-23 5 views

Respuesta

8

Algo como esto debe hacer el truco para usted:

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 

entonces le puede llamar así:

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

Puede simplificar la función. Realmente no necesitas 'currentCharacter'; su prueba podría ser 'If IsNumeric (Mid (s, i, 1)) Then ...' – e100

+0

@ e100 - muy cierto. Romperlo lo hace más legible y para eso estoy cuando contesto una pregunta de este nivel de complejidad, ya que trabajo sobre la base de que el OP puede necesitar un código más simple/claro para ayudar a la comprensión =) – Rob

0

Si la velocidad es un problema, esto va a correr un poco más rápido que roba (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

Podrías probar con Regex, y entonces tendrías dos problemas. Mi VBAfu no es hasta el tabaco, pero voy a darle una oportunidad:

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 

A continuación, sólo lo llaman con FirstDigit("ololo123").

+0

+1 Veo que tuvimos similares pensamientos, ¡fuiste un poco más rápido! –

2
No

seguro de su entorno, pero esta trabajado en 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

en realidad tienen esa función:

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

Aquí es un método ligero y rápido que evita adiciones expresiones regulares/de referencia, lo que ayuda con los gastos generales y transportabilidad en caso de que sea una ventaja.

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 
Cuestiones relacionadas