I need to find numbers from a string
. How does one find numbers from a string
in VBA Excel?
ZygD
21k39 gold badges77 silver badges98 bronze badges
asked Aug 30, 2011 at 6:10
0
Assuming you mean you want the non-numbers stripped out, you should be able to use something like:
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
Calling this with:
Dim myStr as String
myStr = onlyDigits ("3d1fgd4g1dg5d9gdg")
MsgBox (myStr)
will give you a dialog box containing:
314159
and those first two lines show how you can store it into an arbitrary string variable, to do with as you wish.
answered Aug 30, 2011 at 6:20
paxdiablopaxdiablo
844k233 gold badges1565 silver badges1937 bronze badges
6
Regular expressions are built to parse. While the syntax can take a while to pick up on this approach is very efficient, and is very flexible for handling more complex string extractions/replacements
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
answered Sep 14, 2011 at 8:33
brettdjbrettdj
54.6k16 gold badges113 silver badges176 bronze badges
4
Expanding on brettdj’s answer, in order to parse disjoint embedded digits into separate numbers:
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
answered May 28, 2014 at 22:19
pstratonpstraton
1,04014 silver badges9 bronze badges
1
Use the built-in VBA function Val, if the numbers are at the front end of the string:
Dim str as String
Dim lng as Long
str = "1 149 xyz"
lng = Val(str)
lng = 1149
Val Function, on MSDN
answered Jul 22, 2018 at 13:26
3
I was looking for the answer of the same question but for a while I found my own solution and I wanted to share it for other people who will need those codes in the future. Here is another solution without function.
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
answered May 22, 2019 at 6:23
ErginErgin
431 silver badge7 bronze badges
This a variant of brettdj’s & pstraton post.
This will return a true Value and not give you the #NUM!
error. And D
is shorthand for anything but digits. The rest is much like the others only with this minor fix.
Function StripChar(Txt As String) As Variant
With CreateObject("VBScript.RegExp")
.Global = True
.Pattern = "D"
StripChar = Val(.Replace(Txt, " "))
End With
End Function
answered Sep 25, 2018 at 19:29
SteSte
1,6301 gold badge14 silver badges26 bronze badges
This is based on another answer, but is just reformated:
Assuming you mean you want the non-numbers stripped out, you should be able to use something like:
'
' 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
Calling this with:
Dim myStr as String
myStr = GetDigits("3d1fgd4g1dg5d9gdg")
Call MsgBox(myStr)
will give you a dialog box containing:
314159
and those first two lines show how you can store it into an arbitrary string variable, to do with as you wish.
answered May 5, 2019 at 12:12
Top-MasterTop-Master
7,0915 gold badges35 silver badges62 bronze badges
Alternative via Byte
Array
If you assign a string to a Byte
array you typically get the number equivalents of each character in pairs of the array elements. Use a loop for numeric check via the Like
operator and return the joined array as string:
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
Example call
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
would display the original string and the result string in the immediate window:
a12bx99y /:3,14159 => 1299314159
answered May 22, 2019 at 9:12
T.M.T.M.
9,2293 gold badges32 silver badges57 bronze badges
Based on @brettdj’s answer using a VBScript regex ojbect with two modifications:
- The function handles variants and returns a variant. That is, to take care of a null case; and
- Uses explicit object creation, with a reference to the «Microsoft VBScript Regular Expressions 5.5» library
Function GetDigitsInVariant(inputVariant As Variant) As Variant
' Returns:
' Only the digits found in a varaint.
' Examples:
' GetDigitsInVariant(Null) => Null
' GetDigitsInVariant("") => ""
' GetDigitsInVariant(2021-/05-May/-18, Tue) => 20210518
' GetDigitsInVariant(2021-05-18) => 20210518
' Notes:
' If the inputVariant is null, null will be returned.
' If the inputVariant is "", "" will be returned.
' Usage:
' VBA IDE Menu > Tools > References ...
' > "Microsoft VBScript Regular Expressions 5.5" > [OK]
' With an explicit object reference to RegExp we can get intellisense
' and review the object heirarchy with the object browser
' (VBA IDE Menu > View > Object Browser).
Dim regex As VBScript_RegExp_55.RegExp
Set regex = New VBScript_RegExp_55.RegExp
Dim result As Variant
result = Null
If IsNull(inputVariant) Then
result = Null
Else
With regex
.Global = True
.Pattern = "[^d]+"
result = .Replace(inputVariant, vbNullString)
End With
End If
GetDigitsInVariant = result
End Function
Testing:
Private Sub TestGetDigitsInVariant()
Dim dateVariants As Variant
dateVariants = Array(Null, "", "2021-/05-May/-18, Tue", _
"2021-05-18", "18/05/2021", "3434 ..,sdf,sfd 444")
Dim dateVariant As Variant
For Each dateVariant In dateVariants
Debug.Print dateVariant & ": ", , GetDigitsInVariant(dateVariant)
Next dateVariant
Debug.Print
End Sub
answered Jan 4, 2021 at 19:20
John BentleyJohn Bentley
1,6381 gold badge16 silver badges18 bronze badges
Public Function ExtractChars(strRef$) As String
'Extract characters from a string according to a range of charactors e.g'+.-1234567890'
Dim strA$, e%, strExt$, strCnd$: strExt = "": strCnd = "+.-1234567890"
For e = 1 To Len(strRef): strA = Mid(strRef, e, 1)
If InStr(1, strCnd, strA) > 0 Then strExt = strExt & strA
Next e: ExtractChars = strExt
End Function
In the immediate debug dialog:
? ExtractChars(«a-5d31.78K»)
-531.78
answered Nov 6, 2021 at 15:44
2
Chyma Пользователь Сообщений: 117 |
Всем привет. Дано: текстовая строка. Например «текст 23 + ура5». Найти позицию первого появления цифры. В данном случае для двойки это 7. Попробовал worksheetfunction.search(«#»,»текст 23 + ура5″), но VBA ругается. Почему не понимает «#» ? Решение циклом не предлагать. |
Jack Пользователь Сообщений: 352 |
=ЕСЛИ(ЕОШИБКА(ПОИСК(1;D2));ЕСЛИ(ЕОШИБКА(ПОИСК(2;D2));ЕСЛИ(ЕОШИБКА(ПОИСК(3;D2));ЕСЛИ(ЕОШИБКА(ПОИСК(4;D2));ЕСЛИ(ЕОШИБКА(ПОИСК(5;D2));ЕСЛИ(ЕОШИБКА(ПОИСК(6;D2));ЕСЛИ(ЕОШИБКА(ПОИСК(7;D2));ЕСЛИ(ЕОШИБКА(ПОИСК(8;D2));ЕСЛИ(ЕОШИБКА(ПОИСК(9;D2));ЕСЛИ(ЕОШИБКА(ПОИСК(0;D2)); 0; ПОИСК(0;D2)); ПОИСК(9;D2)); ПОИСК(8;D2)); ПОИСК(7;D2)); ПОИСК(6;D2)); ПОИСК(5;D2)); ПОИСК(4;D2)); ПОИСК(3;D2)); ПОИСК(2;D2)); ПОИСК(1;D2)) цифр только 10. последовательным определением позиции цифры от 0 до 9 |
MCH Пользователь Сообщений: 3875 |
#3 07.08.2014 11:04:13
Изменено: MCH — 07.08.2014 11:06:08 |
||||
Jack Пользователь Сообщений: 352 |
о как. есть и поизящнее решения {}. спс. надо взять на заметку) Изменено: Jack — 07.08.2014 11:11:57 |
Михаил С. Пользователь Сообщений: 10514 |
#5 07.08.2014 11:51:59
А если изначально нет чисел, как узнаем? зы. вот так проще набирать (в русском экселе) {1;2;3;4;5;6;7;8;9;0} |
||
MCH Пользователь Сообщений: 3875 |
#6 07.08.2014 12:07:36
В задании об этом ничего нет, а занулять значение с помощью ОСТАТ не было желания
Я не набирал, а воспользовался кнопкой F9 |
||||
Максим Зеленский Пользователь Сообщений: 4646 Microsoft MVP |
#7 07.08.2014 12:56:30
не понимаю, как я пользуюсь вот этим а как использовать F9 для такого же результата? У меня она просто пересчитывает лист, и всё F1 творит чудеса |
||
Владимир Пользователь Сообщений: 8196 |
#8 07.08.2014 14:15:30
Наберите =СТРОКА(A1:A9), нажмите F9 и копируйте результат.. «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
||
ikki Пользователь Сообщений: 9709 |
Владимир, а я бы не догадался. фрилансер Excel, VBA — контакты в профиле |
MCH Пользователь Сообщений: 3875 |
#10 07.08.2014 20:04:54
https://yadi.sk/i/Q9FJdhmXZF35t |
||
wander_vafl9 0 / 0 / 0 Регистрация: 20.11.2013 Сообщений: 7 |
||||
1 |
||||
Макрос поиска чисел в тексте27.11.2013, 11:30. Показов 10102. Ответов 5 Метки нет (Все метки)
писал ранее, но никто не помог! вот упрощенный вопрос:
необходимо считать все числа в тексте, но если число 2-х значное, 3-х и т.д., то все равно считать за 1 число! + теперь надо учитывать одинаковые числа как 1!
0 |
0 / 0 / 0 Регистрация: 20.11.2013 Сообщений: 7 |
|
27.11.2013, 13:58 [ТС] |
3 |
Спасибо, конечно не просто макрос, но я думаю попробую разобраться!) если не трудно, не могли бы вы сказать, как дополнить мой макрос?) или необходимо его полностью поменять?
0 |
5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
|
27.11.2013, 15:18 |
4 |
Макрос совсем не годится для данной задачи.
0 |
5561 / 1367 / 150 Регистрация: 08.02.2009 Сообщений: 4,107 Записей в блоге: 30 |
|
27.11.2013, 15:23 |
5 |
Под рукой нет Word’а, но на будущее дам вам частотный словарь от Skif-F (сделанный при моём участии). Он считает буквосочетания; потом настрою на сочетания цифр (чем и являются целые числа).
…функцию сортировки взял из:
1 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||||||
27.11.2013, 17:52 |
6 |
|||||||
Оптимизированный для этой задачи код:
Не считаются : сочетания букв и цифр, числа содержащие «.», «,» , «-«, «+» . Добавлено через 7 минут
2 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
27.11.2013, 17:52 |
Помогаю со студенческими работами здесь Макрос поиска Макрос поиска и вставки Макрос сложного поиска Макрос поиска по дате Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 6 |
Нахождение числа в строке
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
- Sanya Z
- Бывалый
- Сообщения: 240
- Зарегистрирован: 18.08.2003 (Пн) 3:15
- Откуда: Москва
-
- Сайт
- ICQ
Нахождение числа в строке
Как из такой строки выбрать только число Например: «pr123st»
Большое спасибо!
И пусть в моих поступках не было логики…
- ANDLL
- Великий гастроном
- Сообщения: 3450
- Зарегистрирован: 29.06.2003 (Вс) 18:55
-
- ICQ
ANDLL » 06.01.2004 (Вт) 18:09
- Код: Выделить всё
dim I as long, pos as long
for i=0 to 9
pos=instr(stroka,cstr(i))
if pos>0 then
number=val(mid(stroka,pos))
Exit for'а может и не надо...
enb if
next
- Mikle
- Изобретатель велосипедов
- Сообщения: 4120
- Зарегистрирован: 25.03.2003 (Вт) 14:02
- Откуда: Туапсе
Mikle » 06.01.2004 (Вт) 18:11
- Код: Выделить всё
for n = 1 to len(s)
d= val (mid$(s,n))
if d<>0 then exit for
next n
debug.print d
найдет ПЕРВОЕ число в строке.
- gaidar
- System Debugger
- Сообщения: 3152
- Зарегистрирован: 23.12.2001 (Вс) 13:22
-
- Сайт
gaidar » 06.01.2004 (Вт) 18:35
А через Like [0-9] нельзя?
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don’t always know what I’m talking about, but I know I’m right. (c) Muhammad Ali
- Mikle
- Изобретатель велосипедов
- Сообщения: 4120
- Зарегистрирован: 25.03.2003 (Вт) 14:02
- Откуда: Туапсе
Mikle » 06.01.2004 (Вт) 18:48
Можно, только еще «.» для дробей и «-» для отрицательных.
- ANDLL
- Великий гастроном
- Сообщения: 3450
- Зарегистрирован: 29.06.2003 (Вс) 18:55
-
- ICQ
ANDLL » 06.01.2004 (Вт) 18:57
Простите за глупость
Что такое like??
Это такой оператор, или функция???
Ичто он/она делает.
- gaidar
- System Debugger
- Сообщения: 3152
- Зарегистрирован: 23.12.2001 (Вс) 13:22
-
- Сайт
gaidar » 06.01.2004 (Вт) 21:39
Оператор сравнения. Читай msdn.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don’t always know what I’m talking about, but I know I’m right. (c) Muhammad Ali
- Sanya Z
- Бывалый
- Сообщения: 240
- Зарегистрирован: 18.08.2003 (Пн) 3:15
- Откуда: Москва
-
- Сайт
- ICQ
Sanya Z » 06.01.2004 (Вт) 23:41
Насколько я понял вышеназванные коды находят только первую цифру числа, а как выдрать все число Помню, я где-то видел пример, когда в TextBox можно было вводить только цифры. Возможно, на основ этого можно найти и все число, путем посимвольного опознавания. Если у кого есть, киньте please!
И пусть в моих поступках не было логики…
- vilin
- Начинающий
- Сообщения: 23
- Зарегистрирован: 06.01.2004 (Вт) 22:11
- Откуда: Кишинёв
vilin » 07.01.2004 (Ср) 0:54
Например, st=»fsdf342hfdg»
Тогда:
dim chislo as string
dim ch as string
for i=1 to len(st)
ch=mid(st,i,1)
if IsInt(ch) =true then ‘ я не помню точно: IsInt или IsInteger… посмотришь сам
chislo = chislo & ch
endif
next i
dim a as integer
a = int(chislo) ‘ а — нужное тебе число
Вроде бы, должно работать, не проверял…
Если что, пиши…
- Sanya Z
- Бывалый
- Сообщения: 240
- Зарегистрирован: 18.08.2003 (Пн) 3:15
- Откуда: Москва
-
- Сайт
- ICQ
Sanya Z » 07.01.2004 (Ср) 2:03
На IsInt ругается, а идея правильная.
И пусть в моих поступках не было логики…
- GSerg
- Шаман
- Сообщения: 14286
- Зарегистрирован: 14.12.2002 (Сб) 5:25
- Откуда: Магадан
GSerg » 07.01.2004 (Ср) 9:51
Короче, в общем виде…
- Код: Выделить всё
function filter(byval s as string, byval f as string) as string
dim i as long, tmpStr as string
for i=1 to len(s)
tmpstr=mid$(s,i,1)
if instr(f,tmpstr) then filter=filter+tmpstr
next
end functiondebug.? filter("dfgsdf04567d","0123456789.")
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас
- Mikle
- Изобретатель велосипедов
- Сообщения: 4120
- Зарегистрирован: 25.03.2003 (Вт) 14:02
- Откуда: Туапсе
Mikle » 07.01.2004 (Ср) 15:25
Sanya Z
Насколько я понял вышеназванные коды находят только первую цифру числа, а как выдрать все число
Ты бы хоть проверил, что тебе написали, а потом делел выводы. Мой пример дает ВСЕ число, только допиши вначале:
- Код: Выделить всё
DIM n as integer, d as duoble, s as string
s="jddjk-35.345hkjd lsa "
я это не вписал — думал и так понятно.
- Mikle
- Изобретатель велосипедов
- Сообщения: 4120
- Зарегистрирован: 25.03.2003 (Вт) 14:02
- Откуда: Туапсе
Mikle » 07.01.2004 (Ср) 15:32
GSerg
Вариант более, чем с одним числом, например такой:
- Код: Выделить всё
Debug.Print filter("dfgsdf04567d34656", "0123456789.")
или с несколькими десятичными точками, дает неверный результат.
- vilin
- Начинающий
- Сообщения: 23
- Зарегистрирован: 06.01.2004 (Вт) 22:11
- Откуда: Кишинёв
vilin » 07.01.2004 (Ср) 16:54
Я тут немного помучался, и нашёл новый способ решения… правда, переменных многовато…
- Код: Выделить всё
Dim st As String
st = "ksjhgk -32542.25 fkgjdf"
Dim i As Integer
Dim ch As String
Dim ch2 As String
Const stroka = "1234567890"
Dim chislo As StringFor i = 1 To Len(st)
ch = Mid(st, i, 1)
Select Case ch
Case "-"
ch2 = Mid(st, i + 1, 1)
If InStr(stroka, ch2) Then
chislo = chislo & Mid(st, i, 2)
i = i + 1
End IfCase "."
If i <> 1 Then
ch2 = Mid(st, i - 1, 1)
If InStr(stroka, ch2) Then
chislo = chislo & Mid(st, i, 1)
End If
End If
End SelectIf InStr(stroka, ch) Then
chislo = chislo & Mid(st, i, 1)
End IfNext i
chislo — Нужное тебе число (в текстовом виде)
Далее, в зависимости от типа числа (Integer или Double), преобразовываешь его в нужный тебе тип…
- Sanya Z
- Бывалый
- Сообщения: 240
- Зарегистрирован: 18.08.2003 (Пн) 3:15
- Откуда: Москва
-
- Сайт
- ICQ
Sanya Z » 07.01.2004 (Ср) 22:35
Всем огромное спасибо! Все работает
И пусть в моих поступках не было логики…
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: PetalBot и гости: 5
Sub Main() Dim stroka, i, strout stroka = InputBox("Введите строку") strout = "" For i = 1 To Len(stroka) If IsNumeric(Mid(stroka, i, 1)) Then strout = strout & Mid(stroka, i, 1) ' MsgBox(strout) Else If i = Len(stroka) Then If strout <> "" Then MsgBox strout Exit For Else MsgBox "В тексте нет цифр" Exit For End If Else If strout <> "" Then MsgBox strout: Exit For End If End If Next End Sub