Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Замена по списку регулярных выражений - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Замена по списку регулярных выражений (Макросы/Sub)
Замена по списку регулярных выражений
homer Дата: Суббота, 18.08.2018, 01:08 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Имеется прайс лист. В столбце "описание товара" - текст. Часть текста обернута в метатэги со стилями. Некоторые метатэги нужно полностью убрать, у других - только удалить стили.

Описанное выше делаю в Notepad++ поиском и заменой по регулярным выражениям, но приходится каждое выражение вводить вручную + Notepad++ нарушает файла и в последующем он открывается с испорченным текстом.

Также пробовал выполнять замену по регулярным выражениям в самом экселе с помощью надстройки SEO Excel, где предусмотрена такая замена, но она не работает, когда я пытаюсь обработать с ее помощью весь файл с количеством строк более 5 000.

Прошу помочь с написанием макроса для массовой замены по списку регулярных выражений. Будет замечательно, если в макрос будет возможно добавить еще и замену по списку не регулярных выражений (закрывающих тэгов в моем случае).

Привожу список регулярных выражений, которые я удалял с помощью Notepad++.

Удаляю следующие тэги со стилями внутри (например <div style="xxx">):

(?=<span).*?(?<=>)
(?=<div).*?(?<=>)
(?=<a).*?(?<=>)
(?=<img).*?(?<=>)
(?=<style).*?(?<=>)
(?=<font).*?(?<=>)
(?=<em).*?(?<=>)
(?=<wbr).*?(?<=>)
(?=<u).*?(?<=>)

Заменяю тэги со стилями, на тэги без стилей (например <p style="xxx"> на <p>):

(?=<p).*?(?<=>) НА <p>
(?=<strong).*?(?<=>) НА <strong>
(?=<br).*?(?<=>) НА <br>
(?=<b).*?(?<=>) НА <b>
(?=<table).*?(?<=>) НА <table>
(?=<td).*?(?<=>) НА <td>
(?=<th).*?(?<=>) НА <th>
(?=<li).*?(?<=>) НА <li>
(?=<tr).*?(?<=>) НА <tr>
(?=<tbody).*?(?<=>) НА <tbody>
(?=<h3).*?(?<=>) НА <h3>
(?=<ul).*?(?<=>) НА <ul>

Удаляю закрывающие тэги (не выражения, просто текст):

</span>
</div>
</em>
</font>
</style>
</a>
</u>

ЕЩЕ до замены по регулярным выражениям, заменяю следующий текст на символы в таблице (без чего тэги не отображаются):

" на "
> на >
< на <
К сообщению приложен файл: _2.xlsx (11.4 Kb)
 
Ответить
СообщениеИмеется прайс лист. В столбце "описание товара" - текст. Часть текста обернута в метатэги со стилями. Некоторые метатэги нужно полностью убрать, у других - только удалить стили.

Описанное выше делаю в Notepad++ поиском и заменой по регулярным выражениям, но приходится каждое выражение вводить вручную + Notepad++ нарушает файла и в последующем он открывается с испорченным текстом.

Также пробовал выполнять замену по регулярным выражениям в самом экселе с помощью надстройки SEO Excel, где предусмотрена такая замена, но она не работает, когда я пытаюсь обработать с ее помощью весь файл с количеством строк более 5 000.

Прошу помочь с написанием макроса для массовой замены по списку регулярных выражений. Будет замечательно, если в макрос будет возможно добавить еще и замену по списку не регулярных выражений (закрывающих тэгов в моем случае).

Привожу список регулярных выражений, которые я удалял с помощью Notepad++.

Удаляю следующие тэги со стилями внутри (например <div style="xxx">):

(?=<span).*?(?<=>)
(?=<div).*?(?<=>)
(?=<a).*?(?<=>)
(?=<img).*?(?<=>)
(?=<style).*?(?<=>)
(?=<font).*?(?<=>)
(?=<em).*?(?<=>)
(?=<wbr).*?(?<=>)
(?=<u).*?(?<=>)

