Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2009, 16:14   #1
Scolopendra
Пользователь
 
Аватар для Scolopendra
 
Регистрация: 04.10.2008
Сообщений: 16
По умолчанию Ошибки в прямой речи

Здравствуйте, уважаемые форумчане!

У меня имеется художественный текст (OCR) со множеством прямой речи. Перед распечаткой стараюсь довести его до нормального состояния. Проблема — есть ошибки типа:

- Я сделаю. - Сказал он.

Надо:

- Я сделаю, - сказал он.

Вариант проверки:
Ищем абзацы с ошибкой

(^0013^=^s[!^0013^=]@)([.\!\?^0133])(^s^=^0032)([A-ZА-ЯЁё])
Визуально проверяю, есть ли ошибка. Если есть:

• стрелка вправо (снимаем выделение), Shift+стрелка влево — выделяем искомую букву, Shift+F3 заменяем строчную прописной;
Если после прямой речи должна быть запятая, продолжаем:
• делаем 4 шага влево (чтобы добраться до точки), Backspase (удаляем символ слева — точку), вставляем запятую.

Окно поиска можно убрать и продолжать поиск с помощью Ctrl+PgDn

Записать последовательность действий я могу, но
Вопрос, как можно сделать подтверждение действия №1?
Как сделать подтверждение действия №2?

Возможно просто разбить на два макроса.
Или вырезать в буфер знак препинания, проверить программно, и если это точка (не !.. или ?.. хотя это можно позже поправить), заменить на запятую. Затем вставить обратно.

Ну или просто дайте хороший совет, как решить (Может быть можно, всё-таки, менять регистр через «Поиск и замену»? :-)

К сожалению, не могу вставить картинку с образцом
Scolopendra вне форума Ответить с цитированием
Старый 06.12.2009, 22:11   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
К сожалению, не могу вставить картинку с образцом
Картинки имеет смысл выкладывать на форумах по Photoshop-у...

Прикрепите к сообщению файл Word (предварительно упаковав его в архив, если файл велик по размеру) - так Вы дождетесь помощи гораздо быстрее.
EducatedFool вне форума Ответить с цитированием
Старый 06.12.2009, 22:30   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Почему такое сложное выражение для поиска? У меня получается найти таким выражением:
(- *)([\!\?.])( - [A-ZА-ЯЁ])
Что стоит вначале прямой речи? Согласно правил вёрстки, там должно стоять длинное тире (—) и неразрывный пробел.
Что стоит после знака препинания, отделяющего прямую речь? Там должен стоять неразрывный пробел и длинное тире
Поиском и заменой можно заменить знак препинания на запятую, но регистр изменить не получится. Придётся писать макрос. Он будет несложный.
Но для начала нужно определиться с поисковым выражением.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 06.12.2009, 23:18   #4
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Это?

Цитата:
Сообщение от Scolopendra Посмотреть сообщение
- Я сделаю. - Сказал он.

Надо:

- Я сделаю, - сказал он.

...Shift+стрелка влево — выделяем искомую букву, Shift+F3 заменяем строчную прописной;
Если после прямой речи должна быть запятая, продолжаем
Код:
Sub GoSo()
Static da As Long: If da = 0 Then MsgBox "Правка первой буквы слов автора при прямой речи."
Dim strProblemSector As String, bytPSLen As Byte
' GoSo Макрос
' Предлагает оставить/изменить регистр первой буквы слов автора.'
Selection.HomeKey wdStory

Nastroyka

    Do While Selection.Find.Execute
    da = MsgBox("Изменить?", vbDefaultButton2 + vbMsgBoxRight + vbInformation + vbYesNo)
        If da = vbYes Then
            strProblemSector = Selection.Text
            bytPSLen = Len(strProblemSector)
            If bytPSLen < 2 Or bytPSLen > 100 Then MsgBox "Найденное нестандартно."
            Selection.Collapse wdCollapseEnd
            
            SendKeys "+{left}", True             '<Shift>+<Left>'
            Selection.Range.Case = wdToggleCase
            Selection.Collapse
            
            Nastroyka

'            SendKeys "^{pgdn}", True             '<Ctrl>+<PageDown>'
            da = 0
            End If
    Loop
    
    With Selection.Find
    .Text = ""
    .Replacement.Text = ""
    .MatchWildcards = False
    End With 'умыли руки'
End Sub
Код:
Sub Nastroyka()
    With Selection.Find
    .Text = "[^45^0150^0151^0132^0147^0171]@[!^13^11]@ [^45^0150^0151]@ {1;}[A-zА-я]"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .MatchWildcards = True
    End With 'настроили инструмент'
End Sub
Изображения
Тип файла: jpg YesItWord.jpg (45.1 Кб, 134 просмотров)
Вложения
Тип файла: rar RusConvers.rar (17.7 Кб, 14 просмотров)

Последний раз редактировалось Sasha_Smirnov; 07.12.2009 в 11:56. Причина: тестдрайв.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 07.12.2009, 20:46   #5
Scolopendra
Пользователь
 
Аватар для Scolopendra
 
Регистрация: 04.10.2008
Сообщений: 16
По умолчанию

