Страницы: Пред. 1 2
RSS
Выделение из текста цифр и ариф. действие с ними
 
кузя1972, возвращает #ЗНАЧ! в Вашем примере. Что такое "$&", если не секрет?

Цитата
БМВ написал:
Все там есть, смотрите более внимательно всю строку.
Увидел. Тогда как-то так надо, чтобы алабаям рост и вес не увеличить заодно:
Код
Function IncrNumbersInAttach(ByVal txt As String, iDelta As Long) As String
    Set myRegExp = CreateObject("VBScript.RegExp")
    With myRegExp
       .Pattern = "\[attach.*attach\]"
       .IgnoreCase = True
       .Global = True
       .MultiLine = True
    End With
    Set mc = myRegExp.Execute(txt)
    
    myRegExp.Pattern = "\d+"
    Dim s As String
    For Each attach In mc
        s = CStr(attach.Value)
        
        Set imc = myRegExp.Execute(s)
        For Each n In imc
            s = Mid(s, 1, n.FirstIndex) & (CLng(n.Value) + iDelta) & Mid(s, n.FirstIndex + n.Length + 1, Len(s))
        Next n
        
        txt = Mid(txt, 1, attach.FirstIndex) & s & Mid(txt, attach.FirstIndex + attach.Length + 1, Len(attach))
    Next attach
    IncrNumbersInAttach = txt
End Function

Мы ведь заранее не знаем, сколько в тексте attach'ей ;)?
 
IrregularExpression  в ответ на #31,$& -это специальная переменная,которая перекочевала в VBA из лучшего языка для обработки текстов  создателя Ларри Уолла Perl(иногда ее называют волшебной переменной),я подкорректировал текст своего сообщения.
Если не секрет ,что означает Ваш ник IrregularExpression?
 
Ну так что., товарищи программисты, есть ли решение мой задачи?
 
Doc77,  и не одно. Вы предыдущие сообщения все прочли? Все перепробовали?
По вопросам из тем форума, личку не читаю.
 
А что, разве до сих пор не решили?
 
Не, ему просто лень тестировать - балованный :)
Зря тут регулярки притягивают. Пожалуй, на мой взгляд, у БМВ оптимальное решение
 
Не в лени дело. В ексель только элементарные формулы освоил. Мне нужна помощь. Подожду ответа БМВ  
 
Андрей VG,  Спасибо но правда ему все равно как расположены теги :-) . У Вашего тезки тоже норм вариант, только ошибки обработать, на случай если тегов нужных нет.

Doc77, тут  я в ваш файл все положил. и формулу прописал. далее парни также выкладывали примеры, но файлы я не смотрел.
Функцию надо поместить в модуль и пользоваться на ровне с остальными встроенными. Писать код для замены в столбике по кнопке - мне скучно.
Вот если что в файле не понятно, то пишите подскажу.
По вопросам из тем форума, личку не читаю.
 
вот макрос для ввода функции из #30 ,например,в диапазон N1:N2,кнопка test,все остальные функции также в стандартном модуле,
для тестирования поменяйте функцию vvv в макросе на любую другую функцию и возьмите Ваш диапазон,вместо N1:N2,если требуется
 
Код
Sub test()
   Application.Calculation = -4135
    Range("N1:N2").Formula = "=vvv(A1)": Application.Calculation = -4105
End Sub
Изменено: кузя1972 - 25.07.2018 18:54:21
 
Непонятно все. Открываю. вашу книгу с макросом. Вставляю в стобец свои данные, далее, 2 т.строк.. Не ясно где вводить число, которое будет прибавятся к числам в аттачах.
 
если Вы по #39,то число там,согласно #30 уже 10,там можно прямо в тексте макроса поменять на любое,
диапазон идет от первой строки можно исправить на любой,например N1:N2000,если входные данные такие по размеру.
 
Цитата
Андрей VG написал:
Зря тут регулярки притягивают.
1) Ради спортивного интереса с учётом слов БМВ в #20 :). Только "помидоров" всё равно не будет, т.к. его решение самое оптимальное.
2) Чтобы у ТС был выбор альтернатив.