Заменяю тэги со стилями, на тэги без стилей (например <p style="xxx"> на <p>):

(?=<p).*?(?<=>) НА <p>
(?=<strong).*?(?<=>) НА <strong>
(?=<br).*?(?<=>) НА <br>
(?=<b).*?(?<=>) НА <b>
(?=<table).*?(?<=>) НА <table>
(?=<td).*?(?<=>) НА <td>
(?=<th).*?(?<=>) НА <th>
(?=<li).*?(?<=>) НА <li>
(?=<tr).*?(?<=>) НА <tr>
(?=<tbody).*?(?<=>) НА <tbody>
(?=<h3).*?(?<=>) НА <h3>
(?=<ul).*?(?<=>) НА <ul>

Удаляю закрывающие тэги (не выражения, просто текст):

</span>
</div>
</em>
</font>
</style>
</a>
</u>

ЕЩЕ до замены по регулярным выражениям, заменяю следующий текст на символы в таблице (без чего тэги не отображаются):

" на "
> на >
< на <

Автор - homer
Дата добавления - 18.08.2018 в 01:08
alex77755 Дата: Суббота, 18.08.2018, 05:57 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Цитата
Имеется прайс лист

не понятно: приложен прайс лист или что надо получить?
Обычно для решения вопроса прилагают файл источник (оригинал) и файл что надо получить.
И желательно с описанием в каждой строке что на что менялось
А потом можно сделать список замен на листе (и этот список можно будет редактировать). И вот тогда уже можно говорить о макросе. А так лично мне объяснения не понятны.

так же понятны эти замены
" на "
> на >
< на <
возможно сайт внёс свои поправки


Могу помочь в VB6, VBA
Alex77755@mail.ru


Сообщение отредактировал alex77755 - Суббота, 18.08.2018, 06:00
 
Ответить
Сообщение
Цитата
Имеется прайс лист

не понятно: приложен прайс лист или что надо получить?
Обычно для решения вопроса прилагают файл источник (оригинал) и файл что надо получить.
И желательно с описанием в каждой строке что на что менялось
А потом можно сделать список замен на листе (и этот список можно будет редактировать). И вот тогда уже можно говорить о макросе. А так лично мне объяснения не понятны.

так же понятны эти замены
" на "
> на >
< на <
возможно сайт внёс свои поправки

Автор - alex77755
Дата добавления - 18.08.2018 в 05:57
homer Дата: Суббота, 18.08.2018, 10:48 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Прилагаю файл с тремя листами: 1 - что было, 2 - как надо, 3 - что менял чтобы получить 2.
К сообщению приложен файл: 0886531.xlsx (15.9 Kb)


Сообщение отредактировал homer - Суббота, 18.08.2018, 10:50
 
Ответить
СообщениеПрилагаю файл с тремя листами: 1 - что было, 2 - как надо, 3 - что менял чтобы получить 2.