Всё-таки картинка объяснила бы (я так думаю), что я хочу (для EducatedFool) и почему такая сложная формула (для viter.alex) — она ищет до второго среднего тире внутри абзаца, в общем, то что мне надо в данном конкретном тексте. Но вопрос был немного в другом: нужен код для возможности выбора.
За него отдельное спасибо Sasha_Smirnov и за найденную ошибку. Пойду разбираться с кодом, потому что элементарные для вас вещи для меня — тёмный лес.
Кстати, не в обиду, согласно требует дательного падежа.
Изображения
Тип файла: jpg MacrosMakeUp.jpg (71.8 Кб, 128 просмотров)
Scolopendra вне форума Ответить с цитированием
Старый 07.12.2009, 22:04   #6
Scolopendra
Пользователь
 
Аватар для Scolopendra
 
Регистрация: 04.10.2008
Сообщений: 16
По умолчанию

Для Sasha_Smirnov.
Попробовал ваш макрос. Сработал он только с моим выражением поиска (ну это и понятно, я-то видел свой текст ).
Но сработал наполовину — после подтверждения меняет регистр всего слова, а не его первой буквы. Т.е. «Слово» на «сЛОВО».
И ещё вопрос, можно ли как-то прервать работу макроса, а то до конца текста не отпускает (и крестик диалогового окна [X] — серый)?
Спасибо за помощь.
Scolopendra вне форума Ответить с цитированием
Старый 07.12.2009, 23:02   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Замените цикл Do…Loop на такой:
Код:
  Do While Selection.Find.Execute
    da = MsgBox("Изменить?", vbDefaultButton2 + vbMsgBoxRight + vbInformation + vbYesNoCancel)
    Select Case da
      Case vbYes 'Если в диалоге нажали «Да»
        If Len(Selection.Text) < 2 Or Len(Selection.Text) > 100 Then MsgBox "Найденное нестандартно."
        'Изменяем регистр последнего символа:
        Selection.Characters.Last.Case = wdToggleCase
        'Заменяем точку на запятую
        If Selection.Characters.Last.Previous.Previous.Previous.Previous.Text = "." Then
          Selection.Characters.Last.Previous.Previous.Previous.Previous.Text = ","
        End If
        Nastroyka
        da = 0
      Case vbNo 'Если в диалоге нажали «Нет»
        Nastroyka
        da = 0
      Case vbCancel 'Если в диалоге нажали «Отмена»
        Exit Do
    End Select
  Loop
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 08.12.2009, 01:35   #8
Scolopendra
Пользователь
 
Аватар для Scolopendra
 
Регистрация: 04.10.2008
Сообщений: 16
По умолчанию

Для viter.alex.
Макрос работает как надо. Но теперь выбрасывает каждый раз после нажатия «Да».
И ещё — «для повышения образованности» — поясните, пожалуйста, для чего проверяется Len(Selection.Text) > 100? Это ведь длина выделенного текста?
Scolopendra вне форума Ответить с цитированием
Старый 08.12.2009, 06:19   #9
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

А я не знаю для чего. Это же Sasha_Smirnov придумал
Я понял почему выбрасывает: нужно сжимать выделение после каждого поиска, чтобы можно было искать в оставшемся документе:
Код:
  Do While Selection.Find.Execute
    da = MsgBox("Изменить?", vbDefaultButton2 + vbMsgBoxRight + vbInformation + vbYesNoCancel)
    Select Case da
      Case vbYes 'Если в диалоге нажали «Да»
        If Len(Selection.Text) < 2 Or Len(Selection.Text) > 100 Then MsgBox "Найденное нестандартно."
        'Изменяем регистр последнего символа:
        Selection.Characters.Last.Case = wdToggleCase
        'Заменяем точку на запятую
        If Selection.Characters.Last.Previous.Previous.Previous.Previous.Text = "." Then
          Selection.Characters.Last.Previous.Previous.Previous.Previous.Text = ","
        End If
        Nastroyka
        da = 0
      Case vbNo 'Если в диалоге нажали «Нет»
        Nastroyka
        da = 0
      Case vbCancel 'Если в диалоге нажали «Отмена»
        Exit Do
    End Select
    'Сжимаем выделение
    Selection.Collapse wdCollapseEnd
  Loop
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 08.12.2009, 12:27   #10
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от Scolopendra Посмотреть сообщение
Для viter.alex...
Len(Selection.Text) > 100? Это ведь длина выделенного текста?
Ага! Предполагал защиту от непредсказуемости звёздочки (*). И на всякий случай оставил.
Цитата:
Сообщение от Scolopendra Посмотреть сообщение
И ещё вопрос, можно ли как-то прервать работу макроса...
Добавить кнопку отмены (выхода из программы). Что и сделал viter.alex! Порадовал, однако.
P/s. Тёмный лес Word и для меня. Но есть макрос типа «Правлю всё!», 4 месяца отлаживал!..

Последний раз редактировалось Sasha_Smirnov; 09.12.2009 в 03:03.
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа распознавания русской речи - Комбат denis47 Помощь студентам 10 25.06.2016 22:39
Синтез речи. Создание голосового движка (не русского). Gauss Общие вопросы Delphi 2 21.01.2014 10:12
как определить часть речи в VBA? Izhic Microsoft Office Word 4 11.06.2009 13:53
[Delphi] Выделение частей речи в тексте vince Помощь студентам 8 07.12.2008 23:37
Программа для разпознавания речи Иллидан Софт 3 25.03.2008 20:37