Добрый день, уважаемые форумчане. Прошу вашей помощи с макросом. У меня задача убрать пробел в нумерации домов, т.е. между "д." и самим номером дома не должно остаться пробела. Загвоздка состоит в том, что в адресе может присутствовать деревня, которая сокращенно выглядит также, так вот после не пробел должен остаться. Я составила макрос, который может выбрать только д., за которой идет любая цифра. Но вот споткнулась на замене. Он меняет все, что входит в .pattern. Вопрос: можно ли заменить лишь часть того, что прописано в шаблоне?
Добрый день, уважаемые форумчане. Прошу вашей помощи с макросом. У меня задача убрать пробел в нумерации домов, т.е. между "д." и самим номером дома не должно остаться пробела. Загвоздка состоит в том, что в адресе может присутствовать деревня, которая сокращенно выглядит также, так вот после не пробел должен остаться. Я составила макрос, который может выбрать только д., за которой идет любая цифра. Но вот споткнулась на замене. Он меняет все, что входит в .pattern. Вопрос: можно ли заменить лишь часть того, что прописано в шаблоне?EvaNa
Sub замена_д_вар1() Dim r As Range With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(д\.) (\d)" On Error Resume Next A = Cells(Rows.Count, "N").End(xlUp).Row For Each r In Range("N2:N" & A) If .Test(r.Value) Then r.Next.Value = .Replace(r.Value, "$1$2") End If Next End With End Sub
[/vba]
[vba]
Код
Sub замена_д_вар1() Dim r As Range With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(д\.) (\d)" On Error Resume Next A = Cells(Rows.Count, "N").End(xlUp).Row For Each r In Range("N2:N" & A) If .Test(r.Value) Then r.Next.Value = .Replace(r.Value, "$1$2") End If Next End With End Sub
RAN, Спасибо. Макрос вставляет результаты в соседний столбец. А можно ли получить замену в той же ячейке? Я попробовала убрать next из r.Next.Value, но в таком случае ничего от исходного не меняется. Не могу понять почему.
RAN, Спасибо. Макрос вставляет результаты в соседний столбец. А можно ли получить замену в той же ячейке? Я попробовала убрать next из r.Next.Value, но в таком случае ничего от исходного не меняется. Не могу понять почему.EvaNa
Сообщение отредактировал EvaNa - Четверг, 21.01.2021, 17:41
И я не могу понять, почему. У меня меняется. Но лучше так [vba]
Код
Sub замена_д_вар1() Dim r As Range With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(д\.) +?(\d)" On Error Resume Next A = Cells(Rows.Count, "N").End(xlUp).Row For Each r In Range("N2:N" & A) If .Test(r.Value) Then r.Value = .Replace(r.Value, "$1$2") End If Next End With End Sub
[/vba] Тогда и несколько пробелов возьмет
И я не могу понять, почему. У меня меняется. Но лучше так [vba]
Код
Sub замена_д_вар1() Dim r As Range With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(д\.) +?(\d)" On Error Resume Next A = Cells(Rows.Count, "N").End(xlUp).Row For Each r In Range("N2:N" & A) If .Test(r.Value) Then r.Value = .Replace(r.Value, "$1$2") End If Next End With End Sub
RAN, огромное спасибо за решение! Все отлично работает. Если не затруднит еще маленькую просьбу выполнить, где почитать об этом "$1$2", не понимаю пока как это работает. Заранее благодарю
RAN, огромное спасибо за решение! Все отлично работает. Если не затруднит еще маленькую просьбу выполнить, где почитать об этом "$1$2", не понимаю пока как это работает. Заранее благодарюEvaNa
Тёзка, привет. А там этого нет. По крайней мере я не нашел. Равно как и описания коллекций Matches, SubMatches и их свойств. А то, что "$1" = Matches(0).SubMatches(0), выяснил только изучением кодов с RegExp.
Тёзка, привет. А там этого нет. По крайней мере я не нашел. Равно как и описания коллекций Matches, SubMatches и их свойств. А то, что "$1" = Matches(0).SubMatches(0), выяснил только изучением кодов с RegExp.RAN