1

Тема: Пересылка кода клавиш (из PowerPoint в Word)

В блоге  есть статья "Быстрый ввод текста с помощью команды =rand()". Там приводится макрос, добавляемый к Normal.dot, основная идея - в использовании последовательности:
Selection.TypeText Text:="=rand()"
SendKeys "{ENTER}"

Все здорово, выполненный из Normal.dot макрос генерирует псевдотекст в активном документе.
Но использовать Normal.dot не всегда удобно. Хочется странного: макрос из текущего документа добавляет псевдотекст в другой документ (новый, выбранный и т.п.). Но, если верить справке, SendKeys:
Sends one or more keystrokes to the active window as if typed at the keyboard.
И, действительно, попытки активизировать окно нужного документа ни к чему не привели: Enter посылается или в текущий документ или, если запускать макрос из редактора - в код макроса.
Нет ли какого-то очевидного решения для пересылки кода клавиш в нужное окно?
Примечание. Функции API - решение не очевидное (для меня).

2

Re: Пересылка кода клавиш (из PowerPoint в Word)

alural пишет:

В блоге  есть статья "Быстрый ввод текста с помощью команды =rand()". Там приводится макрос, добавляемый к Normal.dot, основная идея - в использовании последовательности:
Selection.TypeText Text:="=rand()"
SendKeys "{ENTER}"

Интересно, что при запуске из редактора VBA с помощью клавиши F5 команда SendKeys "{ENTER}" действует как нажатие клавиши ENTER в редакторе VBA.
Указанный макрос работает только при запуске из программы Word (Разработчик - Макросы - [Название_макроса]).

Если такой макрос поместить не в Normal.dot, а в модуль другого документа, то из данного документа он будет не виден и запустить его из приложения Word не получится.
Или я не прав?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

3

Re: Пересылка кода клавиш (из PowerPoint в Word)

Alex_Gur пишет:

Если такой макрос поместить не в Normal.dot, а в модуль другого документа, то из данного документа он будет не виден и запустить его из приложения Word не получится.
Или я не прав?

Не совсем. Виден-то макрос будет. И выполнится. Но, вот, код {Enter} будет послан в то окно, откуда вызывался.

4

Re: Пересылка кода клавиш (из PowerPoint в Word)

alural пишет:
Alex_Gur пишет:

Если такой макрос поместить не в Normal.dot, а в модуль другого документа, то из данного документа он будет не виден и запустить его из приложения Word не получится.
Или я не прав?

Не совсем. Виден-то макрос будет. И выполнится. Но, вот, код {Enter} будет послан в то окно, откуда вызывался.

Хотел бы воспроизвести эту ситуацию. Но, к сожалению, у меня макрос не виден.
Еще раз описываем условия, если я правильно их понял.
Допустим, открыты 2 файла - Документ 1 и Документ 2.
Ваш макрос находится в модуле файла Документ 1.
Если я нахожусь в файле Документ 2, то я могу выполнить макросы из 4-х источников:
- Активных шаблонов;
- Normal.dotm (общего шаблона);
- команд Word и
- Документ 2 (модуль второго файла).
Ни в одном из этих случаев макрос из Документа 1 не виден.
Как Вам удалось все же его запустить?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

5

Re: Пересылка кода клавиш (из PowerPoint в Word)

Извините, думал о своем и не так понял Вас.
Ситуация немного другая. Документ 1, в котором макрос. Этот макрос открывает | создает |  выбирает среди открытых, не суть, другой документ 2. Что-то с ним делает, например, выводит в документ 2:
Selection.TypeText "=rand()".
До сих пор все работает, в документе 2 напечатано =rand()
А теперь, чтобы вывелся псевдотекст, нужно "нажать Enter":
SendKeys "{ENTER}"
И тут ENTER "нажимается" в документе 1. Или даже в редакторе VBA, если макрос запускается оттуда. Пичалька...

6

Re: Пересылка кода клавиш (из PowerPoint в Word)

У меня все сработало.
Пусть макрос Text1 находится в модуле файла Doc2.docm.
Открываем еще один файл с именем Doc1.docx (мне кажется важным, чтобы оба файла были открыты в различных окнах одного экземпляра Word, а не в двух разных экземплярах).
Делаем активным файл Doc2.docm и запускаем макрос Text1.

