Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Простой парсинг строк в Excel, подскажите формулу


Автор: iDeus 2.2.2013, 15:58
Здравствуйте, подскажите пожалуйста, как можно решить такую задачу:

В таблице Excel есть столбец со строками вида: 

«ЭРТ №2 Такой-то край, Такой-то район, в/г ВоенныйГородок № 42 Кот 174 Здание контрольно-пропускного пункта (караулка)(встроенная) №174» без кавычек. 

Необходимо в три соседних ячейки той же строки, выдернуть числа после первого, второго и третьего символа «№» соответственно.
Учитывая, что между № и цифрой может быть или не быть пробел. 

Число после первого № может быть однозначным или двузначным
Число после второго № может быть однозначным, двузначным, трехзначным или записанным через дробную черту (например 1/1)
Число после третьего № может быть однозначным, двузначным, трехзначными, записанным через дробную черту (например 44/252) или записанным с дополнительным значением в скобках (например 24(83)). 

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

Excel 7-10 года, Windows.

Автор: Akina 2.2.2013, 21:11
Напишите VBA-функцию, и всё...

Автор: Данкинг 2.2.2013, 21:57
Функция MID в помощь.

Автор: diadiavova 3.2.2013, 09:58
На самом деле такие задачи лучше всего решаются регулярными выражениями. Можно подключить к проекту библиотеку Microsoft VBScript Regular Expressions и разобрать текст с её помощью. Документация по библиотеке легко находится в сети, ну вот к примеру
http://www.script-coding.com/WSH/RegExp.html
Для VBA просто малость адаптировать примеры и всё будет работать. Приведу простейший пример
Код

Sub FindNumbers()
    Dim re As New RegExp
    re.Pattern = "№\s?([0-9\(\)\/]+)"
    re.Global = True
    Dim matchColl As MatchCollection
    Set matchColl = re.Execute("ЭРТ №2 Такой-то край, Такой-то район, в/г " & _
"ВоенныйГородок № 42 Кот 174 Здание контрольно-пропускного пункта " & _
"(караулка)(встроенная) №174")
    Range("A1") = matchColl(0).SubMatches(0)
    Range("A2") = matchColl(1).SubMatches(0)
    Range("A3") = matchColl(2).SubMatches(0)
    
End Sub

Здесь я не задавал всех перечисленный условий, просто нашёл все последовательности из цифр, слешей и скобок, следующих за № и необязательным пробелом. Но думаю, что пример совсем несложно доработать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)