powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка сообщений MS Outlook
30 сообщений из 30, показаны все 2 страниц
Обработка сообщений MS Outlook
    #36993150
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.

Мне необходимо с помощью VBA установить связь между MS Outlook и MS Excell. Мне нужно сделать так, что бы после получения определенного письма от определенного отправителя в MS Outlook происходило присвоение определенного значения ячейке книги MS Excell.

Есть идеи?

Заранее спасибо.
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993221
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glock,

Идея есть. Нужно в аутлуке написать обработчик входящей почты, который будет проверять ВСЕ новые сообщения по факту получения почты. И когда дойдет до "определенного письма от определенного отправителя" нужно будет открыть Excel файл и там произвести обновление ячейки.

Как Вам идея? Я сам придумал.
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993297
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,

Спасибо. Идея хороша. Но для меня непонятен процесс работы обработчика почты. Является ли его работа фоновой? Как работа этого скрипта будет сопрягаться с другими запускаемыми макросами в Excell?
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993311
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glock,

В Outlook есть событие - получение новой почты. На это событие вешается обработчик. Ни на кого он влиять не будет.
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993328
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,

А можете немного детальней расписать процесс?

Я с Аутлуком весьма на "Вы". Где мне настроить обработку сообщений и последующую реализацию скрипта?
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993441
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glock,

Запускаете аутлук
нажимаете Alt+F11
находите ThisOutlookSession
пишите
Код: plaintext
Private Sub Application_NewMail()
трах -бабах.... (с) и скрипт готов
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993464
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,

И точно. Спасибо большое!

А можно еще несколько вопросов?

Как сформулировать условие проверки нового входящего сообщения?
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993513
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glock,

не понял вопрос. Что значит как сформулировать условие?

Код: plaintext
If x.SenderName= "Иванов Иван Иванович" and x.Attachments( 1 ).Name = "Файл от Иванова.xls" Then ....
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993607
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,

Почитал msdn.microsoft.com на тему .SenderName. Нашел там пример

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Application_NewMail()
    Dim myOlApp As Outlook.Application
    Dim myItem As Outlook.MailItem
    Set myOlApp = CreateObject("Outlook.Application")
    Set myItem = myOlApp.ActiveInspector.CurrentItem
    If myItem.SenderName = "XXX" Then
        MsgBox "This message is sent by XXX"
    End If
End Sub

Но MVB ругается. Выдает ошибку run-time 91, Object varieble or With block varieble not set.

Ругается на эту строку: "Set myItem = myOlApp.ActiveInspector.CurrentItem"
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993820
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glock,

итем не тот выбрали

почитайте лучше форум, тут примеров по обработке почты валом. На моей памяти штуки 2-3. Там есть готовые коды.
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993834
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,

я первым делом посмотрел другие топики, но ничего что помогло бы мне не нашел.

подскажите, пожалуйста, как правильно?
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993883
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glock,

неправда Ваша, я сам лично тут писал один
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993961
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,

Я этот топик в числе прочих прочитал. В коде, который Вы привели, идет обработка сообщений из определенной папки. Мне же необходимо проверять все входящие сообщения.

Как я понял, моя задача найти что-то иное, вместо "ActiveInspector.CurrentItem", который обрабатывает открытое сообщение.
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993965
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glockShamanus,

Я этот топик в числе прочих прочитал. В коде, который Вы привели, идет обработка сообщений из определенной папки. Мне же необходимо проверять все входящие сообщения.

Как я понял, моя задача найти что-то иное, вместо "ActiveInspector.CurrentItem", который обрабатывает открытое сообщение.
эта "определённая" папка, как вы выразились, и есть та, что вам нужно
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36993994
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
    Set myOlApp = CreateObject("Outlook.Application")
    Set myNameSpace = myOlApp.GetNamespace("MAPI")
    Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox)
    Set myItem = myFolder.Items( 1 )
    SenderName = myItem.SenderName

Кажется таким образом получилось достигнуть необходимого результата
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36994027
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
glock,

the struggle continues

Теперь мне нужно каким-то неведомым мне методом заставить Outlook записать данные на определенном листе определенной книги Excell.

