Здравствуйте, уважаемые форумчане, просьба помочь с такой проблемой. В столбце K пишутся сокращения улиц, переулков и т.д., формат всегда "сокращение-точка-пробел", то есть "ул. ", "пер. ", "мкр. ", но есть исключения, как например "снт ", здесь просто пробел. Проблема в том, что операторы ставятся различные знаки, цифры, лишние пробелы, либо пробелы вообще отсутствуют после сокращений. А нужно всё подогнать под правильный формат. Интересует макрос, который можно связать с кнопкой, чтобы после их работы всё исправить, а не мешать автоматическими исправлениями во время набора данных работником.
Здравствуйте, уважаемые форумчане, просьба помочь с такой проблемой. В столбце K пишутся сокращения улиц, переулков и т.д., формат всегда "сокращение-точка-пробел", то есть "ул. ", "пер. ", "мкр. ", но есть исключения, как например "снт ", здесь просто пробел. Проблема в том, что операторы ставятся различные знаки, цифры, лишние пробелы, либо пробелы вообще отсутствуют после сокращений. А нужно всё подогнать под правильный формат. Интересует макрос, который можно связать с кнопкой, чтобы после их работы всё исправить, а не мешать автоматическими исправлениями во время набора данных работником.benza89
Public Function Печатн(str1 As String) Dim str, s, s1, s2 As String Dim i, j, k, n As Long For i = 1 To Len(str1) s = Mid(str1, i, 1) If LCase(s) Like "[a-zа-я0-9,.!?/\|*'# )(+-_&%;:^$]" Or LCase(s) Like Chr(34) Then str = str & s End If Next i Печатн = str
End Function
[/vba]
akademik90, Макрос [vba]
Код
Public Function Печатн(str1 As String) Dim str, s, s1, s2 As String Dim i, j, k, n As Long For i = 1 To Len(str1) s = Mid(str1, i, 1) If LCase(s) Like "[a-zа-я0-9,.!?/\|*'# )(+-_&%;:^$]" Or LCase(s) Like Chr(34) Then str = str & s End If Next i Печатн = str
akademik90, По поводу пользования тегами - вставили код, выделили его, нажали на кнопку #, а не так, как Вы - нажали #, вставили код, нажали # Или еще можно нажать #, встать курсором посередине [...][...]вот сюда[/...][/...] и вставить код. В Правилах есть ссылка на описание методов использования Поправил в Вашем посте.
По поводу макроса как Вы думаете, какой тип у переменных str, s, s1 и i, j, k? Подсказка - у всех шести переменных тип одинаковый. Почитайте про объявление переменных в VBA
akademik90, По поводу пользования тегами - вставили код, выделили его, нажали на кнопку #, а не так, как Вы - нажали #, вставили код, нажали # Или еще можно нажать #, встать курсором посередине [...][...]вот сюда[/...][/...] и вставить код. В Правилах есть ссылка на описание методов использования Поправил в Вашем посте.
По поводу макроса как Вы думаете, какой тип у переменных str, s, s1 и i, j, k? Подсказка - у всех шести переменных тип одинаковый. Почитайте про объявление переменных в VBA_Boroda_
akademik90, В данном случае разбор лексограммы более сложен. Нужно учитывать не только убрать лишнее , но и вставить недостающее, например элементарная ошибка снтГвоздь оператора нужно преобразовать по алгоритму, между снт и заглавной буквой Г должен встать пробел. benza89, Кнопку "все сделать хорошо" можно, но требуется продуманный алгоритм и тест кейсы для его проверки. Скорее всего такие алгоритмы есть готовые. Я не знаю что у вас там за ситема, но справочники и предлагаемый вариант при вводе для того и придуманы, чтоб потом не исправлять.
akademik90, В данном случае разбор лексограммы более сложен. Нужно учитывать не только убрать лишнее , но и вставить недостающее, например элементарная ошибка снтГвоздь оператора нужно преобразовать по алгоритму, между снт и заглавной буквой Г должен встать пробел. benza89, Кнопку "все сделать хорошо" можно, но требуется продуманный алгоритм и тест кейсы для его проверки. Скорее всего такие алгоритмы есть готовые. Я не знаю что у вас там за ситема, но справочники и предлагаемый вариант при вводе для того и придуманы, чтоб потом не исправлять.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Вторник, 17.01.2017, 10:02
Исправление ошибок ручного ввода текста вообще задача очень не простая и полностью так толком и не решённая. Иначе не было бы столько ошибок в результатах распознавания отсканированных текстов, да и Ворд сам бы не только подчёркивал, но и исправлял ВСЕ опечатки, а не только те, которые ему даны в списках Автозамены. А умные приложения ведь умеют частичный лексический анализ производить... Решение же на VBA обязательно будет убогим и исправляющим далеко не всё, а лишь малую часть. А если ещё учесть и распространённую лень операторов, часто не переключающих РУС-ЛАТ при вводе одинаковых ПО НАПИСАНИЮ букв... (сам таким иногда грешу, когда в постах пишу простые формулы, то адреса ячеек бывает тоже русскими ввожу…) Даже несколько макросов писал для замены или выделения цветом РУС-ЛАТ.
Исправление ошибок ручного ввода текста вообще задача очень не простая и полностью так толком и не решённая. Иначе не было бы столько ошибок в результатах распознавания отсканированных текстов, да и Ворд сам бы не только подчёркивал, но и исправлял ВСЕ опечатки, а не только те, которые ему даны в списках Автозамены. А умные приложения ведь умеют частичный лексический анализ производить... Решение же на VBA обязательно будет убогим и исправляющим далеко не всё, а лишь малую часть. А если ещё учесть и распространённую лень операторов, часто не переключающих РУС-ЛАТ при вводе одинаковых ПО НАПИСАНИЮ букв... (сам таким иногда грешу, когда в постах пишу простые формулы, то адреса ячеек бывает тоже русскими ввожу…) Даже несколько макросов писал для замены или выделения цветом РУС-ЛАТ.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 17.01.2017, 22:39
Спасибо за ответы, но не совсем то, что нужно, формула не подойдет, как и такой макрос, потому что для них нужен отдельный столбец. Можно тогда сделать проще, чтобы после точки ставил пробел, например, написано "ул.Зеленая", а он исправляет на "ул. Зеленая", то есть ставит пробел, после сокращение-точка.
Спасибо за ответы, но не совсем то, что нужно, формула не подойдет, как и такой макрос, потому что для них нужен отдельный столбец. Можно тогда сделать проще, чтобы после точки ставил пробел, например, написано "ул.Зеленая", а он исправляет на "ул. Зеленая", то есть ставит пробел, после сокращение-точка.benza89
Вам не проще тогда CTRL+h заменить "ул." на "ул. " , а после еще раз два пробела " " на один " " . Формула то сделает в другом столбце, а макрос может и в том же, но вот результат работы последнего непредсказуем. Alex_ST, и я это пытались пояснить.
benza89,
Вам не проще тогда CTRL+h заменить "ул." на "ул. " , а после еще раз два пробела " " на один " " . Формула то сделает в другом столбце, а макрос может и в том же, но вот результат работы последнего непредсказуем. Alex_ST, и я это пытались пояснить.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
А вдруг так подойдет. Правда, сколько времени будет обрабатываться большой массив, не знаю. Но все же, не вручную. [vba]
Код
Sub www() Dim t&, x$, s$, i&, j& For t = 2 To Range("N" & Rows.Count).End(xlUp).Row x = Cells(t, "N") For i = 1 To 10 If Mid(x, i, 1) Like "*[а-я]*" Then Else Exit For Next s = Mid(x, 1, i - 1) For j = 1 To 10 If Mid(x, j, 1) Like "*[А-Я]*" Then Exit For Next Cells(t, "N") = s & ". " & Mid(x, j, 99) Next End Sub
[/vba]
А вдруг так подойдет. Правда, сколько времени будет обрабатываться большой массив, не знаю. Но все же, не вручную. [vba]
Код
Sub www() Dim t&, x$, s$, i&, j& For t = 2 To Range("N" & Rows.Count).End(xlUp).Row x = Cells(t, "N") For i = 1 To 10 If Mid(x, i, 1) Like "*[а-я]*" Then Else Exit For Next s = Mid(x, 1, i - 1) For j = 1 To 10 If Mid(x, j, 1) Like "*[А-Я]*" Then Exit For Next Cells(t, "N") = s & ". " & Mid(x, j, 99) Next End Sub
Ребята, ну не надо код привязывать к конкретным книгам, листам, диапазонам и заменяемым значениям! Завтра столбец изменится или новое правило замены появится... Опять всё переделывать что ли? Не знаю, будет ли у меня свободное время, но нужно, имхо, В ОТДЕЛЬНОЙ КНИГЕ написать процедуру, которая в ВЫДЕЛЕННОМ пользователем диапазоне АКТИВНОЙ КНИГИ (а для предотвращения не верной коррекции лучше в ячейках соседнего свободного столбца) проведёт циклом замену субстрингов, ЗАДАННЫХ ПОЛЬЗОВАТЕЛЕМ, на специальном листе шаблонов (паттернов) замены в этой отдельной книге. При этом замену лучше проводить не по каждой ячейке, а сразу по всему диапазону, применяя к нему целиком метод Replace для каждого из заданных шаблонов (паттернов) замены. Ещё лучше, конечно, регулярными выражениями - RegExp'ами, но я их не знаю, к сожалению... Попробую сейчас выкроить время и набросать... Правда, к сожалению, с работы выложить файл с макросами не смогу (собаки-сисадмины!), поэтому если сделаю, то отдельно файл без процедур и текст модуля.
Ребята, ну не надо код привязывать к конкретным книгам, листам, диапазонам и заменяемым значениям! Завтра столбец изменится или новое правило замены появится... Опять всё переделывать что ли? Не знаю, будет ли у меня свободное время, но нужно, имхо, В ОТДЕЛЬНОЙ КНИГЕ написать процедуру, которая в ВЫДЕЛЕННОМ пользователем диапазоне АКТИВНОЙ КНИГИ (а для предотвращения не верной коррекции лучше в ячейках соседнего свободного столбца) проведёт циклом замену субстрингов, ЗАДАННЫХ ПОЛЬЗОВАТЕЛЕМ, на специальном листе шаблонов (паттернов) замены в этой отдельной книге. При этом замену лучше проводить не по каждой ячейке, а сразу по всему диапазону, применяя к нему целиком метод Replace для каждого из заданных шаблонов (паттернов) замены. Ещё лучше, конечно, регулярными выражениями - RegExp'ами, но я их не знаю, к сожалению... Попробую сейчас выкроить время и набросать... Правда, к сожалению, с работы выложить файл с макросами не смогу (собаки-сисадмины!), поэтому если сделаю, то отдельно файл без процедур и текст модуля.Alex_ST
[offtop]Если бы всё было так просто... Trend Micro Internet Sequrity Scan, собака, скачивать архивы даёт, но умудряется при этом выдирать из них модули VBA, после чего они, естественно, перестают открываться вообще. В xls-файлах просто оказываются пустыми модули, а xlsm просто не открываются... Хотя... На счёт пароля может быть имеет смысл попробовать... Но что-то я сомневаюсь :([/offtop]
[offtop]Если бы всё было так просто... Trend Micro Internet Sequrity Scan, собака, скачивать архивы даёт, но умудряется при этом выдирать из них модули VBA, после чего они, естественно, перестают открываться вообще. В xls-файлах просто оказываются пустыми модули, а xlsm просто не открываются... Хотя... На счёт пароля может быть имеет смысл попробовать... Но что-то я сомневаюсь :([/offtop]Alex_ST
А Вы проверьте, это я как та собака со стажем говорю. Если просто не срубит целиком, так как не смог распознать содержание, то пройдет. В свое время можно было архив в архив запихнуть, но сейчас это не помеха.
А Вы проверьте, это я как та собака со стажем говорю. Если просто не срубит целиком, так как не смог распознать содержание, то пройдет. В свое время можно было архив в архив запихнуть, но сейчас это не помеха.bmv98rus
Замечательный Временно просто медведь , процентов на 20.