Excel VBA: как мне извлечь число из строки?

#excel #excel-2007 #vba

#excel #excel-2007 #vba

Вопрос:

Я хочу извлечь числа из строки. Строки записываются в каждую ячейку следующим образом.

 1, 1
1, 2
1, 3
  

Числа просто разделяются запятыми.

Как мне извлечь из них числа в Excel VBA?

Большое вам спасибо.

Комментарии:

1. Вы можете использовать Split(value, ",") — это вернет массив вариантов

2. Каков желаемый результат строки из приведенного выше? 11 12 13?

Ответ №1:

Если я правильно понял ваш вопрос, у вас есть «1, 1» в ячейке A1, «1, 2» в ячейке A2, «1, 3» в ячейке A3.

Если вам нужны соответственно числа перед запятой в ячейках B1, B2 и B3 и числа после запятой в ячейках C1, C2 и C3, вы можете сделать следующее:

РЕШЕНИЕ НА VBA:

 Public Sub test()
    'the variables' declaration has been corrected, check 
    'the post's comments below to find out which correction were made
    Dim lngLeft as Long, lngRight as Long, lngCommaPos As Long
    Dim intI As Integer
    For intI = 1 To 3
        lngCommaPos = InStr(1, Range("A" amp; intI).Value, ",")
        lngLeft = Left(Range("A" amp; intI).Value, lngCommaPos - 1)
        lngRight = Right(Range("A" amp; intI).Value, Len(Range("A" amp; intI).Value) - lngCommaPos - 1)
        Range("B" amp; intI).Value = lngLeft
        Range("C" amp; intI).Value = lngRight
    Next intI
End Sub
  

Решение, отличное от VBA:

Вставьте следующую формулу в ячейку B1:
=ЗНАЧЕНИЕ(LEFT(A1,FIND(«,», A1)-1))

Вставьте следующую формулу в ячейку C1:
=ЗНАЧЕНИЕ(RIGHT(A1,LEN(A1)-FIND(«,», A1)-1))

Скопируйте ячейки B1 и C1, вставьте в ячейки B2 — C3

Если вы хотите, чтобы в столбцах B и C были строки (вместо чисел), вы можете удалить функцию VALUE, и формулы в ячейках B1 и C1 будут иметь вид
= ВЛЕВО (A1,FIND(«,»,A1) -1)

= ВПРАВО (A1,LEN(A1)-FIND(«,»,A1) -1)

Комментарии:

1. Думаю, что это =LEFT(A1;FIND(",";A1)-1) должно быть =LEFT(A1,FIND(",",A1)-1) и так далее

2. У меня установлена итальянская версия Excel, и аргументы функции разделяются точками с запятой. Я думал, что это работает так же на любом другом языке. Моя ошибка. Ну, по крайней мере, я только что узнал кое-что новое об Excel 🙂

3. Немного не связанные, но вы понимаете, что lngLeft и lngRight объявляются здесь как переменные, верно? VBA не позволяет вам объявлять переменные, как вы делаете в коде. 🙂

4. Я не смог толком понять, что вы сказали, затем я выполнил поиск в Интернете и обнаружил, что если я объявлю свои переменные таким образом: Dim lngLeft, lngRight, lngCommaPos, то пока lngLeft и lngRight будут иметь размеры Variant. Вы имели в виду, что я должен объявлять переменные Dim lngLeft как длинные, lngRight как длинные, lngCommaPos как длинные ? @Issun

5. У вас получилось идеально. В VB вы можете опустить все значения «As Long», но в VBA вы должны поместить туда каждое из них, иначе только последняя переменная объявляется как тип, который вы хотели. 🙂 Не то чтобы ваш код вообще не работал, но я подумал, что вы этого не знали, поскольку использовали в них префикс «lng». 🙂

Ответ №2:

* Предполагается, что желаемый результат равен 11, 12 и 13.

Приведенные ниже функции были написаны как функции, но вместо этого их можно легко преобразовать в подпрограммы. Я не хотел вдаваться в диапазоны настроек и просто сосредоточиться на функции.

Если ваши данные представляют собой просто числа, разделенные запятыми и пробелами, то просто используйте replace:

 Function ExtractNumber(ByVal text As String) As String

ExtractNumber = Replace(text, ", ", "")

End Function
  

Если вам нужна более сложная функция, которая будет извлекать все числа независимо от того, что еще может быть в строке, вот моя функция RegexExtract. По умолчанию я настроил его так, что все записи будут разделяться запятой, но вы можете указать его как none:

 =RegexExtract(A1, "(d)", "")
  
  • ( d) означает захват любых чисел 0-9
  • 3-й параметр — это то, как вы хотели бы, чтобы все записи были разделены (если вообще)

Вот функция:

 Function RegexExtract(ByVal text As String, _
                      ByVal extract_what As String, _
                      Optional seperator As String = ", ") As String

Application.ScreenUpdating = False
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
Dim i As Long, j As Long
Dim result As String

RE.Pattern = extract_what
RE.Global = True
Set allMatches = RE.Execute(text)

For i = 0 To allMatches.Count - 1
    For j = 0 To allMatches.Item(j).submatches.Count - 1
        result = result amp; (seperator amp; allMatches.Item(i).submatches.Item(j))
    Next
Next

If Len(result) <> 0 Then
    result = Right$(result, Len(result) - Len(seperator))
End If

RegexExtract = result
Application.ScreenUpdating = True

End Function
  

Ответ №3:

Если вы не хотите использовать VBA, вы также можете использовать текст для столбцов, см.:http://support.microsoft.com/kb/214261