Sub Text1()
    Documents("Doc1.docx").Activate
    ' Файл Doc1.docx должен быть открыт в Ворде, но неактивен.

    Selection.TypeText Text:="=rand()"
    SendKeys "{ENTER}"
End Sub

Попробуйте.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

7

Re: Пересылка кода клавиш (из PowerPoint в Word)

О! Шаман... Спасибо. Долгое время и это не получалось.
Похоже, я после того, как осознал проблему, все время только из редактора и запускал подобный макрос...
А как можно из макроса, запущенного в  редакторе, все же активизировать окно документа? У меня все эти упражнения предполагают работу в разных приложениях, т.е макрос в PowerPoint должен запустить Word и продемонстрировать работу с ним. Примерно так:

Private Sub CommandButton1_Click()
Dim apWord As Word.Application
Set apWord = CreateObject("Word.Application")
Dim oDoc As Word.Document
Set oDoc = apWord.Documents.Add()
oDoc.Activate
apWord.Selection.TypeText "=rand()"
SendKeys "{Enter}"
Rem и начинаем с этим текстом работать
End Sub

Извините, что задачу рассказываю по частям, но была надежда, что нехватает подзказки, а похоже - бОльшего sad(

8

Re: Пересылка кода клавиш (из PowerPoint в Word)

alural пишет:

О! Шаман... Спасибо. Долгое время и это не получалось.
Похоже, я после того, как осознал проблему, все время только из редактора и запускал подобный макрос...
А как можно из макроса, запущенного в  редакторе, все же активизировать окно документа? У меня все эти упражнения предполагают работу в разных приложениях, т.е макрос в PowerPoint должен запустить Word и продемонстрировать работу с ним. Примерно так:

Sub CommandButton1_Click()
Dim apWord As Word.Application
Set apWord = CreateObject("Word.Application")
Dim oDoc As Word.Document
Set oDoc = apWord.Documents.Add()
oDoc.Activate
apWord.Selection.TypeText "=rand()"
SendKeys "{Enter}"
Rem и начинаем с этим текстом работать
End Sub

Извините, что задачу рассказываю по частям, но была надежда, что нехватает подзказки, а похоже - бОльшего sad(

К сожалению, я не являюсь специалистом по макросам в PowerPoint, но попробуем разобраться.
Основная проблема при решении Вашей задачи - правильно активировать Word из PowerPoint. Тогда все получится.
Предварительно не забываем добавить в редактор макросов PowerPoint объектную библиотеку Word (Tools – References).

У меня заработал следующий макрос, запускаемый из PowerPoint:

Public Sub Документ_Word()
    Dim w As New Word.Application
    Dim d As Word.Document
    
    'открыть документ и записать его в переменную 
    '(на диске должен иметься файл D:\a.docx)
    Set d = w.Documents.Open("D:\a.docx")
    
    'отобразить Word
    w.Visible = True
    
    'активировать Word
    w.Activate
    
    w.Selection.TypeText "=rand()"
    SendKeys "{Enter}"
    
End Sub

В чем отличие от Вашего макроса - надо подумать.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

9

Re: Пересылка кода клавиш (из PowerPoint в Word)

В Ваших обозначениях макрос корректно работает так:

Sub Text_Macros1()

    Dim apWord As Word.Application
    Set apWord = CreateObject("Word.Application")
    Dim oDoc As Word.Document
    Set oDoc = apWord.Documents.Add()
    apWord.Visible = True
    apWord.Activate
    oDoc.Activate
    apWord.Selection.TypeText "=rand()"
    SendKeys "{Enter}"
    Rem и начинаем с этим текстом работать

End Sub

Что было сделано неправильно:
1) Отсутствовала команда видимости Word:

apWord.Visible = True

2) Главное, активировать нужно экземпляр Word:

apWord.Activate

Также можно активировать и документ, но, в данном случае, не обязательно:

oDoc.Activate

После исправления этих ошибок все работает.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

10

Re: Пересылка кода клавиш (из PowerPoint в Word)

Спасибо! Вот он, больной зуб:

apWord.Activate

Именно этого не смог найти. Все работает, а если включить видимость приложения, то еще и можно это увидеть.
Такой макрос можно и из редактора запускать, все отрабатывает, и все видно.
Еще раз спасибо.