Добрый вечер! В ячейке встречается различный текст в разном порядке. Необходимо внутри ячейки выстроить текст в виде "АБВГд 01-23-456-78" Где АБВГд - это точно известные сочетания букв идущие без пробелов внутри себя (иногда "д" может идти после пробела, очень иногда). АБВГд = ГЭСН, ГЭСНм, ГЭСНмр, ГЭСНп, ГЭСНр, ФЕР, ФЕРм, ФЕРмр, ФЕРп, ФЕРр, ФСЭМ, ФССЦ. Следом должен идти пробел. И завершает содержимое новообразованной ячейки четыре числа разделённых между собой тире "-". Тут полный бардак и иногда эти числа идут после буквы "Е", но тогда четыре цифры подряд - их нужно игнорировать. Но тут есть зависимость. Например: "Е2301-001-0 123-01-001- 01 ГЭСН" как мы видим, если в розовые цифры добавить тире после второй цифры, то они будут идентичны красным цифрам. Иногда цифры имеют вид 1-2-3-4 и это допустимо, т.е. "ГЭСН 1-2-3-4" - тоже годится, и можно не выстраивать из них вид "12-34-567-89". Много написал... Основные примеры встречающиеся на практике я привёл в прикреплённом файле. Если нужно, то могу ячейки, которые необходимо править расположить лишь в одном столбце.
Добрый вечер! В ячейке встречается различный текст в разном порядке. Необходимо внутри ячейки выстроить текст в виде "АБВГд 01-23-456-78" Где АБВГд - это точно известные сочетания букв идущие без пробелов внутри себя (иногда "д" может идти после пробела, очень иногда). АБВГд = ГЭСН, ГЭСНм, ГЭСНмр, ГЭСНп, ГЭСНр, ФЕР, ФЕРм, ФЕРмр, ФЕРп, ФЕРр, ФСЭМ, ФССЦ. Следом должен идти пробел. И завершает содержимое новообразованной ячейки четыре числа разделённых между собой тире "-". Тут полный бардак и иногда эти числа идут после буквы "Е", но тогда четыре цифры подряд - их нужно игнорировать. Но тут есть зависимость. Например: "Е2301-001-0 123-01-001- 01 ГЭСН" как мы видим, если в розовые цифры добавить тире после второй цифры, то они будут идентичны красным цифрам. Иногда цифры имеют вид 1-2-3-4 и это допустимо, т.е. "ГЭСН 1-2-3-4" - тоже годится, и можно не выстраивать из них вид "12-34-567-89". Много написал... Основные примеры встречающиеся на практике я привёл в прикреплённом файле. Если нужно, то могу ячейки, которые необходимо править расположить лишь в одном столбце.Yar4i4
ну с буквами понятно, поиск на совпадение (Найти/поиск) и после вставить спереди, по поводу цифр то можете маску использовать тип ##-##-###-##
Да не надо ничего мудрить, все просто. Большая часть решается при помощи обычной регулярки. Остальное устраняется вместе с хаосом, который представляют способы введения данных. [vba]
Код
Function tt(Text As String) Dim obj As Object Text = WorksheetFunction.Trim(Text) With CreateObject("VBScript.Regexp") .Ignorecase = False .MultiLine = False .Pattern = "(\d{1,3}-\d{1,3}-\d{1,3}- ?\d{1,3}) ([А-яЁё]+( [а-яё])?)" Set obj = .Execute(Text) If obj.Count > 0 Then Text = obj(0).submatches(1) & " " & obj(0).submatches(0) End With tt = Text End Function
[/vba] Yar4i4, для большинства вариантов, которые есть в Вашем примере работает. Хотя в одном Вы правы: данные - полный бардак
ну с буквами понятно, поиск на совпадение (Найти/поиск) и после вставить спереди, по поводу цифр то можете маску использовать тип ##-##-###-##
Да не надо ничего мудрить, все просто. Большая часть решается при помощи обычной регулярки. Остальное устраняется вместе с хаосом, который представляют способы введения данных. [vba]
Код
Function tt(Text As String) Dim obj As Object Text = WorksheetFunction.Trim(Text) With CreateObject("VBScript.Regexp") .Ignorecase = False .MultiLine = False .Pattern = "(\d{1,3}-\d{1,3}-\d{1,3}- ?\d{1,3}) ([А-яЁё]+( [а-яё])?)" Set obj = .Execute(Text) If obj.Count > 0 Then Text = obj(0).submatches(1) & " " & obj(0).submatches(0) End With tt = Text End Function
[/vba] Yar4i4, для большинства вариантов, которые есть в Вашем примере работает. Хотя в одном Вы правы: данные - полный бардак МВТ
не могу вставить в макрос - впервые с функцией в виде кода столкнулся. А можно упростить задачу: если константы (ГЭСН, ГЭСНм, ГЭСНмр, ГЭСНп, ГЭСНр, ФЕР, ФЕРм, ФЕРмр, ФЕРп, ФЕРр, ФСЭМ, ФССЦ) встречаются в ячейке, то просто перенести их в начало? Потом мне останется лишь удалить лишние цифры.
не могу вставить в макрос - впервые с функцией в виде кода столкнулся. А можно упростить задачу: если константы (ГЭСН, ГЭСНм, ГЭСНмр, ГЭСНп, ГЭСНр, ФЕР, ФЕРм, ФЕРмр, ФЕРп, ФЕРр, ФСЭМ, ФССЦ) встречаются в ячейке, то просто перенести их в начало? Потом мне останется лишь удалить лишние цифры.Yar4i4
создал модуль 32, вызываю функцию, но далее незнаю что да как. (не моё это, я пока на уровне =СУММ) А можно через макрос? Просто данная задача является завершающим звеном в одном огромном теле макроса. И я точно не смогу внутри тела переход на функцию сделать.
создал модуль 32, вызываю функцию, но далее незнаю что да как. (не моё это, я пока на уровне =СУММ) А можно через макрос? Просто данная задача является завершающим звеном в одном огромном теле макроса. И я точно не смогу внутри тела переход на функцию сделать.Yar4i4
В исходную ячейку результат и нужен. Например: если в ячейке B1 (прикреплённого файла) содержится "Е1303-1-2 13-03-001-02 ГЭСН", то мне нужно, что бы в ячейке B1 стало "ГЭСН 13-03-001-02".
В исходную ячейку результат и нужен. Например: если в ячейке B1 (прикреплённого файла) содержится "Е1303-1-2 13-03-001-02 ГЭСН", то мне нужно, что бы в ячейке B1 стало "ГЭСН 13-03-001-02".
Sub macro() 'Если оставите эту строчку, будет работать на выделенном диапазоне 'For Each cell In Selection
'для всего столбца B For Each cell In Range("b1:b" & Cells(Rows.Count, "b").End(xlUp).Row) cell.Value = tt(cell.Value)'вызов UDF от МВТ Next cell End Sub
[/vba]
Yar4i4, ну можно так: [vba]
Код
Sub macro() 'Если оставите эту строчку, будет работать на выделенном диапазоне 'For Each cell In Selection
'для всего столбца B For Each cell In Range("b1:b" & Cells(Rows.Count, "b").End(xlUp).Row) cell.Value = tt(cell.Value)'вызов UDF от МВТ Next cell End Sub
утром проверил макрос в боевых условиях. Цепляется за первую букву после "ГЭСН" и ставит её в ячейку. Например: Из "Е2203-14-3 22-03-014- 03 ГЭСН изм. вып.2" делает "ГЭСН и 22-03-014- 03" ИЗ "Е2505-27-2 25-05-027- 02 ГЭСНмр тех.ч,р.3, примеч.п.2" делает "ГЭСНмр т 25-05-027- 02" В общем если за "ГЭСН, ГЭСНм, ГЭСНмр, ГЭСНп, ГЭСНр, ФЕР, ФЕРм, ФЕРмр, ФЕРп, ФЕРр, ФСЭМ, ФССЦ" идёт любая буква, то макрос/функция её вставляет в итоговую ячейку.
утром проверил макрос в боевых условиях. Цепляется за первую букву после "ГЭСН" и ставит её в ячейку. Например: Из "Е2203-14-3 22-03-014- 03 ГЭСН изм. вып.2" делает "ГЭСН и 22-03-014- 03" ИЗ "Е2505-27-2 25-05-027- 02 ГЭСНмр тех.ч,р.3, примеч.п.2" делает "ГЭСНмр т 25-05-027- 02" В общем если за "ГЭСН, ГЭСНм, ГЭСНмр, ГЭСНп, ГЭСНр, ФЕР, ФЕРм, ФЕРмр, ФЕРп, ФЕРр, ФСЭМ, ФССЦ" идёт любая буква, то макрос/функция её вставляет в итоговую ячейку.Yar4i4
Не срабатывает на ячейках вида "ФЕР09-05-006-01 Пр. Минрегион от 17.11.08 № 253". Файл приложил, но он не обязателен. Очень, очень прошу. Я не понимаю как он работает. Скорее всего цепляется за большие буквы...
Не срабатывает на ячейках вида "ФЕР09-05-006-01 Пр. Минрегион от 17.11.08 № 253". Файл приложил, но он не обязателен. Очень, очень прошу. Я не понимаю как он работает. Скорее всего цепляется за большие буквы...Yar4i4
А можно через макрос? ... не смогу внутри тела переход на функцию сделать.
[vba]
Код
Sub макрос() Dim obj As Object, Text As String For K = 2 To 3 For I = 1 To 23 Text = WorksheetFunction.Trim(Cells(I, K)) With CreateObject("VBScript.Regexp") .Ignorecase = False .MultiLine = False .Pattern = "(\d{1,3}-\d{1,3}-\d{1,3}- ?\d{1,3}) ([А-яЁё]+( [а-яё])?)" Set obj = .Execute(Text) If obj.Count > 0 Then Text = obj(0).submatches(1) & " " & obj(0).submatches(0) End With Sheets("итог").Cells(I, K) = Text Next Next End Sub
А можно через макрос? ... не смогу внутри тела переход на функцию сделать.
[vba]
Код
Sub макрос() Dim obj As Object, Text As String For K = 2 To 3 For I = 1 To 23 Text = WorksheetFunction.Trim(Cells(I, K)) With CreateObject("VBScript.Regexp") .Ignorecase = False .MultiLine = False .Pattern = "(\d{1,3}-\d{1,3}-\d{1,3}- ?\d{1,3}) ([А-яЁё]+( [а-яё])?)" Set obj = .Execute(Text) If obj.Count > 0 Then Text = obj(0).submatches(1) & " " & obj(0).submatches(0) End With Sheets("итог").Cells(I, K) = Text Next Next End Sub
Спасибо. Работает. Но цепляется ко всем большим буквам и думает, что они и есть ГЭСН, ФЕМ, ФЕРм... В частности на "ГЭСН 09-06-024-05 К=0,7" вместо ГЭСН берёт К. Можно как-нибудь (не знаю как) использовать условие: IF в ячейке есть ГЭСН ... OR ГЭСНм OR THEN ГЭСНм 12-34-567-89
Спасибо. Работает. Но цепляется ко всем большим буквам и думает, что они и есть ГЭСН, ФЕМ, ФЕРм... В частности на "ГЭСН 09-06-024-05 К=0,7" вместо ГЭСН берёт К. Можно как-нибудь (не знаю как) использовать условие: IF в ячейке есть ГЭСН ... OR ГЭСНм OR THEN ГЭСНм 12-34-567-89