Vba excel найти число в строке

I need to find numbers from a string. How does one find numbers from a string in VBA Excel?

ZygD's user avatar

ZygD

21k39 gold badges77 silver badges98 bronze badges

asked Aug 30, 2011 at 6:10

user905527's user avatar

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

paxdiablo's user avatar

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

brettdj's user avatar

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

pstraton's user avatar

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

Rohan Moore's user avatar

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

Ergin's user avatar

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

Ste's user avatar

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-Master's user avatar

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.'s user avatar

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 Bentley's user avatar

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

Zhou Lei's user avatar

2

 

Chyma

Пользователь

Сообщений: 117
Регистрация: 24.12.2012

Всем привет. Дано: текстовая строка. Например «текст 23 + ура5». Найти позицию первого появления цифры. В данном случае для двойки это 7. Попробовал worksheetfunction.search(«#»,»текст 23 + ура5″), но VBA ругается. Почему не понимает «#» ? Решение циклом не предлагать.

 

Jack

Пользователь

Сообщений: 352
Регистрация: 01.01.1970

=ЕСЛИ(ЕОШИБКА(ПОИСК(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
Регистрация: 22.12.2012

#3

07.08.2014 11:04:13

Код
=МИН(ЕСЛИ(ЕЧИСЛО(ПОИСК({0:1:2:3:4:5:6:7:8:9};A1));ПОИСК({0:1:2:3:4:5:6:7:8:9};A1)))

Код
=МИН(ПОИСК({0:1:2:3:4:5:6:7:8:9};A1&1234567890))

Изменено: MCH07.08.2014 11:06:08

 

Jack

Пользователь

Сообщений: 352
Регистрация: 01.01.1970

о как. есть и поизящнее решения {}. спс. надо взять на заметку)
MCH, а можно ликбез по синтаксису предложенного решения?

Изменено: Jack07.08.2014 11:11:57

 

Михаил С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#5

07.08.2014 11:51:59

Цитата
MCH пишет: =МИН(ПОИСК({0:1:2:3:4:5:6:7:8:9};A1&1234567890))

А если изначально нет чисел, как узнаем?

зы. вот так проще набирать (в русском экселе) {1;2;3;4;5;6;7;8;9;0}   :)

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

#6

07.08.2014 12:07:36

Цитата
Михаил С. пишет: А если изначально нет чисел, как узнаем?

В задании об этом ничего нет, а занулять значение с помощью ОСТАТ не было желания

Цитата
Михаил С. пишет: вот так проще набирать (в русском экселе) {1;2;3;4;5;6;7;8;9;0}

Я не набирал, а воспользовался кнопкой F9

 

Максим Зеленский

Пользователь

Сообщений: 4646
Регистрация: 11.06.2014

Microsoft MVP

#7

07.08.2014 12:56:30

Цитата
MCH пишет: а воспользовался кнопкой F9

не понимаю, как  :)  я пользуюсь вот этим

а как использовать F9 для такого же результата? У меня она просто пересчитывает лист, и всё

F1 творит чудеса

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

#8

07.08.2014 14:15:30

Цитата
Максим Зеленский пишет:
не понимаю

Наберите =СТРОКА(A1:A9), нажмите F9 и копируйте результат..

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

Владимир, а я бы не догадался.
чуть дополнил — чтобы ноль вручную не донабирать: =остат(строка(A1:A10);10)

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

#10

07.08.2014 20:04:54

Цитата
Максим Зеленский пишет: а как использовать F9 для такого же результата?

https://yadi.sk/i/Q9FJdhmXZF35t

wander_vafl9

0 / 0 / 0

Регистрация: 20.11.2013

Сообщений: 7

1

Макрос поиска чисел в тексте

27.11.2013, 11:30. Показов 10102. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

писал ранее, но никто не помог! вот упрощенный вопрос:
Текст макроса:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub proba1()
Dim Счетчик As Long
Счетчик = 0
With ActiveDocument.Range.Find
.Text = "<[0-9]@>{2;}"
.Replacement.Text = ""
.Forward = True
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
Do While (.Execute = True)
     Счетчик = Счетчик + 1
  Loop
End With
MsgBox ("Найдено " & Счетчик & " чисел в тексте")
End Sub

необходимо считать все числа в тексте, но если число 2-х значное, 3-х и т.д., то все равно считать за 1 число! + теперь надо учитывать одинаковые числа как 1!
как я понял необходимо переделать эту строку .Text = «<[0-9]@>{2;}» , но я без понятия как. помогите пожалуйста!
или тут закончились люди знающие язык VBA при создании макросов в Worde!



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 (сделанный при моём участии). Он считает буквосочетания; потом настрою на сочетания цифр (чем и являются целые числа).

Цитата
Сообщение от Skif-F

…функцию сортировки взял из:
Род Стивенс «Готовые алгоритмы на Visual Basic»



1



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

27.11.2013, 17:52

6

Оптимизированный для этой задачи код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub proba2()
    Dim temp$, Ar, i&, j%, Schetchik&, Uslovie As Boolean
    temp = ActiveDocument.Content.Text
    temp = Replace(temp, vbCr, " ")
    temp = Replace(temp, vbLf, " ")
    temp = Replace(temp, vbTab, " ")
    Ar = Split(temp, " ")
    With CreateObject("Scripting.Dictionary")
        For i = 0 To UBound(Ar)
            If Ar(i) Like "#*" Then
                Uslovie = True
                For j = 2 To Len(Ar(i))
                    If Not Mid(Ar(i), j, 1) Like "#" Then Uslovie = False : Exit For 
                Next
                If Uslovie Then
                    If Not .Exists(Ar(i)) Then
                        Schetchik = Schetchik + 1: .Item(Ar(i)) = &H0
                    End If
                End If
            End If
        Next
    End With
    MsgBox ("Найдено " & Schetchik & " различных чисел в тексте.")
End Sub

Не считаются : сочетания букв и цифр, числа содержащие «.», «,» , «-«, «+» .

Добавлено через 7 минут
Если числа примыкают к знакам препинания без пробела, то надо добавить еще

Visual Basic
1
2
3
    temp = Replace(temp, ".", " ")
    temp = Replace(temp, ",", " ")
    temp = Replace(temp, ";", " ")



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
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

Простите за глупость :oops:

Что такое like??

Это такой оператор, или функция???

Ичто он/она делает.


gaidar
System Debugger
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! :arrow:

И пусть в моих поступках не было логики…


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 function

debug.? 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 String

For 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 If

            Case "."
            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 Select

        If InStr(stroka, ch) Then
        chislo = chislo & Mid(st, i, 1)
    End If

    Next i

chislo — Нужное тебе число (в текстовом виде)

Далее, в зависимости от типа числа (Integer или Double), преобразовываешь его в нужный тебе тип…


Sanya Z
Бывалый
Бывалый
Аватара пользователя

 
Сообщения: 240
Зарегистрирован: 18.08.2003 (Пн) 3:15
Откуда: Москва
  • Сайт
  • ICQ

Сообщение Sanya Z » 07.01.2004 (Ср) 22:35

Всем огромное спасибо! :D Все работает :D

И пусть в моих поступках не было логики…



Вернуться в 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

Like this post? Please share to your friends:
  • Vba excel найти строку по условию
  • Vba excel найти строку по значению ячейки
  • Vba excel объекты на листе
  • Vba excel найти строку в строке
  • Vba excel объект worksheet