web-dev-qa-db-fra.com

Comment trouver les nombres d'une chaîne?

J'ai besoin de trouver des nombres à partir d'une string. Comment trouve-t-on des nombres à partir d'une string dans VBA Excel?

16
user905527

En supposant que vous vouliez dire que vous vouliez éliminer les non-nombres, vous devriez pouvoir utiliser quelque chose comme:

Function onlyDigits(s As String) As String
    ' Variables needed (remember to use "option explicit").   '
    Dim retval As String    ' This is the return string.      '
    Dim i As Integer        ' Counter for character position. '

    ' Initialise return string to empty                       '
    retval = ""

    ' For every character in input string, copy digits to     '
    '   return string.                                        '
    For i = 1 To Len(s)
        If Mid(s, i, 1) >= "0" And Mid(s, i, 1) <= "9" Then
            retval = retval + Mid(s, i, 1)
        End If
    Next

    ' Then return the return string.                          '
    onlyDigits = retval
End Function

Appeler cela avec:

Dim myStr as String
myStr = onlyDigits ("3d1fgd4g1dg5d9gdg")
MsgBox (myStr)

vous donnera une boîte de dialogue contenant:

314159

et ces deux premières lignes montrent comment vous pouvez le stocker dans une variable chaîne arbitraire, à faire avec ce que vous voulez.

38
paxdiablo

Les expressions régulières sont construites pour analyser. Bien que la syntaxe prenne un certain temps à comprendre cette approche est très efficace et très flexible pour gérer des extractions/remplacements de chaînes plus complexes

Sub Tester()
     MsgBox CleanString("3d1fgd4g1dg5d9gdg")
End Sub

Function CleanString(strIn As String) As String
    Dim objRegex
    Set objRegex = CreateObject("vbscript.regexp")
    With objRegex
     .Global = True
     .Pattern = "[^\d]+"
    CleanString = .Replace(strIn, vbNullString)
    End With
End Function
16
brettdj

Développer la réponse de brettdj, afin d'analyser les chiffres incorporés disjoints en nombres séparés:

Sub TestNumList()
    Dim NumList As Variant  'Array

    NumList = GetNums("34d1fgd43g1 dg5d999gdg2076")

    Dim i As Integer
    For i = LBound(NumList) To UBound(NumList)
        MsgBox i + 1 & ": " & NumList(i)
    Next i
End Sub

Function GetNums(ByVal strIn As String) As Variant  'Array of numeric strings
    Dim RegExpObj As Object
    Dim NumStr As String

    Set RegExpObj = CreateObject("vbscript.regexp")
    With RegExpObj
        .Global = True
        .Pattern = "[^\d]+"
        NumStr = .Replace(strIn, " ")
    End With

    GetNums = Split(Trim(NumStr), " ")
End Function
5
pstraton

Utilisez la fonction intégrée VBA Val, si les nombres sont au début de la chaîne:

Dim str as String
Dim lng as Long

str = "1 149 xyz"
lng = Val(str)

lng = 1149

Fonction Val, sur MSDN

0
Rohan Moore

Ceci est une variante du post de brettdj & pstraton.

Cela renverra une valeur vraie et ne vous donnera pas l'erreur #NUM!. Et \D est un raccourci pour autre chose que des chiffres. Le reste ne ressemble beaucoup aux autres qu’avec cette solution mineure.

Function StripChar(Txt As String) As Variant
With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "\D"
    StripChar = Val(.Replace(Txt, " "))
End With
End Function
0
Stephen Sherry