powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
8 сообщений из 8, страница 1 из 1
VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
    #39402651
vamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

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

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

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

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

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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
    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  
...
Рейтинг: 0 / 0
VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
    #39402652
vamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам пока нашел 2 решения, но оба не достаточно хороши.
- wdDoc.Unprotect
Оказывается, работает на части писем. Больше половины, но не на всех.
К тому же, при попытке сделать wdRange.Find.Execute Outlook "падает" (не на каждом письме, но быстро Улыбка)
И эта команда делает всё же не то, что делает кнопка. Сообщение на редактирование открывается, но вордовские вкладки над лентой не появляются.
- открыть Inspector и сделать SendKeys
Код: vbnet
1.
2.
    Application.ActiveInspector.Activate  
    SendKeys "%TCC", True - делает симуляцию нажатия кнопки "Изменить сообщение"  




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

Хотелось бы всё же как-то делать через объектную модель (скорее всего объекты Outlook, но может быть и Word), но уже всю голову сломал, КАК.
Подскажите, плиз!
...
Рейтинг: 0 / 0
VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
    #39403457
vamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока не нашел то, что нужно, прям в самих объектах.
Но нашел, как через объекты симулировать нажатие "Изменить сообщение" без SendKeys:
Код: vbnet
1.
Insp.CommandBars.ExecuteMso ("EditMessage")


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


(DoEvents, возможно, не нужно)
...
Рейтинг: 0 / 0
VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
    #39404431
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Sub EditMsg()
  With ActiveExplorer.Selection.Item(1).GetInspector
    .Activate
    On Error Resume Next
    .CommandBars("Menu Bar").FindControl(ID:=5604, Recursive:=True).Execute
    On Error GoTo 0
  End With
End Sub


Здесь On Error Resume Next используется для случая, когда сообщение уже редактируется
...
Рейтинг: 0 / 0
VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
    #39404837
vamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZVI, Благодарствую!
А не подскажете, откуда берется ID:=5604?
Если в след. раз нужно будет нажать другую кнопку, как узнать ее ID?
...
Рейтинг: 0 / 0
VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
    #39404841
vamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И есть ли какие-то ощутимые отличия этого метода от приведенного выше?
...
Рейтинг: 0 / 0
VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
    #39405156
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Office 2003 были пункты меню со своими ID и Caption. Пункт [Изменить сообщение] c ID = 5604 был в меню [Правка].
Начиная с Office 2007 вместо меню появилась лента. Но все меню, как те суслики в поле, хоть и не видны, но они точно там есть.
Посмотреть ID можно таким кодом:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub Test()
  
  Dim x As CommandBarControl
  
  ' Открыть инспектор Outlook для выбранного сообщения
  ActiveExplorer.Selection.Item(1).GetInspector.Activate
  
  ' Подсмотреть ID для меню [&Правка]
  For Each x In Application.ActiveInspector.CommandBars("Menu Bar").Controls
    Debug.Print x.Caption, x.ID
  Next
  ' [&Правка] ID=30003
  
  ' Теперь подсмотреть ID для [Изменить &сообщение]
  For Each x In Application.ActiveInspector.CommandBars("Menu Bar").FindControl(ID:=30003).Controls
    Debug.Print x.Caption, x.ID
  Next
  ' [Изменить &сообщение] ID=5604
  
End Sub


Принципиальных отличий от ExecuteMso нет, разве что более прямое обращение к методу.
Еще предложенный код не требует, чтобы было открыто сообщение, он сам его откроет.
Не агитирую, используйте то, что понравится :)
...
Рейтинг: 0 / 0
VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
    #39405377
vamos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZVI, благодарю!
Если что, я не ставлю под сомнение - просто пытаюсь разобраться. Сам несколько дней как узнал вообще про существование CommandBars, так что поле для меня неизведанное :), а с информацией по теме как-то не густо...

Сам подсмотрел про ExecuteMso у Уокенбаха (Уокенбах Дж. Excel 2010. Профессиональное программирование на VBA. 2012, Глава 22, с. 691 и далее - если кому будет интересно).
Он предлагает "подсматривать" нужное название элемента управления в меню Настройка ленты во всплывающей подсказке.
В отношении Аутлука надо учитывать, что меню относятся к Explorer / Inspector и у них они разные.

(это я так, для тех, кто будет гуглить эту тему, как я неделю назад :))
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Outlook: Как открыть сообщение для редактирования через объектную модель Word?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]