Страницы: 1 2 След.
RSS
Сохранение вложений из определенной папки почты Outlook на диск, подправить код
 
Коллеги всех приветствую!
Прошу помочь кто знает где мне  подправить код Макроса,  мне необходимо чтобы он срабатывал так, чтобы файлы с вложением сохранялись только с определенной папки, письма  присылает один  пользователь(правила в почте настроено соответственно),  подскажите где мне необходимо изменить пжл.

Есть еще один макрос тоже сохраняет абсолютно все вложения, он очень массивный, немного не смог его разобрать.
http://www.excel-vba.ru/chto-umeet-excel/soxranit-vlozheniya-iz-outlook-v-papku/
Код
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
 
Александр, я Вам полный код написал, который надо вставить после Set oIncMails = oIncoming.Items. Если опираться на статью из ссылки.
Вместо "имя нужной папки" вставляете "Хилебранд".
Ну и свою функцию тоже надо в модуль вставить.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо понял, домой приеду потестирую,далее хочу уже с диска Забирать данные файлы в Power Query думаю никаких трудностей не должно возникнуть.

Спасибо
 
А не подскажите такой Момент, Мне достаточно всего лишь один раз запустить макрос Чтобы он забрал вложенные файлы с папки и далее на след день забрал другой файл новый только , или  это необходимо делать ежедневно? письмо просто мне приходят один раз в день ,  
 
По идее это можно автоматизировать. Есть два варианта: через события/правила в аутлуке (небезопасно, если аутлук не запущен в конкретный момент времени) или через task scheduler, который в определенный момент времени запускает скрипт (файл), который в свою очередь проводит необходимые операции. Может есть еще способы.
Изменено: Все_просто - 25.04.2017 17:51:17
С уважением,
Федор/Все_просто
 
я обычно делал так:
правилом Outlook-а сообщения без прочтения переносились в указанную папку;
код перебирал письма этой папки и отбирал только непрочитанные письма. Просмотренные письма, вложения из которых были сохранены код маркировал как прочитанные.
Тогда можно было запускать код сколько угодно раз и в любые периоды - лишнего не отбиралось.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Да совершенно верно это правильная абсолютно логика, а данный код про что мы говорим не скажите такая логика заложена? или это отдельно прописывается?
 
Надо добавлять. По сути это одно условие:
Код
If oMail.UnRead Then
'вызываем приведенную Вами функцию
    saveAttachtoDisk oMail
    oMail.UnRead = False
    oMail.Save
End if
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Добрый День!

Не подскажите в чем может ошибка вроде все написал как указали. Все подставил вводные свои
 
Переменная хх объявлена?
 
Не подскажите а где мне её необходимо объявить?
 
Обычно это делается в самом начале:
Код
dim xx as long
 
Да это прописал сейчас, но выскочила вот ошибка в конце,
 
Цитата
Александр L написал: Не подскажите
Юра, человек просит не подсказывать :)
 
А указанная функция существует?
 
Эту функцию, прислал The_Prist, а сам макрос  первом письме по ссылке.
 
... и теперь The_Prist будет вместо Вас показывать файл?
Александр L, почему Вы на форуме по Excel картинки показываете, а не пример в Excel?
 
Прислал - хорошо, а в проекте она есть?
 
Под проектом вы что подразумеваете?
 
Цитата
vikttur написал: почему Вы на форуме по Excel картинки показываете, а не пример в Excel?
на картинке это и есть мой пример, я показываю картинкой где именно ошибка.
 
В том файле, где у Вас макрос, указанная функция присутствует?
 
Цитата
Александр 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, нужен пример ВАШЕГО ФАЙЛА, где применили функцию и получаете ошибку.
 
так я в этом файле в коде все и корректирую код Посмотрите.
закрывайте.спасибо за отклик позитивный
 
Как мило... Вы хоть где-то намекнули, что в чужом файле нужно смотреть Ваши правки?
Страницы: 1 2 След.
Читают тему
Наверх