Function рег_извлечь(t$, p$, Optional n = 1) Application.Volatile 'функцию пересчитывать с любым событием With CreateObject("VBScript.RegExp") 'подключаем регулярки If n > 1 Then .Global = True 'если указан не первый номер вхождения - указываем регулярке находить все вхождения .Pattern = p ' берём паттерн регулярки из второго аргумента рег_извлечь = .Execute(t)(n - 1) ' извлекаем из первого аргумента по патттерну из второго аргумента вхождение по номеру из третьего аргумента End With End Function
[/vba]
Юрий_Нд, что именно не работает? [vba]
Код
Function рег_извлечь(t$, p$, Optional n = 1) Application.Volatile 'функцию пересчитывать с любым событием With CreateObject("VBScript.RegExp") 'подключаем регулярки If n > 1 Then .Global = True 'если указан не первый номер вхождения - указываем регулярке находить все вхождения .Pattern = p ' берём паттерн регулярки из второго аргумента рег_извлечь = .Execute(t)(n - 1) ' извлекаем из первого аргумента по патттерну из второго аргумента вхождение по номеру из третьего аргумента End With End Function
80% Одесса. необходимо подключить к проекту VBA ссылку на библиотеку «Microsoft VBScript Regular Expression», для чего в редакторе VBA выбираем Tools - References... В открывшемся окне «References» находим строку «Microsoft VBScript Regular Expression 5.5» (если у вас ее нет, то строку «Microsoft VBScript Regular Expression 1.0»), отмечаем ее галочкой и нажимаем «ОК». [vba]
Код
Sub test_рег_извлечь() For i = 1 To 3 Строка = рег_извлечь("1-23-4", "\d{1,3}", i) MsgBox Строка Next End Sub
80% Одесса. необходимо подключить к проекту VBA ссылку на библиотеку «Microsoft VBScript Regular Expression», для чего в редакторе VBA выбираем Tools - References... В открывшемся окне «References» находим строку «Microsoft VBScript Regular Expression 5.5» (если у вас ее нет, то строку «Microsoft VBScript Regular Expression 1.0»), отмечаем ее галочкой и нажимаем «ОК». [vba]
Код
Sub test_рег_извлечь() For i = 1 To 3 Строка = рег_извлечь("1-23-4", "\d{1,3}", i) MsgBox Строка Next End Sub
Если я не ошибаюсь, то в Вашей функции Вы использовали объекты, которые остались на Вашем компе.
Но тогда, как для человека, который только вчера узнал об объектах в программировании, я не смог так аргументированно объяснить, как это сделал and_evg. Простите за замечание. Далее по делу. Ещё раз Простите, но сейчас я должен взять в руки такие нелюбимые Вами клещи и вытягивать следующее. Согласитесь, что предложенную Вами функцию, я могу применить тупо как черный ящик, у которого на входе входные аргументы, а на "выхлопе" то, что делает или возвращает Ваша функция. И в принципе, я совершенно не обязан знать какая кухня варится внутри этого чёрного ящика. По-моему это современный подход к программированию. Если не ошибаюсь в Экселе это называется модульным принципом. Но если я не знаю, что на входе Вашей функции, и что на "выходе", то тогда стоимость Вашей подсказки почти равна нулю. Из трех входных документов я худо-бедно разобрался, как мне кажется, с первым и последним, почти не сомневаюсь с тем, что "на выхлопе". А вот что делать со вторым входным аргументом? Может подскажете?
Если я не ошибаюсь, то в Вашей функции Вы использовали объекты, которые остались на Вашем компе.
Но тогда, как для человека, который только вчера узнал об объектах в программировании, я не смог так аргументированно объяснить, как это сделал and_evg. Простите за замечание. Далее по делу. Ещё раз Простите, но сейчас я должен взять в руки такие нелюбимые Вами клещи и вытягивать следующее. Согласитесь, что предложенную Вами функцию, я могу применить тупо как черный ящик, у которого на входе входные аргументы, а на "выхлопе" то, что делает или возвращает Ваша функция. И в принципе, я совершенно не обязан знать какая кухня варится внутри этого чёрного ящика. По-моему это современный подход к программированию. Если не ошибаюсь в Экселе это называется модульным принципом. Но если я не знаю, что на входе Вашей функции, и что на "выходе", то тогда стоимость Вашей подсказки почти равна нулю. Из трех входных документов я худо-бедно разобрался, как мне кажется, с первым и последним, почти не сомневаюсь с тем, что "на выхлопе". А вот что делать со вторым входным аргументом? Может подскажете?Юрий_Нд
это не что иное как паттерн регулярного выражения, в данном случае "\d+" - читается очень просто - "\d" - это digit - цифра,"+" - это один или более символов, т.е. запись означает последовательность из одной или более цифр - это функция и ищет - последовательности из цифр, а [vba]
Код
.Execute(t)(n - 1)
[/vba] вынимает вхождение с указанным номером, n-1 потому что у прогеров нумерация с нуля, как-то так
Цитата
что делать со вторым входным аргументом?
это не что иное как паттерн регулярного выражения, в данном случае "\d+" - читается очень просто - "\d" - это digit - цифра,"+" - это один или более символов, т.е. запись означает последовательность из одной или более цифр - это функция и ищет - последовательности из цифр, а [vba]
Код
.Execute(t)(n - 1)
[/vba] вынимает вхождение с указанным номером, n-1 потому что у прогеров нумерация с нуля, как-то так buchlotnik
Сообщение отредактировал buchlotnik - Понедельник, 11.09.2017, 19:59