Цитата
кузя1972 написал:
специальная переменная,которая перекочевала в VBA из лучшего языка для обработки текстов  создателя Ларри Уолла Perl(иногда ее называют волшебной переменной),я подкорректировал текст своего сообщения.
Возвращает сейчас Ваша функция aaa() вот это: "[attach]13 + 10,15 + 10,16 + 10[/attach]", а не "[attach]23,25,26[/attach]".
Т.к. шаблон замены - это строка, а не исполняемый код.
Варианта арифметических действий или иных операций с шаблоном замены RegExp'а, чтобы избавиться от циклов, я, честно говоря, так и не смог найти :(. Поэтому, думаю, что рабочее решение с регулярными выражениями VBS тут будет только как в #31. Без Replace'ов.
Либо действительно через объект ScriptControl и JS.
Про синтаксис шаблонов замены VBS почитал, спасибо за наводку.
 
IrregularExpression,как Вы правильно заметили мой рабочий вариант-это со Sciptcontrol  и JS из #30,вариант с aaa  у меня иллюстративный,если кто сможет довести его до аналогичного,как в #30-без увеличения количества строк с применением регулярок,было бы интересно.
Я ориентировался на минимальное количество строк,здесь 5.
А так все,предложенные  участниками обсуждения функции интересны по-своему.
 
в ответ на#40,протестируйте вариант для 200 строк данных,для 2000 сделайте по аналогии,кнопки test и очистка в столбце N
Для простоты величину суммирования(10) меняйте прямо в макросе test и в тексте функции vvv
как альтернатива используйте макросы очистка и test1
Код
Sub test1()
    Dim i1&, delta&: i1 = Range("A" & Rows.Count).End(xlUp).Row
    delta = InputBox("Введите величину суммирования")
    Application.Calculation = -4135
    Range("H1:H" & i1).Formula = "=IncrNumbersInAttach(A1," & delta & ")"
    Range("L1:L" & i1).Formula = "=Increm(A1," & delta & ")"
    Application.Calculation = -4105
End Sub


 
Код
Sub test()
    Dim i1&: i1 = Range("A" & Rows.Count).End(xlUp).Row
    Application.Calculation = -4135
    Range("C1:C" & i1).Formula = "=vvv(A1)"
    Range("H1:H" & i1).Formula = "=IncrNumbersInAttach(A1,10)"
    Range("L1:L" & i1).Formula = "=Increm(A1,10)"
    Application.Calculation = -4105
End Sub
Изменено: кузя1972 - 25.07.2018 23:29:35
 
вариант без функций,данные в A1:A200 вывод в диапазон B1:B200,кнопки test3 и очистка2
Код
Sub test3()
    Dim z, i&: z = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
    With CreateObject("ScriptControl"): .Language = "JScript"
        .AddCode "function g(t){return t.replace(/\d+/g,function(t1){return Number(t1)+10;});}"
        For i = 1 To UBound(z): z(i, 1) = .Run("g", z(i, 1)): Next
       Range("B1:B" & Range("A" & Rows.Count).End(xlUp).Row).Value = z
    End With
End Sub
Изменено: кузя1972 - 26.07.2018 05:20:17
 
Код
CreateObject("ScriptControl")
Не будет работать в 64бит версиях Excel
 
Андрей VG,у меня 64-битная версия Windows 8.1 и office 2013,все работает.
Изменено: кузя1972 - 26.07.2018 14:50:29
 
Цитата
кузя1972 написал:
64-битная версия,
Увы, в Windows 7 64 bit, что дома, что на работе в 64 бит окружении простейший vbs скрипт вылетает с ошибкой.
Код
Option explicit
Dim p
Set p = CreateObject("ScriptControl")
WScript.Echo p.Language
Возможно в windows 10 и появилась поддержка. Хотя по инету внятного ответа - есть ли ScriptControl для 64 битной версии, нет.
 
Андрей привет! Пишет тоже, что невозможно создать объект "ScriptControl" Windows 7 64 bit, Excel2016 x64.
На Windows 7 64 bit, Excel2010 x32 - создается.
«Бритва Оккама» или «Принцип Калашникова»?
 
На Win 10 ситуация такая же, как в сообщении #49 (последние английская и русские версии)
Владимир
 
