У меня есть адреса (например), которые нужно преобразовать в Из г. Иркутск, Радужный мкр., д. 44 -->г. Иркутск, мкр. Радужный, д. 44 Из г. Иркутск, Байкальская ул., д. 44 -->г. Иркутск, ул. Байкальская, д. 44 Из г. Иркутск, ул. Депутатская, д. 44 -->г. Иркутск, ул. Депутатская, д. 44
У адреса всегда разделитель запятая. Всегда "город, улица, дом"
В целом, как мне видится ход исполнения макроса: если в тексте НЕ находит, что-нибудь из этого ул., д. мкр., д. кв-л., д. б-р., д. проезд., д. пр-кт., д. пер., д. то результат равен тексту Если находит, то перенос из "город, улицаXXX, дом" в "город,XXX улица, дом", причем ХХХ могу быть в виде: ул. мкр. кв-л. б-р. проезд. пр-кт. пер.
Два пожелания 1 - все исходники залить в сам код. 2 - код будет работать только с одним адресом то есть в ячейке E7 оригинал адреса в G7 результат работы кода
Даже примерно не представляю как это делать...
У меня есть адреса (например), которые нужно преобразовать в Из г. Иркутск, Радужный мкр., д. 44 -->г. Иркутск, мкр. Радужный, д. 44 Из г. Иркутск, Байкальская ул., д. 44 -->г. Иркутск, ул. Байкальская, д. 44 Из г. Иркутск, ул. Депутатская, д. 44 -->г. Иркутск, ул. Депутатская, д. 44
У адреса всегда разделитель запятая. Всегда "город, улица, дом"
В целом, как мне видится ход исполнения макроса: если в тексте НЕ находит, что-нибудь из этого ул., д. мкр., д. кв-л., д. б-р., д. проезд., д. пр-кт., д. пер., д. то результат равен тексту Если находит, то перенос из "город, улицаXXX, дом" в "город,XXX улица, дом", причем ХХХ могу быть в виде: ул. мкр. кв-л. б-р. проезд. пр-кт. пер.
Два пожелания 1 - все исходники залить в сам код. 2 - код будет работать только с одним адресом то есть в ячейке E7 оригинал адреса в G7 результат работы кода
Попробуйте такой вариант, но надо допиливать и тестировать может быть. [vba]
Код
Function ПерестановкаБукв(Str As String) Dim n&, k& Dim m Dim i% Dim Grad$, Bulvar$, Dom$ n = InStr(1, Str, "г.") k = InStr(n + 2, Str, ",") Grad = Mid(Str, n, k - n) & ", " m = Array("ул.", "мкр.", "кв-л.", "б-р.", "проезд", "пр-кт", "пер.") For i = LBound(m) To UBound(m) If InStr(k, Str, m(i)) Then n = k + 1 k = InStr(n, Str, m(i)) - 1 If n = k Then k = InStr(n, Str, ",") Bulvar = Mid(Str, n + 1, k - n - 1) & ", " Else Bulvar = m(i) & Mid(Str, n, k - n) & ", " End If
Exit For End If Next i n = InStr(k, Str, "д.") Dom = Trim(Mid(Str, n, Len(Str))) ПерестановкаБукв = Grad & Bulvar & Dom End Function
[/vba]
Попробуйте такой вариант, но надо допиливать и тестировать может быть. [vba]
Код
Function ПерестановкаБукв(Str As String) Dim n&, k& Dim m Dim i% Dim Grad$, Bulvar$, Dom$ n = InStr(1, Str, "г.") k = InStr(n + 2, Str, ",") Grad = Mid(Str, n, k - n) & ", " m = Array("ул.", "мкр.", "кв-л.", "б-р.", "проезд", "пр-кт", "пер.") For i = LBound(m) To UBound(m) If InStr(k, Str, m(i)) Then n = k + 1 k = InStr(n, Str, m(i)) - 1 If n = k Then k = InStr(n, Str, ",") Bulvar = Mid(Str, n + 1, k - n - 1) & ", " Else Bulvar = m(i) & Mid(Str, n, k - n) & ", " End If
Exit For End If Next i n = InStr(k, Str, "д.") Dom = Trim(Mid(Str, n, Len(Str))) ПерестановкаБукв = Grad & Bulvar & Dom End Function
Добрый день. Вариант пользовательской функцией [vba]
Код
Function AVI(t As String) As String AVI = t With CreateObject("VBScript.RegExp") .Pattern = "( )[^ ]+( ул\.| мкр\.| кв-л\.| б-р\.| проезд\.| пр-кт\.| пер\.), д" If .test(t) Then AVI = .Replace(t, Replace(Replace(.Execute(t)(0), .Execute(t)(0).submatches(1), ""), .Execute(t)(0).submatches(0), .Execute(t)(0).submatches(1) & " ", Count:=1)) End With End Function
[/vba]
Добрый день. Вариант пользовательской функцией [vba]
Код
Function AVI(t As String) As String AVI = t With CreateObject("VBScript.RegExp") .Pattern = "( )[^ ]+( ул\.| мкр\.| кв-л\.| б-р\.| проезд\.| пр-кт\.| пер\.), д" If .test(t) Then AVI = .Replace(t, Replace(Replace(.Execute(t)(0), .Execute(t)(0).submatches(1), ""), .Execute(t)(0).submatches(0), .Execute(t)(0).submatches(1) & " ", Count:=1)) End With End Function
CAHO, sboy, Супер, в примере работает! Но подскажите, пожалуйста, как функции переделать в sub? У меня это код нужно добавить в юзерформу с последующей выгрузкой в нужное место в документе. То есть код берет исходник из ячейки обрабатывает и заливаете в другую ячейку.
CAHO, sboy, Супер, в примере работает! Но подскажите, пожалуйста, как функции переделать в sub? У меня это код нужно добавить в юзерформу с последующей выгрузкой в нужное место в документе. То есть код берет исходник из ячейки обрабатывает и заливаете в другую ячейку.AVI
В sub не обязательно переделывать. Просто в коде обратитесь к этой функции (передав туда переменную t из ячейки) и получите результат, потом выгружайте куда надо примерно так [vba]
Код
Sub v_forme() '///// исходный_адрес = [a1] исправленный_адрес = AVI(исходный_адрес) [b1] = исправленный_адрес '//// End Sub
[/vba] или сразу без переменных [vba]
Код
Sub v_forme() '///// [b1].Value = AVI([a1].Value) '//// End Sub
[/vba]
В sub не обязательно переделывать. Просто в коде обратитесь к этой функции (передав туда переменную t из ячейки) и получите результат, потом выгружайте куда надо примерно так [vba]
Код
Sub v_forme() '///// исходный_адрес = [a1] исправленный_адрес = AVI(исходный_адрес) [b1] = исправленный_адрес '//// End Sub
[/vba] или сразу без переменных [vba]
Код
Sub v_forme() '///// [b1].Value = AVI([a1].Value) '//// End Sub
Добрый день! Помогите подправить код. Если названия в одно слово, то работает отлично, а если два, то г. Иркутск, Маршала ул. Конева, д. 44, а не г. Иркутск, ул. Маршала Конева, д. 44 Я пошарился в коде, но не понял где это поменять.
Добрый день! Помогите подправить код. Если названия в одно слово, то работает отлично, а если два, то г. Иркутск, Маршала ул. Конева, д. 44, а не г. Иркутск, ул. Маршала Конева, д. 44 Я пошарился в коде, но не понял где это поменять.AVI
Function AVI(t As String) As String AVI = t With CreateObject("VBScript.RegExp") .Pattern = "(, ).+( ул\.| мкр\.| кв-л\.| б-р\.| проезд\.| пр-кт\.| пер\.), д" If .test(t) Then AVI = .Replace(t, Replace(Replace(.Execute(t)(0), .Execute(t)(0).submatches(1), ""), .Execute(t)(0).submatches(0), "," & .Execute(t)(0).submatches(1) & " ", Count:=1)) End With End Function
[/vba]
Поправил [vba]
Код
Function AVI(t As String) As String AVI = t With CreateObject("VBScript.RegExp") .Pattern = "(, ).+( ул\.| мкр\.| кв-л\.| б-р\.| проезд\.| пр-кт\.| пер\.), д" If .test(t) Then AVI = .Replace(t, Replace(Replace(.Execute(t)(0), .Execute(t)(0).submatches(1), ""), .Execute(t)(0).submatches(0), "," & .Execute(t)(0).submatches(1) & " ", Count:=1)) End With End Function