Мне нужно найти числа из string
. Как найти числа из string
в VBA Excel?
Как найти числа из строки?
Ответ 1
Предполагая, что вы имеете в виду, что хотите удалить ненужные номера, вы должны использовать что-то вроде:
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
и эти первые две строки показывают, как вы можете сохранить его в произвольную строковую переменную, по своему усмотрению.
Ответ 2
Регулярные выражения построены для синтаксического анализа. Хотя синтаксис может занять некоторое время, чтобы поднять этот подход, он очень эффективен и очень гибкий для обработки более сложных выделений/замены строк
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
Ответ 3
Развертывание на 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
Ответ 4
Используйте встроенную функцию VBA Val, если числа находятся в начале строки:
Dim str as String
Dim lng as Long
str = "1 149 xyz"
lng = Val(str)
lng = 1149
Ответ 5
Это вариант brettdj & pstraton post.
Это вернет истинное значение и не даст вам #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
Ответ 6
Это основано на другом ответе, но просто переформатировано:
Предполагая, что вы хотите удалить не числа, вы должны использовать что-то вроде:
'
' 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
и эти первые две строки показывают, как вы можете сохранить ее в произвольной строковой переменной, чтобы делать с ней по своему усмотрению.
Ответ 7
Я искал ответ на тот же вопрос, но какое-то время я нашел свое собственное решение и хотел поделиться им с другими людьми, которым в будущем понадобятся эти коды. Вот еще одно решение без функции.
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
результат = 1234
Ответ 8
Альтернатива через 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