Есть ежедневный отчет в виде файлов Эксель , который падает в яндекс-почту, ну или в Outlook на компе завязанный на Яндекс-почту. Эти файлы приходится вручную перетаскивать в папку на компе или в облаке , чтобы Power BI тоже ежедневно забирал их оттуда и обновлял свои дэшборды.
Кто знает, как сделать так, чтобы эти Эксель файлы приходящие в аутлук сразу при получении автоматом падали в специальную папку на компе ? Чтобы не перетаскивать их вручную?
Отчеты всегда приходят с одного адреса test@test.ru Приходят раз в сутки. Аутлук всегда открыт на компе.
Помогите пожалуйста допились код, чтобы файлы автоматом падали в папку при получении от адресата с адресом test@test.ru
Всем доброго времени суток!
Есть ежедневный отчет в виде файлов Эксель , который падает в яндекс-почту, ну или в Outlook на компе завязанный на Яндекс-почту. Эти файлы приходится вручную перетаскивать в папку на компе или в облаке , чтобы Power BI тоже ежедневно забирал их оттуда и обновлял свои дэшборды.
Кто знает, как сделать так, чтобы эти Эксель файлы приходящие в аутлук сразу при получении автоматом падали в специальную папку на компе ? Чтобы не перетаскивать их вручную?
Отчеты всегда приходят с одного адреса test@test.ru Приходят раз в сутки. Аутлук всегда открыт на компе.
Я.Создайте правило на обработку писем в аутлуке и в нем сохраняйте вложения в нужные папки.
Так можно только сохранять письма полученные от test@test.ru в папку в самом аутлуке. Сохранять именно вложения из писем полученных от test@test.ru и именно в папку НА компе типа c:/user/test не получится.
Я.Создайте правило на обработку писем в аутлуке и в нем сохраняйте вложения в нужные папки.
Так можно только сохранять письма полученные от test@test.ru в папку в самом аутлуке. Сохранять именно вложения из писем полученных от test@test.ru и именно в папку НА компе типа c:/user/test не получится.t330
Скомпоновал код для записи экселевских файлов из писем , которые приходят на АККАУНТ name@name.ru от отправителя c адресом info@test.ru и падают в аутлуке в папку под номером 11
Вроде всё верно, но почему-то выскакивает вот такое сообщение. Подскажите пожалуйста что не так?
[vba]
Код
Option Explicit
Public Sub saveAttachtoDisk() 'объявляем процедуру записи вложений писем в папку на компьютере. Const myFolder As String = "C:\Test\" ' в константу MyFolder пишем путь куда сохранять вложения из писем,при этом название конечной папки info@test.ru совпадает с адресом отправителя
Dim myItem As Outlook.MailItem Dim oFolder As Outlook.Folder Dim Account As Outlook.NameSpace
Dim a As Integer ' вспомогательная переменная для разных нужд Dim i As Integer ' вспомогательная переменная для разных нужд Dim f As Integer 'вспомогательная переменная для разных нужд
Dim SenderMail As String 'переменная для обозначения имени отправителя из писем которого мы будем вытаскиваеть вложения и записывать из в папку на компьютере Dim Savefolder As String ' переменная для записи пути к папке , куда скидываем наши вложения из аутлука Dim AccountName As String ' переменная для записи имени Учетной записи в аутлуке, где мы ищем наши письма с вложениями
SenderMail = "info@test.ru" ' от этого отправителя нужно сохранять файлы AccountName = "name@name.ru" ' в этой учетной записи будем просматривать папки
If Dir(myFolder & SenderMail, vbDirectory) = "" Then ' проверяем , если на компе каталог MkDir myFolder & SenderMail ' и если папки info@test.ru нет, то создаем её в каталоге C:\Test\ End If Savefolder = myFolder & SenderMail ' записываем в переменную путь к нашей целевой папке на компьютере ( C:\Test\ info@test.ru )
'Debug.Print savefolder
Set Account = Application.GetNamespace("MAPI") ' получаем доступ к учетным записям в аутлук 'Set inboxFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) ' получаем коллекцию писем в папке Входящие (включая подпапки) в аутлук
For f = 1 To Account.Folders.Count ' пробегаем циклом по всем учетным записям в аутлуке If Account.Folders(f).Name = AccountName Then ' если имя учетной записи равно AccountName , то Set oFolder = Account.Folders(f).Folders(11) ' получаем коллекцию писем в учетной записи AccountName в папке номер 11
For i = 1 To oFolder.Items.Count ' пробегаем циклом по каждому элементу в папке oFolder If oFolder.Items(i).Class = olMail Then ' если элемент в папке oFolder - это письмо, то Set myItem = oFolder.Items.Item(i) ' присваиваем переменной myItem это письмо If myItem.SenderEmailAddress = SenderMail Then ' если в этом письме адрес отправителя равен SenderMail , то
For a = 1 To myItem.Attachments.Count If myItem.Attachments.Item(a).FileName Like "*.xl*" Then myItem.Attachments.Item(a).SaveAsFile Savefolder End If Next
End If End If Next i End If Next f
End Sub
[/vba]
[img][/img]
Скомпоновал код для записи экселевских файлов из писем , которые приходят на АККАУНТ name@name.ru от отправителя c адресом info@test.ru и падают в аутлуке в папку под номером 11
Вроде всё верно, но почему-то выскакивает вот такое сообщение. Подскажите пожалуйста что не так?
[vba]
Код
Option Explicit
Public Sub saveAttachtoDisk() 'объявляем процедуру записи вложений писем в папку на компьютере. Const myFolder As String = "C:\Test\" ' в константу MyFolder пишем путь куда сохранять вложения из писем,при этом название конечной папки info@test.ru совпадает с адресом отправителя
Dim myItem As Outlook.MailItem Dim oFolder As Outlook.Folder Dim Account As Outlook.NameSpace
Dim a As Integer ' вспомогательная переменная для разных нужд Dim i As Integer ' вспомогательная переменная для разных нужд Dim f As Integer 'вспомогательная переменная для разных нужд
Dim SenderMail As String 'переменная для обозначения имени отправителя из писем которого мы будем вытаскиваеть вложения и записывать из в папку на компьютере Dim Savefolder As String ' переменная для записи пути к папке , куда скидываем наши вложения из аутлука Dim AccountName As String ' переменная для записи имени Учетной записи в аутлуке, где мы ищем наши письма с вложениями
SenderMail = "info@test.ru" ' от этого отправителя нужно сохранять файлы AccountName = "name@name.ru" ' в этой учетной записи будем просматривать папки
If Dir(myFolder & SenderMail, vbDirectory) = "" Then ' проверяем , если на компе каталог MkDir myFolder & SenderMail ' и если папки info@test.ru нет, то создаем её в каталоге C:\Test\ End If Savefolder = myFolder & SenderMail ' записываем в переменную путь к нашей целевой папке на компьютере ( C:\Test\ info@test.ru )
'Debug.Print savefolder
Set Account = Application.GetNamespace("MAPI") ' получаем доступ к учетным записям в аутлук 'Set inboxFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) ' получаем коллекцию писем в папке Входящие (включая подпапки) в аутлук
For f = 1 To Account.Folders.Count ' пробегаем циклом по всем учетным записям в аутлуке If Account.Folders(f).Name = AccountName Then ' если имя учетной записи равно AccountName , то Set oFolder = Account.Folders(f).Folders(11) ' получаем коллекцию писем в учетной записи AccountName в папке номер 11
For i = 1 To oFolder.Items.Count ' пробегаем циклом по каждому элементу в папке oFolder If oFolder.Items(i).Class = olMail Then ' если элемент в папке oFolder - это письмо, то Set myItem = oFolder.Items.Item(i) ' присваиваем переменной myItem это письмо If myItem.SenderEmailAddress = SenderMail Then ' если в этом письме адрес отправителя равен SenderMail , то
For a = 1 To myItem.Attachments.Count If myItem.Attachments.Item(a).FileName Like "*.xl*" Then myItem.Attachments.Item(a).SaveAsFile Savefolder End If Next
Savefolder = myFolder & SenderMail ' Это папка а не путь к файлу myItem.Attachments.Item(a).SaveAsFile Savefolder ' Так должно быть myItem.Attachments.Item(a).SaveAsFile Savefolder & "/file.xlsx"
[/vba] У Вас имя файла не правильно указано
[vba]
Код
Savefolder = myFolder & SenderMail ' Это папка а не путь к файлу myItem.Attachments.Item(a).SaveAsFile Savefolder ' Так должно быть myItem.Attachments.Item(a).SaveAsFile Savefolder & "/file.xlsx"
Назначьте на правило получение почты скрипт RuleSave
[vba]
Код
Sub RuleSave(msg As MailItem) Dim fileName As String, Savefolder As String Const myFolder As String = "C:\Test\" Const SenderMail As String = "info@test.ru" ' от этого отправителя нужно сохранять файлы If msg.Sender <> SenderMail Then Exit Sub Savefolder = GetFolder(myFolder, SenderMail) For a = 1 To msg.Attachments.Count If msg.Attachments.Item(a).fileName Like "*.xl*" Then myItem.Attachments.Item(a).SaveAsFile SaveFile(Savefolder, msg.Attachments.Item(a).fileName) End If Next
End Sub Function SaveFile(ByVal SavePath As String, fileName As String) As String ' Чтобы файлы не затирались Set FSO = CreateObject("Scripting.FileSystemObject") SavePath = FSO.GetParentFolderName(SavePath) Dim fileNameWithOutExt As String fileNameWithOutExt = FSO.GetBaseName(fileName) Dim fileExtension As String fileExtension = FSO.GetExtensionName(fileName) Dim tempCount As Integer Do While FSO.FileExists(FSO.BuildPath(SavePath, fileName)) tempCount = tempCount + 1 fileName = fileNameWithOutExt & "[" & tempCount & "]" & fileExtension Loop SaveFile = FSO.BuildPath(SavePath, fileName) Set FSO = Nothing End Function Function GetFolder(Root, folder) As String Dim folder As String With CreateObject("Scripting.FileSystemObject") folder = .BuildPath(Root, folder) If Not .FolderExists(folder) Then .CreateFolder folder End If End With GetFolder = folder End Function
[/vba]
Назначьте на правило получение почты скрипт RuleSave
[vba]
Код
Sub RuleSave(msg As MailItem) Dim fileName As String, Savefolder As String Const myFolder As String = "C:\Test\" Const SenderMail As String = "info@test.ru" ' от этого отправителя нужно сохранять файлы If msg.Sender <> SenderMail Then Exit Sub Savefolder = GetFolder(myFolder, SenderMail) For a = 1 To msg.Attachments.Count If msg.Attachments.Item(a).fileName Like "*.xl*" Then myItem.Attachments.Item(a).SaveAsFile SaveFile(Savefolder, msg.Attachments.Item(a).fileName) End If Next
End Sub Function SaveFile(ByVal SavePath As String, fileName As String) As String ' Чтобы файлы не затирались Set FSO = CreateObject("Scripting.FileSystemObject") SavePath = FSO.GetParentFolderName(SavePath) Dim fileNameWithOutExt As String fileNameWithOutExt = FSO.GetBaseName(fileName) Dim fileExtension As String fileExtension = FSO.GetExtensionName(fileName) Dim tempCount As Integer Do While FSO.FileExists(FSO.BuildPath(SavePath, fileName)) tempCount = tempCount + 1 fileName = fileNameWithOutExt & "[" & tempCount & "]" & fileExtension Loop SaveFile = FSO.BuildPath(SavePath, fileName) Set FSO = Nothing End Function Function GetFolder(Root, folder) As String Dim folder As String With CreateObject("Scripting.FileSystemObject") folder = .BuildPath(Root, folder) If Not .FolderExists(folder) Then .CreateFolder folder End If End With GetFolder = folder End Function
Назначьте на правило получение почты скрипт RuleSave
У меня Аутлук 2019, поэтому долго не мог понять о каких скриптах вы говорите.
Наконец нагуглил. https://u.to/dUj6Fw Внес в реестр изменения, чтобы эта функция создания правил со скриптами-таки появилась.
Создал правило со скриптом Я так понял скрипт будет срабатывать только для новых сообщений от info@test.ru ?
А чтобы скачать старые сообщения в папку на c:\test\ , нужно один раз использовать мой код выше или при установке вашего правила со скриптом можно как-то заставить сработать его и для всех прошлых сообщений?
Назначьте на правило получение почты скрипт RuleSave
У меня Аутлук 2019, поэтому долго не мог понять о каких скриптах вы говорите.
Наконец нагуглил. https://u.to/dUj6Fw Внес в реестр изменения, чтобы эта функция создания правил со скриптами-таки появилась.
Создал правило со скриптом Я так понял скрипт будет срабатывать только для новых сообщений от info@test.ru ?
А чтобы скачать старые сообщения в папку на c:\test\ , нужно один раз использовать мой код выше или при установке вашего правила со скриптом можно как-то заставить сработать его и для всех прошлых сообщений?
В списке макросов не будет, есть параметр для вызова процедуры. Попробуйте проект сохранить, закрыть аутлук, потом открыть.Должно появиться
Спасибо,с этим уже разобрался (отредактировал сообщения выше) ...
Могли бы еще ответить на вот этот вопрос из видео https://radikal.ru/video/YuyaMiDhrPy ? На видео пытаюсь применить правило из скрипта для всех прошлых писем, но он не срабатывает.
В списке макросов не будет, есть параметр для вызова процедуры. Попробуйте проект сохранить, закрыть аутлук, потом открыть.Должно появиться
Спасибо,с этим уже разобрался (отредактировал сообщения выше) ...
Могли бы еще ответить на вот этот вопрос из видео https://radikal.ru/video/YuyaMiDhrPy ? На видео пытаюсь применить правило из скрипта для всех прошлых писем, но он не срабатывает.t330
Сообщение отредактировал t330 - Четверг, 02.04.2020, 14:46
В фрагмент Вашего кода вставил вызов процедуры[vba]
Код
For i = 1 To oFolder.Items.Count ' пробегаем циклом по каждому элементу в папке oFolder If oFolder.Items(i).Class = olMail Then ' если элемент в папке oFolder - это письмо, то Set myItem = oFolder.Items.Item(i) ' присваиваем переменной myItem это письмо CopyRule myItem '' Эта вставка End If Next i
[/vba]
В фрагмент Вашего кода вставил вызов процедуры[vba]
Код
For i = 1 To oFolder.Items.Count ' пробегаем циклом по каждому элементу в папке oFolder If oFolder.Items(i).Class = olMail Then ' если элемент в папке oFolder - это письмо, то Set myItem = oFolder.Items.Item(i) ' присваиваем переменной myItem это письмо CopyRule myItem '' Эта вставка End If Next i
Может вы имеете ввиду не CopyRule а RuleSave вставить?
[vba]
Код
For i = 1 To oFolder.Items.Count ' пробегаем циклом по каждому элементу в папке oFolder If oFolder.Items(i).Class = olMail Then ' если элемент в папке oFolder - это письмо, то Set myItem = oFolder.Items.Item(i) ' присваиваем переменной myItem это письмо RuleSave myItem '' Эта вставка End If Next i
Может вы имеете ввиду не CopyRule а RuleSave вставить?
[vba]
Код
For i = 1 To oFolder.Items.Count ' пробегаем циклом по каждому элементу в папке oFolder If oFolder.Items(i).Class = olMail Then ' если элемент в папке oFolder - это письмо, то Set myItem = oFolder.Items.Item(i) ' присваиваем переменной myItem это письмо RuleSave myItem '' Эта вставка End If Next i
В общем, мне так и не удалось использовать процедуру не затирания файлов RuleSave При вставке этого скрипта http://www.excelworld.ru/forum/10-44512-294115-16-1585813610 в правила и при установке флажка применить ко всем письмам ничего не происходит...
Попытался вставить в свой код в параметры процедуры строку ( myItem as MailItem) (то есть получилось вот так: Public Sub saveAttachtoDisk( myItem as MailItem) ) ,чтобы можно было этот скрипт выбирать для создания правила. Скрипт saveAttachtoDisk выбирать возможность появилась , но он также не работает как и RuleSave...
Хотя без этого параметра Public Sub saveAttachtoDisk() отрабатывает отлично и копирует все файлы в папку на комп , причем от нужно учетной записи и от нужного отправителя... Жаль, что приходится запускать вручную а не через правило.
[vba]
Код
Option Explicit
Public Sub saveAttachtoDisk( myItem as MailItem) 'объявляем процедуру записи вложений писем в папку на компьютере. Const myFolder As String = "D:\YandexDisk\YandexDisk\" ' в константу MyFolder пишем путь куда сохранять вложения из писем,при этом название конечной папки info@realtycalendar.ru совпадает с адресом отправителя
Dim myItem As Outlook.MailItem Dim oFolder As Outlook.folder Dim Account As Outlook.NameSpace
Dim a As Integer ' вспомогательная переменная для разных нужд Dim i As Integer ' вспомогательная переменная для разных нужд Dim f As Integer 'вспомогательная переменная для разных нужд
Dim SenderMail As String 'переменная для обозначения имени отправителя из писем которого мы будем вытаскиваеть вложения и записывать из в папку на компьютере Dim Savefolder As String ' переменная для записи пути к папке , куда скидываем наши вложения из аутлука Dim AccountName As String ' переменная для записи имени Учетной записи в аутлуке, где мы ищем наши письма с вложениями
SenderMail = "info@realtycalendar.ru" ' от этого отправителя нужно сохранять файлы в папке D:\YandexDisk\YandexDisk\info@realtycalendar.ru AccountName = "sport11b@ya.ru" ' в этой учетной записи будем просматривать папки
If Dir(myFolder & SenderMail, vbDirectory) = "" Then ' проверяем , если на компе в каталоге D:\YandexDisk\YandexDisk\ папка info@realtycalendar.ru MkDir myFolder & SenderMail ' и если папки info@realtycalendar.ru нет, то создаем её End If Savefolder = myFolder & SenderMail ' записываем в переменную путь к нашей целевой папке на компьютере ( D:\YandexDisk\YandexDisk\ папка info@realtycalendar.ru )
'Debug.Print savefolder
Set Account = Application.GetNamespace("MAPI") ' получаем доступ к учетным записям в аутлук 'Set inboxFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) ' получаем коллекцию писем в папке Входящие (включая подпапки) в аутлук
For f = 1 To Account.Folders.Count ' пробегаем циклом по всем учетным записям в аутлуке If Account.Folders(f).Name = AccountName Then ' если имя учетной записи равно AccountName , то Set oFolder = Account.Folders(f).Folders(11) ' получаем коллекцию писем в учетной записи AccountName в папке номер 11
For i = 1 To oFolder.Items.Count ' пробегаем циклом по каждому элементу в папке oFolder If oFolder.Items(i).Class = olMail Then ' если элемент в папке oFolder - это письмо, то Set myItem = oFolder.Items.Item(i) ' присваиваем переменной myItem это письмо
If myItem.SenderEmailAddress = SenderMail Then ' если в этом письме адрес отправителя равен SenderMail , то
For a = 1 To myItem.Attachments.Count If myItem.Attachments.Item(a).fileName Like "*.xl*" Then myItem.Attachments.Item(a).SaveAsFile Savefolder & "/" & myItem.Attachments.Item(a).fileName End If Next
End If End If Next i End If Next f
End Sub
'Процедура показывает все учетные записи и все папки в них Sub Учетки_и_папки()
Dim x, xx Dim oNspace As Outlook.NameSpace Set oNspace = Application.GetNamespace("MAPI") For x = 1 To oNspace.Folders.Count Debug.Print oNspace.Folders(x).Name & " ==> " & x For xx = 1 To oNspace.Folders(x).Folders.Count Debug.Print vbTab & oNspace.Folders(x).Folders(xx).Name & " ==> " & xx Next Debug.Print "============== " Next End Sub
[/vba]
В общем, мне так и не удалось использовать процедуру не затирания файлов RuleSave При вставке этого скрипта http://www.excelworld.ru/forum/10-44512-294115-16-1585813610 в правила и при установке флажка применить ко всем письмам ничего не происходит...
Попытался вставить в свой код в параметры процедуры строку ( myItem as MailItem) (то есть получилось вот так: Public Sub saveAttachtoDisk( myItem as MailItem) ) ,чтобы можно было этот скрипт выбирать для создания правила. Скрипт saveAttachtoDisk выбирать возможность появилась , но он также не работает как и RuleSave...
Хотя без этого параметра Public Sub saveAttachtoDisk() отрабатывает отлично и копирует все файлы в папку на комп , причем от нужно учетной записи и от нужного отправителя... Жаль, что приходится запускать вручную а не через правило.
[vba]
Код
Option Explicit
Public Sub saveAttachtoDisk( myItem as MailItem) 'объявляем процедуру записи вложений писем в папку на компьютере. Const myFolder As String = "D:\YandexDisk\YandexDisk\" ' в константу MyFolder пишем путь куда сохранять вложения из писем,при этом название конечной папки info@realtycalendar.ru совпадает с адресом отправителя
Dim myItem As Outlook.MailItem Dim oFolder As Outlook.folder Dim Account As Outlook.NameSpace
Dim a As Integer ' вспомогательная переменная для разных нужд Dim i As Integer ' вспомогательная переменная для разных нужд Dim f As Integer 'вспомогательная переменная для разных нужд
Dim SenderMail As String 'переменная для обозначения имени отправителя из писем которого мы будем вытаскиваеть вложения и записывать из в папку на компьютере Dim Savefolder As String ' переменная для записи пути к папке , куда скидываем наши вложения из аутлука Dim AccountName As String ' переменная для записи имени Учетной записи в аутлуке, где мы ищем наши письма с вложениями
SenderMail = "info@realtycalendar.ru" ' от этого отправителя нужно сохранять файлы в папке D:\YandexDisk\YandexDisk\info@realtycalendar.ru AccountName = "sport11b@ya.ru" ' в этой учетной записи будем просматривать папки
If Dir(myFolder & SenderMail, vbDirectory) = "" Then ' проверяем , если на компе в каталоге D:\YandexDisk\YandexDisk\ папка info@realtycalendar.ru MkDir myFolder & SenderMail ' и если папки info@realtycalendar.ru нет, то создаем её End If Savefolder = myFolder & SenderMail ' записываем в переменную путь к нашей целевой папке на компьютере ( D:\YandexDisk\YandexDisk\ папка info@realtycalendar.ru )
'Debug.Print savefolder
Set Account = Application.GetNamespace("MAPI") ' получаем доступ к учетным записям в аутлук 'Set inboxFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) ' получаем коллекцию писем в папке Входящие (включая подпапки) в аутлук
For f = 1 To Account.Folders.Count ' пробегаем циклом по всем учетным записям в аутлуке If Account.Folders(f).Name = AccountName Then ' если имя учетной записи равно AccountName , то Set oFolder = Account.Folders(f).Folders(11) ' получаем коллекцию писем в учетной записи AccountName в папке номер 11
For i = 1 To oFolder.Items.Count ' пробегаем циклом по каждому элементу в папке oFolder If oFolder.Items(i).Class = olMail Then ' если элемент в папке oFolder - это письмо, то Set myItem = oFolder.Items.Item(i) ' присваиваем переменной myItem это письмо
If myItem.SenderEmailAddress = SenderMail Then ' если в этом письме адрес отправителя равен SenderMail , то
For a = 1 To myItem.Attachments.Count If myItem.Attachments.Item(a).fileName Like "*.xl*" Then myItem.Attachments.Item(a).SaveAsFile Savefolder & "/" & myItem.Attachments.Item(a).fileName End If Next
End If End If Next i End If Next f
End Sub
'Процедура показывает все учетные записи и все папки в них Sub Учетки_и_папки()
Dim x, xx Dim oNspace As Outlook.NameSpace Set oNspace = Application.GetNamespace("MAPI") For x = 1 To oNspace.Folders.Count Debug.Print oNspace.Folders(x).Name & " ==> " & x For xx = 1 To oNspace.Folders(x).Folders.Count Debug.Print vbTab & oNspace.Folders(x).Folders(xx).Name & " ==> " & xx Next Debug.Print "============== " Next End Sub