Как найти числа из строки? - PullRequest
17 голосов
/ 30 августа 2011

Мне нужно найти цифры от string.Как найти числа из string в VBA Excel?

Ответы [ 8 ]

41 голосов
/ 30 августа 2011

Предполагая, что вы хотите удалить не числа, вы должны иметь возможность использовать что-то вроде:

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

Вызов этого с помощью:

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

даст вамдиалоговое окно, содержащее:

314159

и эти первые две строки показывают, как вы можете сохранить его в произвольной строковой переменной, чтобы делать с ней по вашему желанию.

18 голосов
/ 14 сентября 2011

Регулярные выражения создаются для анализа. Хотя синтаксис может занять некоторое время, этот подход очень эффективен и очень гибок для обработки более сложных операций извлечения / замены строк

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
6 голосов
/ 29 мая 2014

Расширение ответа brettdj, чтобы разобрать непересекающиеся внедренные цифры в отдельные числа:

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
1 голос
/ 22 июля 2018

Используйте встроенную функцию VBA Val, если числа находятся на переднем конце строки:

Dim str as String
Dim lng as Long

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

lng = 1149

Функция Val, на MSDN

0 голосов
/ 22 мая 2019

Альтернатива через Byte Массив

Если вы присваиваете строку массиву Byte, вы обычно получаете числовые эквиваленты каждого символа в парах элементов массива. Используйте цикл для проверки чисел через оператор Like и верните объединенный массив как строку:

Function Nums(s$)
  Dim by() As Byte, i&, ii&
  by = s: ReDim tmp(UBound(by))                    ' assign string to byte array; prepare temp array
  For i = 0 To UBound(by) - 1 Step 2               ' check num value in byte array (0, 2, 4 ... n-1)
      If Chr(by(i)) Like "#" Then tmp(ii) = Chr(by(i)): ii = ii + 1
  Next i
  Nums = Trim(Join(tmp, vbNullString))             ' return string with numbers only
  End Function

Пример вызова

Sub testByteApproach()
  Dim s$: s = "a12bx99y /\:3,14159"                 ' [1] define original string
  Debug.Print s & " => " & Nums(s)                  ' [2] display original string and result
End Sub

будет отображать исходную строку и строку результата в ближайшем окне:

  a12bx99y /\:3,14159 => 1299314159
0 голосов
/ 22 мая 2019

Я искал ответ на тот же вопрос, но какое-то время я нашел свое собственное решение и хотел поделиться им с другими людьми, которым эти коды понадобятся в будущем.Вот еще одно решение без функции.

Dim control As Boolean
Dim controlval As String
Dim resultval As String
Dim i as Integer

controlval = "A1B2C3D4"

For i = 1 To Len(controlval)
control = IsNumeric(Mid(controlval, i, 1))
If control = True Then resultval = resultval & Mid(controlval, i, 1)
Next i

resultval = 1234

0 голосов
/ 05 мая 2019

Это основано на другом ответе , но только что переформатировано:

Предполагая, что вы хотите удалить не числа, вы можете использовать что-то вроде:

'
' Skips all characters in the input string except digits
'
Function GetDigits(ByVal s As String) As String
    Dim char As String
    Dim i As Integer
    GetDigits = ""
    For i = 1 To Len(s)
        char = Mid(s, i, 1)
        If char >= "0" And char <= "9" Then
            GetDigits = GetDigits + char
        End If
    Next i
End Function

При вызове этого с:

Dim myStr as String
myStr = GetDigits("3d1fgd4g1dg5d9gdg")
Call MsgBox(myStr)

появится диалоговое окно, содержащее:

314159

, и эти первые две строки показывают, как вы можете сохранить его впроизвольная строковая переменная, делать с которой вы хотите.

0 голосов
/ 25 сентября 2018

Это вариант сообщения brettdj's & pstraton.

Это вернет истинное значение и не выдаст ошибку #NUM!. И \D является сокращением для всего, кроме цифр. Все остальное очень похоже на другие только с этим небольшим исправлением.

Function StripChar(Txt As String) As Variant
With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "\D"
    StripChar = Val(.Replace(Txt, " "))
End With
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...