Это учебник, а не прямой ответ на ваш вопрос. Я покрываю все, что вам нужно знать. Я считаю, что вы найдете этот подход более полезным, чем ответ «запустите этот код, и он будет работать». Надеюсь, я все объяснил адекватно. При необходимости возвращайтесь с вопросами.
Вам необходимо сравнить полученное время электронной почты с самой старой требуемой датой. Вы говорите, что намереваетесь ввести самую старую требуемую дату, а также хотите указать последние семь дней. Там может быть альтернатива. Введите следующие команды (кроме комментариев) в вашем непосредственном окне.
? now() The current date and time
? datevalue(now()) The current date
? dateadd("d",-7,now()) Seven days before now
? dateadd("d",-7,datevalue(now())) Seven days ago
? dateadd("ww",-1,datevalue(now())) One week ago
Дает ли вам какое-либо из этих выражений желаемую дату? В DateAdd
«d» и «ww» - это интервалы, где «d» означает дни, а «ww» означает недели. Существуют и другие значения, такие как «w», означающие дни недели. Поэкспериментируйте, если одно из этих выражений дает вам почти то, что вам нужно.
Другие возможности включают установку категории или пользовательского свойства при сохранении вложений.
Если вы еще этого не сделали, откройте Ваша рабочая тетрадь и редактор VBA. Нажмите [Инструменты], затем [Ссылки…]. Находится ли отметка «Библиотека объектов Microsoft Outlook nn.n» в верхней части списка? Примечание. «Nn.n» зависит от используемой версии Office. Если эта библиотека не указана и не отмечена, прокрутите вниз, пока не найдете ее, и щелкните на маленьком окошке, чтобы отметить ее. Это дает вашей книге доступ к элементам данных Outlook, поэтому вам не нужно указывать столько объектов.
Теперь создайте новый модуль и скопируйте в него приведенный ниже код. Если вы запустите макрос Demo()
, вы получите вывод, подобный следующему:
Oldest additions to Inbox
[14/12/2019 18:21:21] [28/12/2019 05:05:00] [08/01/2020 18:37:09] [28/03/2019 16:16:12] [21/03/2019 14:00:08]
[14/06/2018 21:02:34] [03/02/2020 09:29:38] [06/03/2020 17:03:50] [11/03/2020 13:43:33] [12/03/2020 00:07:53]
[13/03/2020 08:46:58] [13/03/2020 17:31:23] [14/03/2020 03:42:53] [14/03/2020 08:07:35] [14/03/2020 08:58:11]
[15/03/2020 19:43:16] [16/03/2020 16:48:40] [16/03/2020 20:39:58] [17/03/2020 11:14:29] [18/03/2020 01:43:37]
Newest additions to Inbox
[18/03/2020 01:43:37] [17/03/2020 11:14:29] [16/03/2020 20:39:58] [16/03/2020 16:48:40] [15/03/2020 19:43:16]
[14/03/2020 08:58:11] [14/03/2020 08:07:35] [14/03/2020 03:42:53] [13/03/2020 17:31:23] [13/03/2020 08:46:58]
[12/03/2020 00:07:53] [11/03/2020 13:43:33] [06/03/2020 17:03:50] [03/02/2020 09:29:38] [14/06/2018 21:02:34]
[21/03/2019 14:00:08] [28/03/2019 16:16:12] [08/01/2020 18:37:09] [28/12/2019 05:05:00] [14/12/2019 18:21:21]
Newest emails in Inbox
[20/03/2020 12:16:47] [20/03/2020 00:00:14] [19/03/2020 17:51:21] [19/03/2020 17:06:38] [19/03/2020 10:19:36]
[18/03/2020 16:21:25] [18/03/2020 01:43:37] [17/03/2020 11:14:29] [16/03/2020 20:39:58] [16/03/2020 16:48:40]
[15/03/2020 19:43:16] [14/03/2020 08:58:11] [14/03/2020 08:07:35] [14/03/2020 03:42:53] [13/03/2020 17:31:23]
[13/03/2020 08:46:58] [12/03/2020 00:07:53] [11/03/2020 13:43:33] [06/03/2020 17:03:50] [03/02/2020 09:29:38]
Oldest emails in Inbox
[14/06/2018 21:02:34] [21/03/2019 14:00:08] [28/03/2019 16:16:12] [14/12/2019 18:21:21] [28/12/2019 05:05:00]
[08/01/2020 18:37:09] [03/02/2020 09:29:38] [06/03/2020 17:03:50] [11/03/2020 13:43:33] [12/03/2020 00:07:53]
[13/03/2020 08:46:58] [13/03/2020 17:31:23] [14/03/2020 03:42:53] [14/03/2020 08:07:35] [14/03/2020 08:58:11]
[15/03/2020 19:43:16] [16/03/2020 16:48:40] [16/03/2020 20:39:58] [17/03/2020 11:14:29] [18/03/2020 01:43:37]
Замечания:
У меня есть Dim OutApp As New Outlook.Application
. «Новый» говорит, что создайте ссылку, а не просто создайте элемент данных для ссылки. Это означает, что мне не нужно GetObject
или CreateObject
. Outlook одновременно допускает только одно вхождение, поэтому мое «Новое» или ваш CreateObject
будут ссылаться на существующее вхождение или создавать новое в случае необходимости. У меня также есть OutApp.Quit
в конце. Это закрывает Outlook независимо от того, был ли он уже открыт. Я не использую Outlook при использовании книг Excel для доступа к Outlook, поэтому хочу, чтобы Outlook был закрыт. Если вам не безразлично, используйте код «Получить» или «Создать», но запись была успешной, чтобы вы знали, требуется ли «Выход».
Я назвал свой элемент данных OutApp
вместо olApp
. Outlook использует префикс «ol» для своих констант, поэтому я избегаю этого префикса, если мое имя совпадает с одним из имен Outlook.
Я использовал Session
вместо GetNamespace("MAPI")
. Это просто разные способы достижения одного и того же эффекта.
ItemsInbox
- это «Коллекция»; что другие языки называют «списком». Коллекция похожа на массив, за исключением того, что вы можете добавлять новые записи перед любыми существующими записями, в середине или после любых существующих записей. Любые существующие записи могут быть удалены.
Outlook добавляет новые электронные письма в конце коллекции. Таким образом, если вы читаете от первого до последнего, первое письмо будет тем, которое было в папке «Входящие» дольше всего. Если вы читаете от последнего к первому, первое электронное письмо будет добавлено в папку «Входящие» последним. Это говорит о том, что вы можете читать с последнего на первое и сначала просматривать самые последние электронные письма, и вы можете остановиться, когда достигнете электронного письма вне допустимого диапазона. Однако, если вы переместите старое письмо из папки «Входящие» в другую папку, а затем вернете его обратно, оно не будет возвращено в прежнее положение; вместо этого он будет добавлен в конец.
В приведенном ниже макросе я сначала перечисляю ReceivedTime из двадцати писем от первого к последнему, затем от последнего к первому. Вы можете заметить, что некоторые не совпадают.
Затем я перечисляю ReceivedTime из двадцати электронных писем после сортировки по ReceivedTime в порядке убывания, затем в порядке возрастания.
Изучите четыре блока даты. В частности, обратите внимание на разные последовательности. Я полагаю, что код за третьим блоком дат будет наиболее подходящим для вас.
Я думаю, что я все рассмотрел, но, как я уже сказал, я вернусь, если возникнут вопросы, и я исправлю все недостатки.
Option Explicit
' Needs reference to "Microsoft Outlook n.nn Object Library"
' where n.nn depends on the version of Outlook you are using.
Sub Demo()
Dim FldrInbox As Outlook.Folder
Dim InxICrnt As Long
Dim InxIMax As Long
Dim ItemsInbox As Outlook.Items
Dim NumOnLine As Long
Dim OutApp As New Outlook.Application
Set FldrInbox = OutApp.Session.Folders("a.j.dallimore@xxxxxxx.com").Folders("Inbox")
Set ItemsInbox = FldrInbox.Items
If ItemsInbox.Count > 20 Then
InxIMax = 20
Else
InxIMax = ItemsInbox.Count
End If
Debug.Print "Oldest additions to Inbox"
NumOnLine = 0
For InxICrnt = 1 To InxIMax
Debug.Print " [" & ItemsInbox(InxICrnt).ReceivedTime & "]";
NumOnLine = NumOnLine + 1
If NumOnLine = 5 Then
Debug.Print
NumOnLine = 0
End If
Next
Debug.Print
Debug.Print "Newest additions to Inbox"
NumOnLine = 0
For InxICrnt = InxIMax To 1 Step -1
Debug.Print " [" & ItemsInbox(InxICrnt).ReceivedTime & "]";
NumOnLine = NumOnLine + 1
If NumOnLine = 5 Then
Debug.Print
NumOnLine = 0
End If
Next
Debug.Print
ItemsInbox.Sort "ReceivedTime", True
Debug.Print "Newest emails in Inbox"
NumOnLine = 0
For InxICrnt = 1 To InxIMax
Debug.Print " [" & ItemsInbox(InxICrnt).ReceivedTime & "]";
NumOnLine = NumOnLine + 1
If NumOnLine = 5 Then
Debug.Print
NumOnLine = 0
End If
Next
Debug.Print
ItemsInbox.Sort "ReceivedTime", False
Debug.Print "Oldest emails in Inbox"
NumOnLine = 0
For InxICrnt = 1 To InxIMax
Debug.Print " [" & ItemsInbox(InxICrnt).ReceivedTime & "]";
NumOnLine = NumOnLine + 1
If NumOnLine = 5 Then
Debug.Print
NumOnLine = 0
End If
Next
Debug.Print
Set ItemsInbox = Nothing
OutApp.Quit
Set OutApp = Nothing
End Sub
Пересмотренное требование
Каждую неделю или около того вы получаете электронное письмо от поставщика, содержащее счет в формате PDF и XLSX. Правило Outlook распознает эту электронную почту и перемещает ее в выделенную папку. Ваша команда не заинтересована в PDF-версии. Рабочая книга XLSX не имеет постоянного имени. Тем не менее, он постоянно содержит лист «Отправлено», который содержит данные, которые будут полезны для вашей команды. В настоящее время вы не будете пытаться обрабатывать эти данные с помощью макроса, но вы хотели бы, чтобы они были объединены в вашу собственную рабочую книгу, чтобы ее можно было легко просмотреть командой. В настоящее время желаемый формат:
Columns B to K of row 4+ of worksheet “Shipped” for week starting 1Mar20
: : : : :
Columns B to K of row 4+ of worksheet “Shipped” for week starting 8Mar20
: : : : :
Columns B to K of row 4+ of worksheet “Shipped” for week starting 15Mar20
: : : : :
Рассмотренные идеи по выполнению требования
Если бы вы спросили несколько месяцев go, я бы предложил связать макрос с правилом с помощью «Run a script». Microsoft решила, что «Запустить скрипт» опасно и больше не доступно по умолчанию. Существует интерактивная справка, которая объясняет, как сделать «Выполнить скрипт» доступной, но я предлагаю вам подождать, пока вы не станете более опытным, прежде чем пытаться это сделать.
Я бы предложил пересмотренный формат для консолидированных данных:
Data from email received 2Mar20 9:10
Entire contents of worksheet “Shipped”
Data from email received 9Mar20 9:30
Entire contents of worksheet “Shipped”
Data from email received 16Mar20 9:20
Entire contents of worksheet “Shipped”
Строки заголовков означают, что нет никакой путаницы относительно того, где заканчиваются данные за одну неделю и начинается другая. Включение строк заголовка из таблицы и всех столбцов означает, что, если они добавят еще один столбец, он все равно будет включен в консолидацию, и вы получите предупреждение, если они изменят последовательность.
Макрос необязательно должен быть в той же книге, что и данные. Я обычно держу макрос и данные отдельно для этого типа задачи. Данные регулярно обновляются, но макрос обновляется только изредка. Например, я загружаю свои банковские выписки каждый месяц и объединяю их в непрерывный отчет за несколько лет. Я изменяю макрос только тогда, когда они меняют формат загрузки.
Вам не нужен код, который распознает электронную почту, например, путем тестирования свойства UnRead, потому что интересующая электронная почта будет последней в выделенном папки. Существует вероятность, что вы вызовете макрос до того, как придет новое письмо, поэтому макрос просматривает электронное письмо на прошлой неделе. Если он проверит последний заголовок в консолидированной рабочей таблице, он узнает, что у него старая книга и может выйти без внесения изменений.
Следующее мое предложение. Не беспокойтесь, если вы не знаете, как реализовать некоторые из моих идей, потому что я знаю, как это сделать.
У вас есть две рабочие книги с такими именами, как «Макросы консолидации V02.xlsm» и «Консолидированные данные V25.xlsx» , Всякий раз, когда поступает новый счет, вы открываете последнюю книгу макросов консолидации и запускаете макрос консолидации. Макросы можно запускать автоматически при открытии рабочей книги, но я рекомендую на время оставить это. Макрос открывает последнюю книгу данных и отмечает дату самого последнего добавления. Он получает доступ к Outlook, находит последнюю электронную почту счета-фактуры и сверяет ее дату с датой самого последнего добавления. Если дата последнего сообщения электронной почты о счете позже, чем последнее добавление, макрос завершается. Если дата удовлетворительная, макрос находит вложение XLSX и сохраняет его в dis c. Он открывает эту рабочую книгу, проверяет рабочую таблицу «Отправлено» и добавляет ее содержимое в конец рабочей таблицы «Отправлено» в самой последней таблице консолидированных данных и сохраняет рабочую книгу со следующим номером версии.
Вы заметите, что у меня есть номер версии для каждой книги. Во время моей работы я видел слишком много бедствий, потому что люди не сохраняли новую версию, когда обновляли файл. Я могу сбросить номера версий, если вы не хотите их.
Считаете ли вы, что выше соответствует вашим требованиям?