#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