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