2016-01-21 3 views
7

У меня есть строка в ячейке, скажем, она говорит «Клиент Ref: F123456PassPlus». Возможно, что строка не имеет буквы перед цифрами, возможно, есть символ в числах, и возможно существует пробел между буквой и цифрами. Мне нужно извлечь только числа в виде переменной. У меня есть код для этого, но он не знает, когда прекратить цикл через строку. Он должен остановиться, когда есть что-то другое, кроме числа или символа, но оно продолжается.Excel VBA цикл через строку чисел до тех пор, пока не будет найдена буква

IsNumber = 1 
ref = "" 
If branch = "" Then 
    e = b 
Else 
    e = b + 1 
End If 
f = 1 
While IsNumber = 1 
    For intpos = 1 To 15 
     ref = Mid(x, e, f) 
     f = f + 1 
     Select Case Asc(ref) 
      Case 45 To 57 
       IsNumber = 1 
      Case Else 
       IsNumber = 0 
       Exit For 
     End Select 
    Next 
    IsNumber = 0 
Wend 

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

+0

Везде, где вы хотите закончить суб, просто добавьте 'Exit Sub'. – BruceWayne

+0

Мне нужен макрос, чтобы узнать, когда в нем есть письмо (или, желательно, прямо перед этим), тогда я бы использовал «Exit For» в моем коде. С тем, что я написал, я думал, что это должно быть так, но, видимо, нет. –

+1

Вы debug.print Asc (ref), чтобы увидеть значения? – CPMunich

ответ

3

Я избавилась от проверки Asc и добавил проверку в отношении каждого персонажа, как вы передаете его, прежде чем строить числовую «строка».

IsNumber = 1 
ref = "" 
If branch = "" Then 
    e = b 
Else 
    e = b + 1 
End If 
f = 1 
While IsNumber = 1 
    For intpos = 1 To 15 
     char = Mid(x, e + intpos, 1) 
     f = f + 1 
     If IsNumeric(char) Then 
      ref = Mid(x, e, f) 
      IsNumber = 1 
     Else 
      IsNumber = 0 
      Exit For 
     End If 
    Next 
    IsNumber = 0 
Wend 
2

Этот код, свободно основанный на ваших работах, производит «12345»). Для больших строк или более сложных запросов на извлечение я бы рассмотрел возможность изучения COM-объекта регулярного выражения.

Function ExtractNumber(ByVal text As String) As String 

    ExtractNumber = "" 

    foundnumber = False 

    For e = 1 To Len(text) 
    ref = Mid(text, e, 1) 
     Select Case Asc(ref) 
      Case 45 To 57 'this includes - . and /, if you want only digits, should be 48 to 57 
       foundnumber = True 
       ExtractNumber = ExtractNumber & ref 
      Case Else 
       If foundnumber = True Then Exit For 
     End Select 
    Next 

End Function 
5

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

Этот пример удалит все нецифровые из строки, расположенной в A1 и представить результат в окне сообщения. Шаблон используется [^0-9]

Sub StripDigits() 
    Dim strPattern As String: strPattern = "[^0-9]" 
    Dim strReplace As String: strReplace = vbnullstring 
    Dim regEx As New RegExp 
    Dim strInput As String 
    Dim Myrange As Range 

    Set Myrange = ActiveSheet.Range("A1") 

    If strPattern <> "" Then 
     strInput = Myrange.Value 
     strReplace = "" 

     With regEx 
      .Global = True 
      .MultiLine = True 
      .IgnoreCase = False 
      .Pattern = strPattern 
     End With 

     If regEx.test(strInput) Then 
      MsgBox (regEx.Replace(strInput, strReplace)) 
     Else 
      MsgBox ("Not matched") 
     End If 
    End If 
End Sub 

Убедитесь, что вы добавить ссылку на «Microsoft VBScript Regular Expressions 5,5»

Для получения дополнительной информации о том, как использовать регулярные выражения в Excel, включая примеры пробегают по диапазонам check out this post.

Результаты:

enter image description here

+0

Ничего, я думал об использовании регулярного выражения, но не хочу знать достаточно, чтобы написать что-нибудь. Хорошая мысль! – BruceWayne

+0

Хороший подход. Использование 'vbnullstring' немного более эффективно, чем' '' '' ' – brettdj

Смежные вопросы