Коллеги всех приветствую! Прошу помочь кто знает где мне подправить код Макроса, мне необходимо чтобы он срабатывал так, чтобы файлы с вложением сохранялись только с определенной папки, письма присылает один пользователь(правила в почте настроено соответственно), подскажите где мне необходимо изменить пжл.
Public Sub saveAttachtoDisk(itm As Outlook.MailItem)Dim objAtt As Outlook.Attachment
Dim saveFolder As String
dateOfMailItem = Format(itm.CreationTime, "yyyy.mm.dd.hhnnss")
saveFolder = "C:\Temp"
For Each objAtt In itm.Attachments
objAtt.SaveAsFile saveFolder & "\" & dateOfMailItem & "_" & objAtt.FileName
Set objAtt = Nothing
Next
End Sub
А здесь нечего подправлять. У Вас здесь нет основного - подключения к Outlook, к нужной папке, перебора писем и т.д. Вы привели одну лишь незначительную часть - функцию сохранения вложений. При этом замечу - для каждого сообщения будет создана новая папка, судя по коду. Может так и надо - не знаю. Если все сохранять в одну папку - то может возникнуть конфликт одноименных файлов - как раз в приведенной статье этот момент учтен и такие файлы переименовываются(добавляется номер в скобках).
При этом по приведенной ссылке есть полный код макроса(если брать тот, что напрямую в статье, а не во вложении), который делает практически то, что надо. Вот здесь идет подключение к папке Входящие:
Код
'получаем коллекцию писем Входящие(включая подпапки)
Set oIncMails = oIncoming.Items
остается добавить лишь цикл по всем папкам Входящие и найти нужную:
Код
For xx = 1 To oIncMails.Folders.Count
If oIncMails.Folders(xx).Name = "имя нужной папки" Then
'здесь уже перебираем все письма этой папки
For Each oMail In oIncMails.Folders(xx).Items
'вызываем приведенную Вами функцию
saveAttachtoDisk oMail
next
End If
Next
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Правильно ли я понял , мне необходимо после команды ниже прописать Папку "Хилебранд" к примеру она у меня так называется. И цикл будет брать только эту папку и там уже сами вложения сохранять на диск? Или это необходимо указать после этой команды? If oIncMails.Folders(xx).Name
Александр, я Вам полный код написал, который надо вставить после Set oIncMails = oIncoming.Items. Если опираться на статью из ссылки. Вместо "имя нужной папки" вставляете "Хилебранд". Ну и свою функцию тоже надо в модуль вставить.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
А не подскажите такой Момент, Мне достаточно всего лишь один раз запустить макрос Чтобы он забрал вложенные файлы с папки и далее на след день забрал другой файл новый только , или это необходимо делать ежедневно? письмо просто мне приходят один раз в день ,
По идее это можно автоматизировать. Есть два варианта: через события/правила в аутлуке (небезопасно, если аутлук не запущен в конкретный момент времени) или через task scheduler, который в определенный момент времени запускает скрипт (файл), который в свою очередь проводит необходимые операции. Может есть еще способы.
я обычно делал так: правилом Outlook-а сообщения без прочтения переносились в указанную папку; код перебирал письма этой папки и отбирал только непрочитанные письма. Просмотренные письма, вложения из которых были сохранены код маркировал как прочитанные. Тогда можно было запускать код сколько угодно раз и в любые периоды - лишнего не отбиралось.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Александр L написал: показываю картинкой где именно ошибка.
И потом еще 20 картинок покажете... вместо того, что бы один раз показать нормальный пример и сразу получить помощь. Как в картинке поменять чего-нибудь и проверить, как оно работает? Как на картинке посмотреть, есть ли в Вашем файле нужная функция? Правила форума, п.2.3. Вам жаль своего времени на подготовку файла-примера? Не отнимайте время у других.
Я как лучше нагляднее картинки делаю, Если конечно кодом на много удобнее естественно, код будет.
Код
Option Explicit
Sub SaveAttachedItemsFromOutlook()
Dim objOutlApp As Object, oNSpace As Object, oIncoming As Object
Dim oIncMails As Object, oMail As Object, oAtch As Object
Dim IsNotAppRun As Boolean
Dim sFolder As String, s As String
'диалог запроса выбора папки с файлами
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = False Then Exit Sub
sFolder = .SelectedItems(1)
End With
sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
'отключаем обновление экрана, чтобы наши действия не мелькали
Application.ScreenUpdating = False
'подключаемся к Outlook
On Error Resume Next
Set objOutlApp = GetObject(, "outlook.Application")
If objOutlApp Is Nothing Then
Set objOutlApp = CreateObject("outlook.Application")
IsNotAppRun = True
End If
'получаем доступ к папкам почты
Set oNSpace = objOutlApp.GetNamespace("MAPI")
'подключаемся к папке Входящие, почтового ящика по умолчанию
Set oIncoming = oNSpace.GetDefaultFolder(6)
'Удаленные ==> GetDefaultFolder(3)
'Исходящие ==> GetDefaultFolder(4)
'Отправленные ==> GetDefaultFolder(5)
'Входящие ==> GetDefaultFolder(6)
'получаем коллекцию писем Входящие(включая подпапки)
Set oIncMails = oIncoming.Items
'просматриваем каждое письмо
' For Each oMail In oIncMails
' 'просматриваем каждое вложение письма
' For Each oAtch In oMail.Attachments
' 'отбираем только файлы Excel
' If oAtch Like "*.xl*" Then
' s = GetAtchName(sFolder & oAtch)
' oAtch.SaveAsFile s
' End If
' Next
' Next
For xx = 1 To oIncMails.Folders.Count
If oIncMails.Folders(xx).Name = "с работы файлы." Then
'здесь уже перебираем все письма этой папки
For Each oMail In oIncMails.Folders(xx).Items
'вызываем приведенную Вами функцию
saveAttachtoDisk oMail
Next
End If
Next 'Если приложение Outlook было открыта кодом - закрываем
If IsNotAppRun Then
objOutlApp.Quit
End If
'очищаем переменные
Set oIncMails = Nothing
Set oIncoming = Nothing
Set oNSpace = Nothing
Set objOutlApp = Nothing
'возвращаем ранее отключенное обновление экрана
Application.ScreenUpdating = True
End Sub
'---------------------------------------------------------------------------------------
' Procedure : GetShName
' Purpose : Функция получения уникального имени файла
' если файл с именем s уже есть - добавляет номер в скобках
'---------------------------------------------------------------------------------------
Function GetAtchName(ByVal s As String)
Dim s1 As String, s2 As String, sEx As String
Dim lu As Long, lp As Long
s1 = s
lp = InStrRev(s, ".", -1, 1)
If lp Then
sEx = Mid(s, lp)
s1 = Mid(s, 1, lp - 1)
End If
s2 = s
lu = 0
Do While (Dir(s2, 16) <> "")
lu = lu + 1
s2 = s1 & "(" & lu & ")" & sEx
Loop
GetAtchName = s2
End Function
vikttur написал: Если конечно кодом на много удобнее
Помощник создаст файл, копирует туда Ваш макрос, придумает данные... 180 сообщений на форуме - и Вам нужно такое разъяснять?!
ПРАВИЛА
Цитата
2.3. Приложите файл(ы) с примером (общим весом не более 100 Кб) в реальной структуре и форматах данных того, что есть сейчас и того, что хотелось бы на выходе.
Насколько нужно быть непонятливым (или ленивым, чтобы приготовить для форума ФАЙЛ-ПРИМЕР)... Александр L, нужен пример ВАШЕГО ФАЙЛА, где применили функцию и получаете ошибку.