I need to find numbers from a string
. How does one find numbers from a string
in VBA Excel?
ZygD
21.2k39 gold badges74 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
846k233 gold badges1567 silver badges1941 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.7k16 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,03814 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,6501 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,2735 gold badges38 silver badges66 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,2593 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
An improved version of spere’s answer (can’t edit his answer), which works for any pattern
Private Function GetNumLoc(textValue As String, pattern As String) As Integer
For GetNumLoc = 1 To (Len(textValue) - Len(pattern) + 1)
If Mid(textValue, GetNumLoc, Len(pattern)) Like pattern Then Exit Function
Next
GetNumLoc = 0
End Function
To get the pattern value you can use this:
Private Function GetTextByPattern(textValue As String, pattern As String) As String
Dim NumLoc As Integer
For NumLoc = 1 To (Len(textValue) - Len(pattern) + 1)
If Mid(textValue, NumLoc, Len(pattern)) Like pattern Then
GetTextByPattern = Mid(textValue, NumLoc, Len(pattern))
Exit Function
End If
Next
GetTextByPattern = ""
End Function
Example use:
dim bill as String
bill = "BILLNUMBER 2202/1132/1 PT2200136"
Debug.Print GetNumLoc(bill , "PT#######")
'Printed result:
'24
Debug.Print GetTextByPattern(bill , "PT#######")
'Printed result:
'PT2200136
Нахождение числа в строке
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
- 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
- Изобретатель велосипедов
- Сообщения: 4128
- Зарегистрирован: 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
- Изобретатель велосипедов
- Сообщения: 4128
- Зарегистрирован: 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
- Изобретатель велосипедов
- Сообщения: 4128
- Зарегистрирован: 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
- Изобретатель велосипедов
- Сообщения: 4128
- Зарегистрирован: 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
Кто сейчас на конференции
Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот] и гости: 2
1014 / 118 / 2 Регистрация: 26.08.2011 Сообщений: 1,113 Записей в блоге: 2 |
|
1 |
|
Узнать есть ли в слове цифры29.12.2020, 16:22. Показов 2045. Ответов 5
Есть составные определители из слов, чисел и буквочисел Нужно узнать, есть ли в слове цифры?
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
29.12.2020, 16:22 |
5 |
КостяФедореев Часто онлайн 794 / 531 / 239 Регистрация: 09.01.2017 Сообщений: 1,823 |
||||
29.12.2020, 16:38 |
2 |
|||
Сообщение было отмечено Catstail как решение РешениеAndreA SN,
1 |
2653 / 1652 / 753 Регистрация: 23.03.2015 Сообщений: 5,193 |
|
29.12.2020, 17:54 |
3 |
AndreA SN,
ли в слове цифры или в ячейке .
0 |
Narimanych 2653 / 1652 / 753 Регистрация: 23.03.2015 Сообщений: 5,193 |
||||||||||
29.12.2020, 21:00 |
4 |
|||||||||
AndreA SN, Вот вариант кода , если в строке НЕ СОДЕРЖИТСЯ буквочисел или числобукв то окрашиваем ячейку в зеленый цвет: Кликните здесь для просмотра всего текста
Вот вариант проверки каждого слова в строке ..если в слове НЕ СОДЕРЖИТСЯ буквочисел или числобукв то окрашиваем слова в красный и выделяем жирным… Кликните здесь для просмотра всего текста
Файл с примером приложил… Вложения
1 |
Catstail Модератор 35190 / 19407 / 4063 Регистрация: 12.02.2012 Сообщений: 32,408 Записей в блоге: 13 |
||||
01.01.2021, 10:35 |
5 |
|||
Или традиционно:
1 |
Заблокирован |
|
01.01.2021, 13:30 |
6 |
Судя по отмеченному “лучшему ответу” ответ можно чуть сократить:
2 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
01.01.2021, 13:30 |
Помогаю со студенческими работами здесь Узнать, есть ли в каждом из чисел 2 одинаковые цифры, стоящие рядом Есть ли какой-то способ узнать, что с консоли введен именно текст, а не цифры Дана строка S. Выяснить есть ли в ней цифры. Если есть, то вывести эти цифры на экран, а также их количество Поиск букв в слове. Напишите программу для проверки, есть ли в слове Х буква «а» Напишите программу, выясняющую, есть ли в слове X буква “к”, и, если есть, то замените все буквы “а” в этом слове на “с” Написать алгоритм Маркова, который в алфавите {a,b,c} удаляет в слове предпоследнюю букву, если в слове есть буквы b Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 6 |
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 Пользователь Сообщений: 3883 |
#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 Пользователь Сообщений: 3883 |
#6 07.08.2014 12:07:36
В задании об этом ничего нет, а занулять значение с помощью ОСТАТ не было желания
Я не набирал, а воспользовался кнопкой F9 |
||||
Максим Зеленский Пользователь Сообщений: 4648 Microsoft MVP 2018-2022 |
#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 Пользователь Сообщений: 3883 |
#10 07.08.2014 20:04:54
https://yadi.sk/i/Q9FJdhmXZF35t |
||