![]() |
Модераторы: mihanik |
![]() ![]() ![]() |
|
Guest45 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Собственно, задача:
Имеется текст в коде ASCII, в котором перенесенные слова слиты, так что значок переноса оказывается посреди слова. А поскольку это .txt и форматирующей структуры нет, то такие переносы ничем не отличаются от минусов и тире. Ручная правка исключается - файл довольно велик, Ворд находит несколько тыс. сочетаний буква-дефис-буква. Непосредственно удалить их нельзя, так как пострадают нормальные слова, пишущиеся через дефис, их в русском языке довольно много. Необходимо написать макрос для Ворда (пригодный начиная от Офиса-2000). Идея состоит в следующем: Берем слово в строковую переменную, исключаем дефис и результат сличаем со словарем Ворда. Если орфоконтроль не находит ошибки, вносим исправленное слово в текст. Если слово без дефиса опознается как ошибочное, выбрасываем результат, оставляем в тексте как есть. В чем прошу помощь. Я неплохо знаю бейсики, в т.ч. VB6, но VBA включает некоторые специфические команды, по которым и прошу подсказки. Итак: 1) Как взять в строковую переменную очередное слово из текста? 2) Как проверить содержимое строковой переменной при помощи системы орфографии Ворда? (Достаточно получить булевское значение: верно слово, или нет.) 3) Как заменить слово в тексте на содержимое строковой переменной? Прошу примеры написания этих команд в теле макроса. ![]() Со строковыми переменными работать умею, в этом проблем не ожидается. Прочитать и записать файл могу тоже, но хотелось бы работать с текстом в окне Ворда, это нагляднее. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Guest45 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Такая конструкция цикла мной еще не использовалась.
Сделал проверочный .txt размером в два абзаца, открыл Вордом-2000. Сделал макрос, скопипастил в него ваш пример как есть. Запустил. Макрос быстро провернулся, никаких изменений в тексте не произвел. Тогда заремил строку с орфографической проверкой и последующий IF по Result, оставил в цикле только второй (вложенный) IF. Предположив, что теперь все слова проверочного текста должны быть заменены словом Replaced . Запустил. Никаких изменений текста. Заремил и второй IF, оставил в цикле только строчку oneWord.Text = "Replaced " Запустил. Макрос завис. Вот это непонятно почему - ведь область не изменялась; по достижении конца текста цикл должен был остановиться независимо - изменялись ли слова, или нет. Растолкуйте результаты, плиз. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
![]() ![]() Ну чё на кофейной гуще-то гадать? Пройдите в режиме трассировки и посмотрите, как изменяются значения переменных. Заодно не поленитесь в текст добавить пару заведомо несуществующих слов - для контраста... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Guest45 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Разумеется, в тексте преднамеренные ошибки есть.
Чтобы на первых порах отстроиться от вопросов к грамматике. Отладка "поблочно". Надо же начинать с простейшего. Но и оно не получилось пока. А oneWord.Text это что? - указатель на слово в тексте? дополнено: Итак, проверку грамматики пока заремил, оставил только вложенный IF. Поставил точку останова на If Trim(oneWord.Text) <> "Replaced" Then Посмотрел, что oneWord.Text в ней имеет значение квадратик в кавычках. (Кодов меньше 20h в тексте нет, кроме 0Dh, 0Ah. Проверено в HEX-просмотре FAR-ом.) После продолжения макрос снова на эту точку не попадает, то есть цикл после одного прохода завершается. Это сообщение отредактировал(а) Guest45 - 16.6.2015, 19:54 |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
В тексте нет преднамеренных ошибок. Более того - поскольку я не юзаю эти функции ежедневно, я написАл кейс и проверил, что он работает правильно. Приведённый код - копипаст РАБОЧИЙ ПРОВЕРЕННЫЙ. Среда - Ворд 2007. И если у тебя он сбоит, я скорее поверю в избыточную кривизну твоих рук, уж извини...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Guest45 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
преднамеренно ошибки были мной вставлены в проверочный текст, который скармливался макросу
![]() Пример, сорь, пока не работает почему-то. Про кривизну рук - допускаю конечно, но Ctrl-C, Ctrl-V, тут как бы кривить-то особено и не в чем... Ворд работает, не глючит, претензий не было. Система - XP SP2, rus, но вроде на язык высокого уровня влиять не должна? Помогайте кто может. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Guest45, давай так. Выкладывай файл до запуска макроса и после. Я у себя обработаю тот же файл. Сравним. Укажи сразу, что не нравится - если воспроизведётся, постараюсь понять, где собака порылась.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Guest45 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Проверочный текст в смысле? - без проблем, прицепляю ниже. Но он один и тот же, ни одного изменения макросом не вносится.
Я подозреваю, что макрос по нему вообще не пробегает - уже писал выше, что цикл почему-то заканчивается после первого же прохода. Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Воспроизводим по шагам.
1) Запустить Word. 2) Открыть - text.txt 3) Разработчик - Макросы 4) Имя = MyReplace 5) Создать 6) Вставляем приведённый выше код 7) Закрываем окно VBA 8) Разработчик - Макросы 9) MyReplace - Выполнить После выполнения этих операций я вижу в тексте слово "Replaced" в количестве 6 штук. Добавлено через 2 минуты и 42 секунды Как вариант, вместо шагов 3-5: 3) Открыть редактор VBA 4) Вставить - модуль 5) Вставить вышеприведённый код, обрамив его в Private Sub MyReplace() ... End Sub -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Guest45 |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Отчет о проделанной работе:
1. Открываю проверочный текст Вордом. (В окне Ворда - проверочный текст.) 2. Меню Сервис / Макрос / Макросы 3. Копипаст имени MyReplace 4. Создать. 5. Копипаст кода Результат:
6. Закрыл окно VBA. 7. Сервис / Макрос / Макросы 8. Выбор MyReplace 9. Выполнить. Меню закрывается, текст остается прежним, больше ничего не происходит. Ни одного изменения не появилось. Вариант 2 Сервис / Макрос / Редактор Visual Basic Insert / Module открывается чистое окно нового модуля Создаю в нем следующий код:
Запускаю из меню VBA: кнопка Run В тексте появились замененные слова Replaced. Итак, второй вариант работает, а первый почему-то нет. Поэксериментирую со вторым, о результатах отпишусь. Сенкс! Примечание. Вначале (т.е. вчера) и макрос запускал кнопкой Run не закрывая VBA, но макрос и таким запуском не работал. |
||||
|
|||||
Guest45 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Кажется я выяснил, в чем отличие.
Модуль создается в разделе Project, а макрос - в разделе Normal (по умолчанию "из Активных шаблонов") Когда переключил на создание макроса из "Документ1", тогда он создался в разделе Project и заработал. Хотя, записанные нажатия клавиш и т.п., создаются тоже в разделе Normal, но при этом работают. Подозреваю, что не будет работать чтение - видимо тогда макрос вместо текста из окна пытается читать файл Normal.dot . Спасибо за помощь! Остальное, я надеюсь, самостоятельно докручу. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Теперь понятен источник твоих проблем. При создании кода в normal.dot итератор ThisDocument.Words перебирал, как это не странно, почему-то слова именно из Normal.dot. И кто мешал это увидеть сразу, при трассировке? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Guest45 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 24.5.2009 Репутация: нет Всего: нет |
Не показывалось это, или я не знал, где посмотреть. Пришлось догадкой доходить)))))
Версия "альфа" макроса для удаления слившихся переносов будет выглядеть вот так:
Полностью еще не обкатана, возможны какие-нибудь глюки, но пока у меня сработало нормально. Гран мерси за оказанную помощь! Это сообщение отредактировал(а) Guest45 - 18.6.2015, 22:45 |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Для скалярных переменных и скалярных свойств - достаточно навести курсор мыша на переменную и секунду подождать. В редакторе VBA в меню View есть Locals Window. Там ты можешь смотреть содержимое любых видимых в текущем контексте переменных. Удобно для объектных - можно просмотреть любые свойства (вернее, их значения) объекта. А ещё там есть Watch Window. Там можно смотреть значения не только для переменных и свойств, но и для любых выражений. НУ и тупой вывод значений (а также выполнение любых однострочных выражений - в т.ч. и для изменения значений) в Immediate Window тоже никто не отменяет. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Программирование, связанное с MS Office" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще!
|
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |