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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2013, 17:00   #1
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию Проблема с SendKeys

Нужно запустить из макроса диалог поиска и замены, причем курсор должен оказаться в начале поля замены.
Если вызвать Dialogs(wdDialogEditReplace).Show, то после выполнения замены появляется сообщени об ошибке. Кроме того, я не знаю как перемещать курсор внутри диалогового окна.
Если же вызывать диалог с помощью SendKeys "^h", все отлично, и следующие за ним SendKeys "{TAB}"
SendKeys "{HOME}"
ставят курсор в нужное место, но возникает другая проблема: все это работает только, в том случае, если в момент вызова раскладка клавиатуры английская, если же русская - вместо вызова диалога в документ впечатываются "h" и знак табулятора.
Если принципиального решения не существует, то может кто-нибудь подскажет, как написать скрипт для определения и управления раскладкой клавиатуры.

ЗарСпасБол!
Vadim39 вне форума Ответить с цитированием
Старый 21.05.2013, 17:11   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Vadim39, зачем вам вызывать окно "Найти и заменить" с помощью макросов? В VBA-Word есть объект "Find", который аналог окну "Найти и заменить".
Скрипт вне форума Ответить с цитированием
Старый 21.05.2013, 19:31   #3
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Дело в том, что мне нужно создать рабочую среду для редактора. Скрипт работает таким образом, что находясь на определенном слове и запустив его он получает подготовленный диалог для замены, в котором, возможно, ему придется подкорректировать поле "Заменить на:".

В принципе, мне удалось решить эту проблему, но совершенно идиотским способом: назначил вызов диалога замены на Ctrl_0. Почему-то SendKeys "^0" запускается из макроса при любой раскладке.
В процессе экспериментов выяснилось, что если назначить на F11, диалог не вызывается при любой раскладке клавиатуры... Полный бред
Vadim39 вне форума Ответить с цитированием
Старый 21.05.2013, 19:54   #4
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
Vadim39: может кто-нибудь подскажет, как написать скрипт для определения и управления раскладкой клавиатуры.
Переключите клавиатуру на нужный язык и запустите процедуру "Procedure_1". Получите число, которое подставьте в процедуру "Procedure_2".

Код:
Sub Procedure_1()
    
    'Узнаём идентификатор языка клавиатуры.
    'Вывод результата в View - Immediate Window.
    Debug.Print Application.Keyboard

End Sub

Sub Procedure_2()
    
    'Изменяем язык клавиатуры.
    'Вставляем число, полученное в процедуре "Procedure_1".
    Application.Keyboard 68748313

End Sub

Последний раз редактировалось Скрипт; 21.05.2013 в 20:04.
Скрипт вне форума Ответить с цитированием
Старый 21.05.2013, 20:40   #5
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
Vadim39: Если вызвать Dialogs(wdDialogEditReplace).Show, то после выполнения замены появляется сообщени об ошибке.
Пример кода, который не останавливается при возникновении ошибки:
Код:
Sub Procedure_3()
    
    'Команда "On Error Resume Next" позволяет коду продолжить работу,
        'не смотря на ошибку.
    On Error Resume Next

        'Отображаем окно.
        Application.Dialogs(wdDialogEditReplace).Show
        
        'Смотрим, была ли ошибка, если была, то какая.
        If Err.Number <> 0 Then
            'Если ошибка "5372" или "5452", то эта ошибка появляется с результом
                'работы окна "Найти и заменить", например, сколько прошло замен.
                'Не понятно, зачем этот результат выводится в окно с ошибкой.
            If Err.Number <> 5372 Or Err.Number = 5452 Then
                'Выводим на монитор сообщение, что возникла
                    'неизвестная ошибка.
                MsgBox "Непредвиденная ошибка."
                'Выходим из кода.
                Exit Sub
            End If
        End If
    'Команда "On Error GoTo 0" отменяет действие "On Error Resume Next" и
        'делает в объекте "Err" ноль.
    On Error GoTo 0

End Sub

Последний раз редактировалось Скрипт; 21.05.2013 в 20:43.
Скрипт вне форума Ответить с цитированием
Старый 21.05.2013, 21:19   #6
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Большое спасибо!
А возможно ли с помощью Application.Keyboard управлять также и раскладками (внутри одного языка)? Отдает-то он числа разные для разных раскладок, а вот включает только одну. Имеется в виду, что если запускать эту процедуру с разными числами, соответствующими различным раскладкам внутри одного языка, переключение происходит только на одну из них, вероятно первую.
Vadim39 вне форума Ответить с цитированием
Старый 21.05.2013, 21:52   #7
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Vadim39, вы встречали людей, которые используют раскладку клавиатуры?
Скрипт вне форума Ответить с цитированием
Старый 21.05.2013, 22:01   #8
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Встречал ли я самого себя? Довольно философский вопрос
Мне нередко приходится работать с двуязычными текстами, один из языков английский, другой может варьироваться. В русский я добавляю дополнительную раскладку второго языка. В таком случае, переключение между языками - alt+shift. А между раскладками - contral+shift. На мой вкус, так гораздо удобнее, чем всякий раз переключаться одной комбинацией клавиш между тремя и более состояниями.
Vadim39 вне форума Ответить с цитированием
Старый 21.05.2013, 22:04   #9
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Vadim39, т.е. допустим вы используете русский язык и у вас два варианта расположения клавиш для русского языка?
Скрипт вне форума Ответить с цитированием
Старый 21.05.2013, 22:08   #10
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Нет, просто вместо второго варианта расположения клавиш я подключаю раскладку, взятую из набора другого языка.
Vadim39 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
Проблема с SendKeys termitru Win Api 1 26.07.2011 22:21
Где найти модуль SendKeys? saylar_06 Общие вопросы Delphi 4 29.05.2011 19:20
application.sendkeys "~" ruavia3 Microsoft Office Excel 1 12.02.2010 16:24
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37