Виталий, Владимир, добрый день
Спасибо за исследование.
 
 подредактировал #28
Код
Function aaa$(t$, delta$)
Dim i&,O As Object: aaa = t
With CreateObject("VBScript.RegExp"): .Pattern = "\d+": .Global = True : Set O=.Execute(t)
For i = 0 To O.Count - 1: aaa = Replace(aaa, O(i), Evaluate(.Execute(aaa)(i) & "+" & delta)): Next
End With
End Function
Изменено: кузя1972 - 31.07.2018 06:26:22
 
Цитата
кузя1972 написал:
For i = 0 To .Execute(t).Count - 1: aaa = Replace(aaa, .Execute(t)(i), Application.Evaluate(.Execute(aaa)(i) & "+" & delta)): Next
Не перебор ли с вызовами Excecute по одному и тому же месту? Регулярные выражения - не самый быстрый инструмент.
 
Андрей VG предложите,что-нибудь короче,например, в 5 строчек кода,аналогично,например#30.
Изменено: кузя1972 - 31.07.2018 00:24:49
 
Цитата
кузя1972 написал:
предложите,что-нибудь короче
А смысл? Никогда не понимал формулистов в избушке, когда они начинают соревнование - у кого короче.
Основной же критерий - правильность выполнения. Так у вас эта сокращённая версия, увы, считает не правильно.
А далее критерии оптимизации. При одинаковой скорости - у кого меньше "жрёт" памяти. Или наоборот - при одинаковом объёме использования памяти - у кого быстрее. Ну, тут ваш алгоритм проигрывает в силу "краткости" простейшему варианту реализации того же.
Плюс, весьма важный критерий "читабельность" и модифицируемость кода. Тут у вас...  Хотя соглашусь - для форума и так сойдёт. Для форума - главное направление, а напильник - это уже дело вопрошающего, с другой стороны - стоит ли учить плохому подходу в кодировании - вот вопрос.
Изменено: Андрей VG - 01.08.2018 18:05:46
 
АндрейVG,добрый вечер, мой основной короткий вариант,из 5 строк  в данной теме из #30 считает все правильно и в Вашем примере-согласно файл-примеру,
вариант с aaa посмотрю завтра или в пятницу  вечером после работы,сейчас далеко от компьютера,с собой только планшет яблоко.
К Вам вопрос не по теме,куда пропал пользователь,любитель регулярок MBT?
Изменено: кузя1972 - 02.08.2018 10:14:48
 
OFF
Цитата
Андрей VG написал:
А смысл? Никогда не понимал формулистов в избушке, когда они начинают соревнование - у кого короче. Основной же критерий - правильность выполнения.
Андрей , приветствую.
Согласен на 100%, что первично  - это правильный результат. Все остальное подлежит отдельному взвешиванию. Однако любые варианты, пусть короткие и не понятные или оптимальные по скорости или … это часто задел на будущее. Я хоть о регулярках знаю, но применял из всего 1 раз в жизни и больше потребности не было. Для Wiss, и  мой вариант оказался хорошим примером.  Мы все учимся друг у друга и мозголомство порой выдает не только короткие и непонятные формулы, но и до ужаса простые и эффективные. За достаточно долгий период, мне лично запомнилось вот это решение.
По вопросам из тем форума, личку не читаю.
 
в ответ на #55-#56.
Пользователь Андрей VG дополнил(расширил ) файл-пример создателя темы,в полученном файл примере по-прежнему работает
предложенный в #30 мной базовый вариант-  функция vvv и уточненная  функция aaa
Код
Function aaa$(t$, delta&)
  Dim i&, t1$, t2$, s$
With CreateObject("VBScript.RegExp"): .Pattern = "\D+": .Global = True
   t1 = .Execute(t)(0): t2 = .Execute(t)(.Execute(t).Count - 1): .Pattern = "\d+"
   For i = 0 To .Execute(t).Count - 1: s = s & "," & .Execute(t)(i) + delta: Next
End With: aaa = t1 & Mid(s, 2) & t2
End Function
Изменено: кузя1972 - 10.08.2018 21:16:55
Страницы: Пред. 1 2
Наверх