Excel это не сложно

Основные форумы => Вопросы по Outlook и VBA => Тема начата: vamos от 11.02.2017, 12:47:45



Название: Как открыть сообщение для редактирования через объектную модель Word?
Отправлено: vamos от 11.02.2017, 12:47:45
Добрый день!

Подскажите, плиз, как открыть сообщение (MailItem) для редактирования через объектную модель Word (через свойство Inspector.WordEditor)?
(сообщение не новое - а старое, полученное или уже отосланное)
Outlook 2010.

Руками это делается в окне чтения сообщения в ленте через Сообщение - (Переместить) - Действия - Изменить сообщение. А как это сделать программно?

В приведенном ниже коде попытка wdRange.InsertAfter - приводит к ошибке "Run-time error '4605': Метод или свойство недоступны, поскольку документ заблокирован для редактирования."
Посмотрел, в wdDoc.ProtectionType стоит "wdAllowOnlyReading". А если вручную открыть на редактирование - то "wdNoProtection".
Но попытка сделать wdDoc.Unprotect приводит к ошибке "Run-time error '4605': Данная команда недоступна."

В свойствах MailItem или Inspector ничего подходящего не вижу.
Если сделать "Изменить сообщение" руками - то приведенный код работает.

Подскажите, плиз!

Код: (vb)

Private Sub test1()
    Dim Msg As MailItem, AI As Inspector, wdDoc As Word.Document, wdRange As Word.Range
    Set AI = ActiveInspector
    Set Msg = AI.CurrentItem
    Set wdDoc = AI.WordEditor
    Set wdRange = sDoc.Range(0, 0)
    wdRange.InsertAfter "[Вставленный текст]"
End Sub


Название: Re:Как открыть сообщение для редактирования через объектную модель Word?
Отправлено: vamos от 11.02.2017, 12:57:14
Сам пока нашел 2 решения, но оба не достаточно хороши.
 - wdDoc.Unprotect
Оказывается, работает на части писем. Больше половины, но не на всех.
К тому же, при попытке сделать wdRange.Find.Execute Outlook "падает" (не на каждом письме, но быстро :))
И эта команда делает всё же не то, что делает кнопка. Сообщение на редактирование открывается, но вордовские вкладки над лентой не появляются.
 - открыть Inspector и сделать SendKeys
Код: (vb)
Application.ActiveInspector.Activate
SendKeys "%TCC", True - делает симуляцию нажатия кнопки "Изменить сообщение"

Делает то, что нужно. Но делает это долго (на каждое письмо от секунды до нескольких), и может не всегда срабатывать.

Хотелось бы всё же как-то делать через объектную модель (скорее всего объекты Outlook, но может быть и Word), но уже всю голову сломал, КАК.
Подскажите, плиз!


Название: Re:Как открыть сообщение для редактирования через объектную модель Word?
Отправлено: Дмитрий Щербаков(The_Prist) от 11.02.2017, 14:55:46
Так а почему не подключаетесь к Outlook и там не правите? Ведь это проще, чем менять через Word. Примеры работы в Outlook есть на сайте в разделе Хитрости.


Название: Re:Как открыть сообщение для редактирования через объектную модель Word?
Отправлено: vamos от 12.02.2017, 04:16:04
Так а почему не подключаетесь к Outlook и там не правите? Ведь это проще, чем менять через Word. Примеры работы в Outlook есть на сайте в разделе Хитрости.
Дело в том, что вообще мне надо делать замену Строки1 на Строку2.
Если Вы имеете в виду через HTMLBody, то задача замены там в моем случае сложна. Все письма какие-то разные, разные форматы, разные кодировки. Тэги в разных местах понатыканы....
Даже письма, копипастенные с одного вордовского шаблона, отличаются почему-то.


Название: Re:Как открыть сообщение для редактирования через объектную модель Word?
Отправлено: Дмитрий Щербаков(The_Prist) от 12.02.2017, 11:18:34
Нет, я имею ввиду подключиться к Outlook и из него сделать правку. Как Вы руками правите? Можете прямо по шагам описать процесс? Может я чего не так понимаю просто. После того как опишите - можно будет уже более конкретное что-то посоветовать или предложить.


Название: Re:Как открыть сообщение для редактирования через объектную модель Word?
Отправлено: vamos от 13.02.2017, 13:56:00
Пока не нашел то, что нужно, прям в самих объектах.
Но нашел, как через объекты симулировать нажатие "Изменить сообщение" без SendKeys:
Код: (vb)
Insp.CommandBars.ExecuteMso ("EditMessage")

Ну и что-то типа такого при имеющемся MailItem:
Код: (vb)
Dim Insp As Inspector, MI As MailItem
Set Insp = MI.GetInspector
Insp.Activate: DoEvents
Insp.CommandBars.ExecuteMso ("EditMessage"): DoEvents

(DoEvents, возможно, не нужно)


Название: Re:Как открыть сообщение для редактирования через объектную модель Word?
Отправлено: vamos от 13.02.2017, 14:25:27
Нет, я имею ввиду подключиться к Outlook и из него сделать правку. Как Вы руками правите? Можете прямо по шагам описать процесс? Может я чего не так понимаю просто. После того как опишите - можно будет уже более конкретное что-то посоветовать или предложить.
Я пишу макрос в Аутлуке. Из Аутлука выбираю MailItem (подробности опущу). У него беру инспектора (через MailItem.GetInspector), у которого получаю объектную модель Word данного письма (через Inspector.WordEditor). Которая закрыта для редактирования (прочитать всё могу - написать нет). Вопрос в том, как ее "разлочить" для редактирования.
Встречал много примеров, где она просто применяется без разлочивания - но это работает для новых писем, только что созданных. Создал новый MailItem - вот у тебя разлоченный Inspector.WordEditor. Сразу можно редактировать. А мне надо заменять в старых письмах (уже отосланных или уже полученных). Они так просто не редактируются (выдает ошибку, описанную в первом посте).

Конкретно по шагам что надо сделать руками для получения нужного результата на примере одного письма:
1. Открыть письмо (окно сообщения aka Inspector).
2. Выбрать "Изменить сообщение" (через Ленту: Сообщение - Действия - Изменить сообщение).
3. Нажать Ctrl+H - открывается окно замены (либо мышкой через Ленту: Сообщение - Найти - Заменить)
4. Ввести Строку1, Строку2 (заменяемое, заменяющее).
5. Нажать "Заменить все"
6. Нажать "Закрыть" в окне "Найти и заменить"
7. Нажать "Закрыть" в окне сообщения.

Впрочем, решение (через Commandbars, т.е. симуляцию нажатия кнопки Ленты) я уже нашел. В принципе, в последнее время я именно про такое решение думал.
Лучше будет только если есть какое-то решение через именно свойства и методы "натуральных" объектов (типа Inspector, MailItem, Application и т.п.).