Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
18.04.2024, 09:26:47

Войти
Интересные и полезные статьи по работе с Excel и VBA можно найти в разделе ХИТРОСТИ
33 240 Сообщений в 5 456 Тем от 6 758 Пользователей
Последний пользователь: Сергей2662
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Outlook и VBA
| | |-+  Как открыть сообщение для редактирования через объектную модель Word?
Страниц: [1]   Вниз
Печать
Автор Тема: Как открыть сообщение для редактирования через объектную модель Word?  (Прочитано 9209 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vamos
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« : 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
Записан
vamos
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« Ответ #1 : 11.02.2017, 12:57:14 »

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

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

Хотелось бы всё же как-то делать через объектную модель (скорее всего объекты Outlook, но может быть и Word), но уже всю голову сломал, КАК.
Подскажите, плиз!
« Последнее редактирование: 11.02.2017, 12:58:58 от vamos » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 830



Просмотр профиля WWW
« Ответ #2 : 11.02.2017, 14:55:46 »

Так а почему не подключаетесь к Outlook и там не правите? Ведь это проще, чем менять через Word. Примеры работы в Outlook есть на сайте в разделе Хитрости.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
vamos
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« Ответ #3 : 12.02.2017, 04:16:04 »

Так а почему не подключаетесь к Outlook и там не правите? Ведь это проще, чем менять через Word. Примеры работы в Outlook есть на сайте в разделе Хитрости.
Дело в том, что вообще мне надо делать замену Строки1 на Строку2.
Если Вы имеете в виду через HTMLBody, то задача замены там в моем случае сложна. Все письма какие-то разные, разные форматы, разные кодировки. Тэги в разных местах понатыканы....
Даже письма, копипастенные с одного вордовского шаблона, отличаются почему-то.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 830



Просмотр профиля WWW
« Ответ #4 : 12.02.2017, 11:18:34 »

Нет, я имею ввиду подключиться к Outlook и из него сделать правку. Как Вы руками правите? Можете прямо по шагам описать процесс? Может я чего не так понимаю просто. После того как опишите - можно будет уже более конкретное что-то посоветовать или предложить.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
vamos
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« Ответ #5 : 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, возможно, не нужно)
Записан
vamos
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« Ответ #6 : 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 и т.п.).
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru