Страницы: 1
RSS
Сохраниение вложения из письма Outlook
 
Добрый день, все пытался создать макрос в Outlook на основании темы https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=90847 но никак не получается, ибо не хватает знаний.

Вводные данные - есть макрос на автозапуск любого макроса при получении нового входящего письма, подключить с новым думаю получится.
Задача - при получении нового письма запускается макрос (уже есть), который вызывает другой, а именно тот макрос, который берет новое письмо:

1) если в теме письма есть фраза "раз два три";
2) если в письме есть вложение экселя - xls, xlsm, xlsx ( и любые другие его форматы ) сохраняет вложение в папку С:\Users\p\Desktop\test, не удаляя ни вложение ни письмо, а просто прочитав его, чтобы при повторном запуске не брались все письма из папки, а только новые.

Возможно можно сделать проще, чтобы аутлук каждые 30 минут проверял папку входящие на те же условия выше, прочитывал почту и сохранял вложенния. Как я понимаю, при запуске каждые 30 минут, если нет новых писем с необходимым условием, то ничего не сохраняется.

Буду признателен за помощь, если нужны какие-то вводные данные, дайте знать.  
 
Цитата
Павел П написал:
есть макрос на автозапуск
Цитата
Павел П написал:
запускается макрос (уже есть),
вот все-то у Вас есть...  :)  А у нас нет. Куда встраивать-то? Просто есть подозрение, что раз в теме по ссылке Вы ничего для себя не нашли - предложенные функции тоже не сможете адаптировать. Но будем надеяться, что сможете. Вот функция, которая делает ровно то, что просили:
Код
Function SaveAttach(oMail As Object)
    Dim oAtch As Object
    If oMail.Subject Like "*раз два три*" Then
        'просматриваем каждое вложение письма
        For Each oAtch In oMail.Attachments
            'отбираем только файлы Excel
            If oAtch Like "*.xl*" Then
                oAtch.SaveAsFile "С:\Users\p\Desktop\test\" & oAtch
                oMail.UnRead = False
                oMail.Save
            End If
        Next
    End If
End Function
вот тот макрос, который уже есть и который запускается, должен вызывать эту функцию, передав в неё письмо.
Изменено: Дмитрий(The_Prist) Щербаков - 03.03.2021 16:11:37 (опечатка)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, благодарю за столь быстрый ответ :)

Вы правы... связать не удалось. Вот макрос, что есть, с Вашим не захотел коннектится :( Где написано нужно вставить макрос прописал Ваше название, ничего не произошло. письмо не прочиталось и не сохранился файл. Сразу забыл уточнить, можно же, чтобы имя файла было "имя_дата_время", так как файлов с одни и тем же названием будет много.

Код ниже стоит в ThisOutlookSession, а Ваш код вставлял в новый модуль.
Код
Option Explicit
Private WithEvents inboxItems As Outlook.Items
Private Sub Application_Startup()
  Dim outlookApp As Outlook.Application
  Dim objectNS As Outlook.NameSpace
  
  Set outlookApp = Outlook.Application
  Set objectNS = outlookApp.GetNamespace("MAPI")
  Set inboxItems = objectNS.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub inboxItems_ItemAdd(ByVal Item As Object)

Dim objApp As Outlook.Application
Dim objItem As Object ' MailItem
Set objApp = Application
Set objItem = objApp.ActiveExplorer.Selection.Item(1)

'macro name you want to run goes here
SaveAttach

End Sub
Изменено: Павел П - 03.03.2021 16:22:42
 
Цитата
Павел П написал:
прописал Ваше название
а где?
Цитата
Дмитрий(The_Prist) Щербаков написал:
передав в неё письмо
что функция должна обработать если Вы в неё ничего не передали? :)
Код
SaveAttach objItem
Цитата
Павел П написал:
чтобы имя файла было "имя_дата_время",
Код
oAtch.SaveAsFile "С:\Users\p\Desktop\test\" & Format(Now,"dd_MM_yyyy hh-mm-ss") & oAtch
делать именно сначала имя, потом "дата-время" - лениво, т.к. надо определять расширение файла, потом его вкорячивать обратно...Надеюсь, в контексте задачи не критично.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
делать именно сначала имя, потом "дата-время" - лениво, т.к. надо определять расширение файла, потом его вкорячивать обратно...Надеюсь, в контексте задачи не критично.
да, спасибо, тут это совсем не критично )

Цитата
Дмитрий(The_Prist) Щербаков написал:
а где?
Думал, если вставить в отдельный модуль Вашу функцию и сослаться на нее в коде, вызывающим макрос получится, это строчка 19 в коде, которую я привел (ниже для наглядности)
Код
'macro name you want to run goes here 
SaveAttach
мне кажется Вы все сделали здорово, но я не понимаю куда вставить сие чудо, чтобы заработало...  
Изменено: Павел П - 03.03.2021 16:49:25
 
Цитата
Павел П написал:
я не понимаю куда вставить сие чудо, чтобы заработало
а я не знаю куда Вы вставляете. Выше Вы показали куда в коде вставляете. С виду в нужное место, но не полностью - забыли передать объект. Я показал как правильно записать - надо через пробел дописать объект objItem. Это же объект пришедшего письма, верно?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, вставляю не в модуль, а сюда This OutlookSession

До того, как написать здесь, я тестировал, что если вставить в ThisOutlookSession мой код и где написано macro name you want to run goes here я писал название макроса из модуля, вызывающего черновк на создание письма, то все работало. т.е. приходило письмо и у меня открывался новое письмо. После того как Вы написал мне код, попробывал по аналогии, не получилось. Сейчас вставил весь код в ThisOutlookSession, не срабатывает, если нужно как-то объявить что-то, то как и где ?(
Код
Option Explicit
Private WithEvents inboxItems As Outlook.Items
Private Sub Application_Startup()
  Dim outlookApp As Outlook.Application
  Dim objectNS As Outlook.NameSpace
  
  Set outlookApp = Outlook.Application
  Set objectNS = outlookApp.GetNamespace("MAPI")
  Set inboxItems = objectNS.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub inboxItems_ItemAdd(ByVal Item As Object)

Dim objApp As Outlook.Application
Dim objItem As Object ' MailItem
Set objApp = Application
Set objItem = objApp.ActiveExplorer.Selection.Item(1)

'macro name you want to run goes here
SaveAttach objItem

End Sub

Function SaveAttach(oMail As Object)
    Dim oAtch As Object
    If oMail.Subject Like "*раз два три*" Then
        'просматриваем каждое вложение письма
        For Each oAtch In oMail.Attachments
            'отбираем только файлы Excel
            If oAtch Like "*.xl*" Then
                oAtch.SaveAsFile "С:\Users\p\Desktop\test" & Format(Now,"dd_MM_yyyy hh-mm-ss") & oAtch
                oMail.UnRead = False
                oMail.Save
            End If
        Next
    End If
End Function
Изменено: Павел П - 04.03.2021 09:20:11
 
Цитата
Павел П написал:
не срабатывает,
что именно не срабатывает? Ставили точки останова, до вызова функции вообще доходит?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Присылаю себе письмо с темой раз два три, оно приходит, захожу в папку тест на компьютере, там пусто, письмо в аутлуке не прочитано.
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
до вызова функции вообще доходит
Дмитрий, думаю да, функция не вызывается.
 
Цитата
Павел П написал:
думаю да
ну, думать это одно, а проверить - другое. Точку останова ставили на функции? Проверяли - точно не вызывается? Может у Вас событие уже не срабатывает и функция не при чем. Если не знаете как ставить точки останова: ставите курсор в строку с именем функции(SaveAttach objItem) и жмете клавишу F9. Строка выделится красным. Отправьте письмо и смотрите - выбъет ли Вас на эту строку. Если выбьет - жмите F8 до тех пор, пока не увидите где сбой.
Подробнее: Отлов ошибок и отладка кода VBA

И вот я уже отсюда вижу, что Вы мой код коряво переписали. Где слеш после имени папки test?
Изменено: Дмитрий(The_Prist) Щербаков - 04.03.2021 09:41:08
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
В общем сделал все как описано Вами. Выделил красным, прислал письмо, в самом коде ничего не шло и не бежало, функция не задействована, не пожелтела и при нажатии F8 не определилась. Не вызывается.

Если поставить в код название макроса, который вызовает шаблон и отправить письмо, проделать те же шаги с подстветкой красным, подсвечивает желтым и при нажатии F8 перекидывает в модуль с макросом.

Цитата
Дмитрий(The_Prist) Щербаков написал:
Где слеш после имени папки test?
да, поставил, спасибо!
 
Цитата
Павел П написал:
в самом коде ничего не шло и не бежало, функция не задействована, не пожелтела и при нажатии F8 не определилась. Не вызывается
ну так дело не в моей функции значит, а в коде в целом. У Вас событие не срабатывает. Перезапустите Outlook или хотя бы процедуру Application_Startup, чтобы заново инициализировать отслеживание событий.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
полностью уверен, что не в функции дело) даже с моими минимальными знаниями в вба вижу, что функция очень логична)

перезапускал аутлук, вставлял в отдельный модуль, пробывал в вашем коде менять function на sub, чтобы была не функция, все равно не вызывается, даже если в вызвать меню Run Macros не видно SaveAttach в списке.
 
Цитата
Павел П написал:
не видно SaveAttach в списке
ну для этого надо хоть чуть-чуть мат.часть знать. В списке не будет видна ни одна функция или процедура, если для неё заданы аргументы.
Раз функция не срабатывает - копайте еще глубже: а точно письма попадают в папку Входящие? Может они попадают в другую папку, которая вложена в папку Входящие? Тогда Ваш фокус с
Код
Set inboxItems = objectNS.GetDefaultFolder(olFolderInbox).Items
не прокатит.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
ну для этого надо хоть чуть-чуть мат.часть знать. В списке не будет видна ни одна функция или процедура, если для неё заданы аргументы.
ок, попробую разобраться) спасибо за помощь в любом случае) если получится выложу готовый результат, может кому понадобится)

Цитата
Дмитрий(The_Prist) Щербаков написал:
а точно письма попадают в папку Входящие?
точно, в Inbox, хотел сначала сделать поиск из подпапки, но подумал, что это гораздо сложнее (но конечно удобнее - создал правило на получения письма переместить его в подпапку Test и в ней макрос пусть ищет).
 
Цитата
Павел П написал:
переместить его в подпапку Test
тогда выглядеть должно так:
Код
Set inboxItems = objectNS.GetDefaultFolder(olFolderInbox).Folders("Test").Items
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
ну для этого надо хоть чуть-чуть мат.часть знать. В списке не будет видна ни одна функция или процедура, если для неё заданы аргументы.
Дмитрий, добрый день, все таки вынужден опять просить Вашей помощи, не понимаю как запустить Вашу функцию в моем коде. Как задать аргументы вызова функции?
 
Up
 
Цитата
Павел П написал:
не понимаю как запустить Вашу функцию в моем коде. Как задать аргументы вызова функции?
а я как должен это понять? Вот Вы пишите, что не понимаете как задать аргументы. Где? Какие? Я же в самом начале показал как это сделать:
Код
SaveAttach objItem
что еще тут показывать? Если в функцию должен быть передан аргумент, то пишите имя функции и ставите пробел. После пробела - пишите имя переменной, которая должна быть передана в функцию для обработки:
Код
SaveAttach objItem
Если аргументов больше одного, то они указываются через запятую:
Код
SaveAttach objItem, var2
Все.
А т.к. больше Вы ничего толком не говорите - то и написать нечего. Сидеть и догадываться что у Вас как записано и где пытаетесь вызывать мне надоело. Это тянется с самого начала темы.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
а я как должен это понять?
код весь что есть я выложил сюда. как и почему он работает понять не могу. там где написано "'macro name you want to run goes here" я пишу название макроса (для примера test), который вызывает другие нужны мне макросы. срабатывает при каждом получении письма (любом)