Автор - homer
Дата добавления - 18.08.2018 в 10:48
krosav4ig Дата: Воскресенье, 19.08.2018, 00:27 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 2346
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Regex Pattern
[vba]
Код
(?:<\/?(?:span|div|a|img|style|font|em|wbr|u).*?>(?:\s*\n\s*)*)|(?:(?:(<)([pb]r*|strong|t[abdhr]{1,2}(?:le|ody)*|u*li*|h[0-9]*)\s.*?(?=\/*>))|(\S+))(?=[\s\S]*:(?:\1|\3)=(:|.*?):)|(?:(\n)\s*)+
[/vba]
в конец текста добавляем строку[vba]
Код
:"=":<=<:>=>: =:"=":
[/vba]
Regex Replace на [vba]
Код
$4$2$5
[/vba] и удаляем добавленную ранее строку

тут можно поигаццо

собственно, макрос[vba]
Код
Sub dd()
    Const dic$ = ":"="":<=<:>=>: =:"="":"
    Const pattern$ = "(?:<\/?(?:span|div|a|img|style|font|em|wbr|u)" & _
        ".*?>(?:\s*\n\s*)*)|(?:(?:(<)([pb]r*|strong|t[abdhr]{1,2}" & _
        "(?:le|ody)*|u*li*|h[0-9]*)\s.*?(?=\/*>))|(\S+))(?=[\s\S]*:" & _
        "(?:\1|\3)=(:|.*?):)|(?:(\n)\s*)+"
    Dim arr() As Variant,i&
    With [Было!A1].CurrentRegion.Columns(3)
        If .Cells.Count < 2 Then Exit Sub
        arr = .Value
        For i = LBound(arr) + 1 To UBound(arr)
            arr(i, 1) = arr(i, 1) & dic
            With CreateObject("vbscript.regexp")
                .Global = True: .MultiLine = True
                .Pattern = pattern
                If .test(arr(i, 1)) Then
                    arr(i, 1) = Replace(.Replace(arr(i, 1), "$4$2$5"), dic, "")
                End If
            End With
        Next
        .Value = arr
    End With
End Sub
[/vba]
[p.s.]Pattern и строка-"словарь" искаверканы сайтом, правильные в файле
К сообщению приложен файл: 0886531.xlsm (26.5 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Воскресенье, 19.08.2018, 00:59
 
Ответить
СообщениеRegex Pattern
[vba]
Код
(?:<\/?(?:span|div|a|img|style|font|em|wbr|u).*?>(?:\s*\n\s*)*)|(?:(?:(<)([pb]r*|strong|t[abdhr]{1,2}(?:le|ody)*|u*li*|h[0-9]*)\s.*?(?=\/*>))|(\S+))(?=[\s\S]*:(?:\1|\3)=(:|.*?):)|(?:(\n)\s*)+
[/vba]
в конец текста добавляем строку[vba]
Код
:"=":<=<:>=>: =:"=":
[/vba]
Regex Replace на [vba]
Код
$4$2$5
[/vba] и удаляем добавленную ранее строку

тут можно поигаццо

собственно, макрос[vba]
Код
Sub dd()
    Const dic$ = ":"="":<=<:>=>: =:"="":"
    Const pattern$ = "(?:<\/?(?:span|div|a|img|style|font|em|wbr|u)" & _
        ".*?>(?:\s*\n\s*)*)|(?:(?:(<)([pb]r*|strong|t[abdhr]{1,2}" & _
        "(?:le|ody)*|u*li*|h[0-9]*)\s.*?(?=\/*>))|(\S+))(?=[\s\S]*:" & _
        "(?:\1|\3)=(:|.*?):)|(?:(\n)\s*)+"
    Dim arr() As Variant,i&
    With [Было!A1].CurrentRegion.Columns(3)
        If .Cells.Count < 2 Then Exit Sub
        arr = .Value
        For i = LBound(arr) + 1 To UBound(arr)
            arr(i, 1) = arr(i, 1) & dic
            With CreateObject("vbscript.regexp")
                .Global = True: .MultiLine = True
                .Pattern = pattern
                If .test(arr(i, 1)) Then
                    arr(i, 1) = Replace(.Replace(arr(i, 1), "$4$2$5"), dic, "")
                End If
            End With
        Next
        .Value = arr
    End With
End Sub
[/vba]
[p.s.]Pattern и строка-"словарь" искаверканы сайтом, правильные в файле

Автор - krosav4ig
Дата добавления - 19.08.2018 в 00:27
homer Дата: Воскресенье, 19.08.2018, 01:27 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Огромное спасибо. Макрос обработал огромную таблицу по нажатию кнопки!
Скиньте Ваш WMR кошелек в личку, отблагодарю.
 
Ответить
СообщениеОгромное спасибо. Макрос обработал огромную таблицу по нажатию кнопки!
Скиньте Ваш WMR кошелек в личку, отблагодарю.

Автор - homer
Дата добавления - 19.08.2018 в 01:27
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Замена по списку регулярных выражений (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!