Поскольку я до этого момента писал скрипты на VBA только для Excell, с ходу реализовать задуманное не получилось :(
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36994297
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glockТеперь мне нужно каким-то неведомым мне методом заставить Outlook записать данные на определенном листе определенной книги Excell.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim EX As Excel.Application
Dim WB As Excel.Workbook
Set EX = CreateObject("Excel.Application")
Set WB = EX.Workbooks.Open("определенный файл.xls")
WB.Worksheets("Определенный лист").Cells( 1 ,  1 ) = "данные"
WB.Save
WB.Close
Set WB = Nothing
EX.Quit
Set EX = Nothing
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36994300
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо либо подключить референс на эксель, либо определить EX и WB как Object
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996472
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.

Код: plaintext
Set WB = EX.Workbooks.Open("определенный файл.xls")

А как установить связь с уже открытым файлом?
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996514
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glockА как установить связь с уже открытым файлом?
Код: plaintext
Set EX = GetObject(, "Excel.Application")
эта строка установит связь с уже запущенным экземпляром экселя. Далее надо перебрать коллекцию WorkBooks и найти нужную книгу.

Но тут есть нюанс, который я не знаю как обойти. Экселей может быть запущено несколько. Либо в результате того, что пользователь запустит два экселя ЯВНО (через ярлык экселя, а не через открытие книги) или экземляров понаделает другая программа через CreateObject (в том числе невидимых).
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996526
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

не подскажите, каким образом перебирать книги?

как оказалось, опыт VBA в Экселе тут совсем не помогает.
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996536
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glockне подскажите, каким образом перебирать книги?
как оказалось, опыт VBA в Экселе тут совсем не помогает.
Это еще почему не помогает?
Все коллекции перебираются одинаково.
Код: plaintext
1.
2.
For Each WB In XL.Workbooks
...
Next
можете анализировать свойство Name или Path или FullName
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996539
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
glock,

Вообще не понятно, вроде как Эксель не позволяет открывать сразу две книги с одинаковыми именами, почему нельзя применить что-то типа
Код: plaintext
Workbook("Книга1.xlsm").Select
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996541
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Спасибо за помощь!

Буду пытаться.
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996547
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glockвроде как Эксель не позволяет открывать сразу две книги с одинаковыми именами,
Один эксель - да. Зато можно запустить два Экселя.

glockпочему нельзя применить что-то типа
Код: plaintext
Workbook("Книга1.xlsm").Select

Не Workbook, a Workbooks
можно, в принципе, можно даже не делать Select, а просто взять Item и им оперировать.
Только надо сделать обработчик ошибок, вдруг книги нет.
(впрочем, при работе с СОМ обработчик ошибок нужно делать всегда)
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996585
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот в таком виде удалось добиться успеха. Может быть кому-то как я такая готовая конструкция поможет. Сам я как ни пытался найти, так и не смог.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub Application_NewMail()
    'Dim EX As Excel.Application
    'Dim WB As Excel.Workbook

    Set myOlApp = CreateObject("Outlook.Application")
    Set myNameSpace = myOlApp.GetNamespace("MAPI")
    Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox)
    Set myItem = myFolder.Items( 1 )
    
    SenderName = myItem.SenderName
    If SenderName = "IBSO" Or SenderName = "" Then
        
        Set XL = GetObject(, "Excel.Application")
        For Each WB In XL.Workbooks
            If WB.Name = "Книга1.xls" Then GoTo  111 
        Next
 111 
        WB.Worksheets("Лист1").Cells( 1 ,  1 ) = "данные"
    End If
End Sub

Первые две строки закоментированы, так как из за них вылазит ошибка "Compile Error: User-defined type not defined". Но без них работает уверенно.

Shocker.Pro, может поможете с обработчиком ошибок?
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996603
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glockПервые две строки закоментированы, так как из за них вылазит ошибка "Compile Error: User-defined type not defined". Но без них работает уверенно.
Я вам говорил, либо добавьте референс, либо объявите их как object.
И хорошо бы использовать Option Explicit

это лучше так:
Код: plaintext
If WB.Name = "Книга1.xls" Then Exit For

Обдумайте также, что будет, если книга не открыта (то есть цикл закончился естественным путем)

glockShocker.Pro, может поможете с обработчиком ошибок?
Курите On Error - примеры в хелпе есть
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996746
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glock,
Если придут одновременно 2 письма, то Ваш алгоритм проверит только последнее. А если у Вас еще и не exchange сервер, то вероятность такого события увеличивается в разы.
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996885
glock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanusglock,
Если придут одновременно 2 письма, то Ваш алгоритм проверит только последнее. А если у Вас еще и не exchange сервер, то вероятность такого события увеличивается в разы.
Почему? Как исправить ситуацию? Перебором всех последних сообщений?
...
Рейтинг: 0 / 0
Обработка сообщений MS Outlook
    #36996909
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glockПеребором всех последних сообщений?Я другого варианта не смог найти. Но мне кажется есть вариант кошернее и глубины интернета должны его содержать. Просто перебор последних сообщений и поиск по признаку непрочитанное неверно логически. Размер этого пула просто непредсказуем.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка сообщений MS Outlook
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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