далее Вы написали мне функцию (спасибо), которую вообще не понятно мне как запустить :( SaveAttach objItem если я пишу вместо test - не работает. функцию в отдельный модуль вставлял, писал вместо test название функции SaveAttach - не работает, вставлял в тот же код ниже вместо test - ничего не проиходит...

менял функцию на sub test(SaveAttach) и далее ваш код, заканчивал End sub - не работает, появляется ошибка, ведущая на удивительное разъяснение от Майкрософт OlkCategory.Click event (Outlook) | Microsoft Docs

Код
Option Explicit
Private WithEvents inboxItems As Outlook.Items
Private Sub Application_Startup()
  Dim outlookApp As Outlook.Application
  Dim objectNS As Outlook.NameSpace
  
  Set outlookApp = Outlook.Application
  Set objectNS = outlookApp.GetNamespace("MAPI")
  Set inboxItems = objectNS.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub inboxItems_ItemAdd(ByVal Item As Object)

Dim objApp As Outlook.Application
Dim objItem As Object ' MailItem
Set objApp = Application
Set objItem = objApp.ActiveExplorer.Selection.Item(1)

'macro name you want to run goes here
test

End Sub

Изменено: Павел П - 26.03.2021 14:39:19
 
Цитата
Павел П написал:
вообще не понятно мне как запустить
мне тем более непонятно, если учесть, что ранее у Вас вообще ничего не запускалось, потом папка для отслеживания была непонятна какая и т.д.
У Вас в том виде, который приложили в последнем письме макрос test вызывается? Что в нем написано?
Если там же, где сам макрос test создать указанную мной функцию - будет ли тогда вызываться? Или будет ошибка? Естественно, после перезапуска Outlook или процедуры Application_Startup.
Так же рекомендовал бы записать хотя бы MsgBox внутри кода и функции, чтобы точно понять доходит ли до вызова в принципе. Что-то вроде:
Код
Private Sub inboxItems_ItemAdd(ByVal Item As Object) 
Dim objApp As Outlook.Application
Dim objItem As Object ' MailItem
Set objApp = Application
Set objItem = objApp.ActiveExplorer.Selection.Item(1)
 
'macro name you want to run goes here
Msgbox "Call test"
test
Msgbox "Call SaveAttach"
SaveAttach objItem

End Sub
да и вообще не мешало бы убедиться, что objItem - объект письма, а не что-то еще.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Павел П написал: Код... стоит в ThisOutlookSession
Заголовок ветки:
Цитата
Вопросы по Microsoft Excel
Какая связь темы с Excel?
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Если там же, где сам макрос test создать указанную мной функцию - будет ли тогда вызываться? Или будет ошибка?
в это и суть, не могу создать функцию в макросе, я пишу например:

sub test()
тут целиком Ваша функция
end sub

ошибка при запуске - Expected End Sub. не могу понять, что есть функция и как она работает...

Цитата
Дмитрий(The_Prist) Щербаков написал:
У Вас в том виде, который приложили в последнем письме макрос test вызывается? Что в нем написано?
ничего, это для примера. у меня есть макросы вызывающие темлейты аутлука. когда я тестировал макрос до написания Вами функции я писал просто название макроса и при каждом получении письма срабатывал макрос вызова шаблона => мой код работает. Далее Вы написали функцию для сохранения письма в папку и я не могу понять как заставить ее работать :)  
 
Цитата
vikttur написал:
Какая связь темы с Excel?
нету ветки для Outlook
 
Железная логика!
А в сети нет специализорованных форумов?
 
Цитата
vikttur написал:
А в сети нет специализорованных форумов?
я не нашел. нормальный и живой форум, где правда помогают и оперативно отвечают - это этот форум.
Страницы: 1
Наверх