Vba outlook добавить вложение
Last week, we introduced how to send emails with Excel VBA and described the methods and properties of an Outlook MailItem object. One of those methods was .Add via MailItem.Attachments . We didn’t really dive into at what .Attachments actually was, though.
If you remember, the properties we modified were all strings. Strings are very basic in computer science, and they’re easy to manipulate. You can read from and write to them pretty naturally. But the Attachments object is actually a collection, so it’s a little more complicated. We’ve talked about collections before when describing how to remove duplicates from an array.
Basic Code for Adding an Attachment
Here I want to reiterate what was shown in the setup of last week’s post. This snippet just creates the objects we need to start with before we can make a full block of code.
Using early binding so we get Intellisense, our foundation for this tutorial will be this code:
The Attachments Object
As stated above, the Attachments object is not a string. It’s really a Collection, which means it holds other objects. Specifically, it holds Attachment objects.
At first the nomenclature may seem a bit confusing, but you can think of the singular, Attachment, as the actual attachment and the plural, Attachments, as the collection. This is a common naming scheme in VBA to differentiate between singular objects and collections of those objects, so if you come across this singular/plural naming scheme in the future, you will already know the difference!
Navigating through the Attachments collection is somewhat complex, so we will leave that for another time. But if you want to play, you can inspect the collection via the Locals window.
Alternatively, if you prefer keyboard shortcuts, Alt+V > S should open the Locals window. However you open it, a window will appear in the VBE in which you can inspect all the currently instantiated variables. The MailItem object is rather extensive, which is why we will leave that for another time.
Using VBA to Attach Multiple Files to One Email
In last week’s post, we attached a single file and went on our way. If you want to attach multiple files, it’s as simple as using the .Add method for each file that you want to attach.
A common task might be to attach several files you have in a list on a spreadsheet and send them to someone (or someones).
We can iterate through the Files to Send column and attach all of them to a single email. Since we have only the filenames (and file extensions) in our list, we will need to concatenate the path of the folder that contains them.
This code snippet will attach all four files to the same email, assuming all the files reside in the C:\Work Files folder:
Make powerful macros with our free VBA Developer Kit
It’s easy to copy and paste a macro like this, but it’s harder make one on your own. To help you make macros like this, we built a free VBA Developer Kit and wrote the Big Book of Excel VBA Macros full of hundreds of pre-built macros to help you master file I/O, arrays, strings and more - grab your free copy below.
Attaching the Current Spreadsheet to an Email using VBA
Attaching files by name is very easy, but you have to know the full filepath to be able to do it. What if you want to attach the current spreadsheet and you want your code to be portable so you can distribute it to your coworkers and make everyone’s job easier? To make the task interesting as tutorial material, let’s assume everyone stores their spreadsheets in different folders.
Fortunately, we can find the current spreadsheet’s full filepath rather easily.
The .Name and .FullName Properties
These two properties can be accessed from the ActiveWorkbook or ThisWorkbook objects. The latter object (ThisWorkbook) references the workbook in which the code resides while the former references the active workbook, which may be different if your code activates another workbook during execution.
You have to be careful when using the ThisWorkbook object if you’ve packaged your macro in an Excel Add-in. Calling ThisWorkbook from a macro in your add-in will reference the Add-in itself, and not the workbook you’re actively using.
Either way, both objects have both properties. The .FullName property will grab the workbook’s filename and the full filepath, so you can get the whole thing in one shot. .Name will only capture the workbook’s name without the folder.
One reason to use .Name over .FullName might be because you know where the workbook is located on the file system and you want to add it along with several other files, just like we did above. If you used .FullName with the snippet from the previous section (where the filepath was hardcoded and concatenated), you would need to change the code to avoid concatenating the filepath twice. Instead of using an InStrRev VBA macro to extract the file path, it would be easier to just use the spreadsheet’s name.
The .Path Property
You can grab the workbook’s filepath, minus the name, with the .Path property. This could be useful for ensuring any folder paths you’ve already incorporated into your code match the workbook’s path before attaching.
While it is always good practice to implement all these checks, don’t forget about error handling. Someone, somewhere, is inevitably going to break your code, where you end up with nonsense like:
source_file = "C:\Work Files\C:\Work Files\Macros.xlsm"
One good error handling tool is to check if a file exists using the VBA Dir Function before trying to attach the file.
Example: Attaching the Current Workbook
We’ve introduced a lot of properties in this tutorial, but we haven’t given many complete examples. We’re going to change that now!
Here’s a little code that saves and sends the current workbook. Notice the .Save method before any other actions. It is good practice to save the file before sending, since there may be changes the user wants to send. Of course, we cannot micromanage every user (and we don’t want to), so saving it programmatically is a reasonable compromise. You might want to warn your user before this code runs and saves unwanted changes, though.
Summary and Final Example
Combining these concepts to send emails with attachments using Excel VBA
In this tutorial, we looked at how to add multiple attachments to a single email and how to attach the current workbook without knowing its name beforehand. This kind of programmatic discovery is a valuable tool because it makes our code much more robust and adaptable. Anyone can run it from anywhere and get the same desired result.
We also learned a little about the Locals window, which can be extremely helpful for debugging or simply learning more about the objects you’re working with. As we saw with the MailItem object, objects can be complex, which is exactly why we use References instead of writing all the code ourselves.
To end the tutorial, I want to give you a full block of code to use and manipulate for your needs. This powerful macro uses Excel VBA to create the MailItem and Application objects for Outlook, it grabs the email addresses and filepaths of the attachments from an Excel spreadsheet (using the screenshot above), it writes in a subject and short body, and it displays the email.
I hardcoded most variables, but you can do everything programmatically (of course!). Copy and paste the entire macro example or just grab the pieces you need and you’ll be adding attachments to emails using Excel VBA in no time.
I hope you enjoyed this tutorial. When you’re ready to take your VBA to the next level, subscribe using the form below.
Ready to do more with VBA?
We put together a giant PDF with over 300 pre-built macros and we want you to have it for free. Enter your email address below and we'll send you a copy along with our VBA Developer Kit, loaded with VBA tips, tricks and shortcuts.
Before we go, I want to let you know we designed a suite of VBA Cheat Sheets to make it easier for you to write better macros. We included over 200 tips and 140 macro examples so they have everything you need to know to become a better VBA programmer.
This article was written by Cory Sarver, a contributing writer for The VBA Tutorials Blog. Visit him on LinkedIn and his personal page.
Вкладка Office - включите редактирование и просмотр с вкладками в Office и сделайте работу намного проще .
Этот метод поможет вам создать новый шаблон с вложением, а затем применить этот шаблон. Он автоматически прикрепит указанный файл, когда вы примените этот настроенный шаблон в Microsoft Outlook.
Шаг 4. В диалоговом окне "Сохранить как"
- Введите имя нового шаблона в Имя файла: коробка;
- Нажмите Сохранить как тип: поле и выберите Шаблон Outlook в выпадающем меню;
- Нажмите Сохраните кнопку.
Внимание: Шаблон будет автоматически сохранен в Шаблон Outlook папка, если вы выберете Шаблон Outlook из Сохранить как раскрывающийся список типа.
Шаг 6: Откройте диалоговое окно Выбор формы:
- В Outlook 2007 щелкните значок Файл >Новое >Выберите форму.
- В Outlook 2010 и 2013 щелкните значок Новые предметы >Больше элементов >Выберите форму.
Шаг 7: В диалоговом окне Выбор формы:
- Нажмите Заглянуть: поле и выберите Шаблоны пользователей в файловой системе из выпадающего списка;
- Щелкните, чтобы выделить настроенный шаблон в списке шаблонов;
- Нажмите Откройте кнопку.
Шаг 1: нажмите другой + F11 клавиши, чтобы открыть окно Microsoft Visual Basic для приложений.
Шаг 2: нажмите Вставить > Модули.
Шаг 3. Вставьте следующий код в новое окно модуля.
Шаг 4: Измените путь сохранения вложения в коде в соответствии с вашими потребностями.
Например, если файл, который вы хотите прикрепить, называется «Office Tab»И расширение файла«. Docx”, И его путь спасения C: \ Users \ имя пользователя \ Desktop, замените "C: \ Attachment.doc" с участием "C: \ Users \ имя пользователя \ Desktop \ Office Tab.docx"в коде.
Шаг 5: нажмите F5 ключ для запуска этого макроса VBA.
В этой статье рассказывается об отправке электронного письма через Outlook с несколькими вложениями, прикрепленными в Excel.
Удивительный! Использование эффективных вкладок в Excel, таких как Chrome, Firefox и Safari!
Экономьте 50% своего времени и сокращайте тысячи щелчков мышью каждый день!
1. Вставьте командную кнопку, нажав разработчик > Вставить > Командная кнопка (элемент управления ActiveX). Смотрите скриншот:
2. После вставки командной кнопки щелкните ее правой кнопкой мыши и выберите Просмотреть код из контекстного меню.
3. В дебюте Microsoft Visual Basic для приложений окно, пожалуйста, нажмите Инструменты > Рекомендации как показано ниже.
4. в Ссылки - VBAProject диалоговом окне найдите и проверьте Библиотека объектов Microsoft Outlook вариант, а затем щелкните OK кнопку.
5. Затем замените исходный код в окне кода приведенным ниже кодом VBA.
Внимание: укажите получателя, тему и текст вашего электронного письма, изменив вариант в .To = happy.xuebi@163.com , .Subject = "тест" и .HTMLBody = "тест" строк в коде.
6. нажмите другой + Q ключи вместе, чтобы выйти из Microsoft Visual Basic для приложений окно.
7. Нажмите разработчик > Режим проектирования , чтобы выключить режим дизайна. Смотрите скриншот:
Внимание: Код VBA работает только при использовании Outlook в качестве почтовой программы.
Легко отправлять электронную почту через Outlook на основе полей созданного списка рассылки в Excel:
1. Follow as the below screenshot shown to create a mailing list. And fill in the recipient’s email address, the email subject, and the paths of attachments you need to attach in the sending email.
2. Select the whole mailing list you have created just now (here I select range A1:E2), then click Enterprise > Send Emails. See screenshot:
2. In the popping up Send Emails dialog box, please do the following configurations:
A. The To, Attach files and Subject fields will be filled with the selected mailing lists automatically;
B. Compose the email body as you need;
C. Check the Send email via Outlook box;
D. Click the Send button to send the email. See screenshot:
3. Then a Kutools for Excel dialog box pops up to tell you how many emails have been sent. Please click the OK button and close the Send Emails dialog box. See screenshot:
Note: You can go to the Outlook’s Sent Items folder to check for the sending emails.
Tip.If you want to have a free trial of this utility, please go to download the software freely first, and then go to apply the operation according above steps.
Теперь очередь за файлами с адресами и текстом письма. Вот здесь возник нюанс. Как вызвать диалог выбора файла? О жестком прописывании пути я не хочу и думать. Так что приходится что-то придумывать. Многими используемый вариант с Application.GetOpenFilename не пройдет, так как в Outlook нет такого метода. Использовать API пробовал. Вариант с «Private Declare PtrSafe Function GetOpenFileName Lib „comdlg32.dll“…» не сработал (PtrSafe из-за того, что система Win7, х64). Ошибок не выдавал, но при вызове ничего не появлялось. Решения в Интернете не нашел. Если кто подскажет решение – буду благодарен. Таким образом, пришлось пойти в обход с применением объекта Excel.Application.
А теперь и вложения. Тут я использовал динамический массив и возможность множественного выбора диалога.
Каждый раз я создавал и удалял объект fd из-за того, что это сделать проще, чем заниматься его чисткой перед последующим вызовом.
Для получения данных из текстовых файлов пришлось использовать пару дополнительных функций. Вызываются они таким образом:
С целью отладки я вставил такой код
'Контроль за данными
Как видно, он сейчас закомментирован, но позволяет понять где что лежит.
Теперь небольшая по размеру, но самая важная часть – генерация писем.
При желании, метод .Send можно заменить на .Save. Тогда созданные письма окажутся в папке «Черновики».
Здесь полный код модуля «как есть».
В данном примере реализована возможность отправки простых писем. Если необходимо расширить возможности, например сделать текст форматированным, то двигаться следует в направлении Outlook.MailItem > GetInspector > WordEditor. Это, мягко говоря, усложняет код, но позволит использовать в качестве источника текста письма форматированный документ Word.
Можно также добавить обработку «преднамеренного» отсутствия каких-либо составляющих письма. Например, реализовать отправку без темы, текста или вложений. Сейчас отказ от одного из этих элементов приведет к прерыванию процедуры.
Этот код, теоретически, должен работать также и в более ранних версиях Microsoft Office. Поменяется только ссылка на библиотеку Excel.
Привет, Хабр! Я Сергей Чебарев, аналитик в команде визуализации данных «Северсталь-инфокома», и сегодня я расскажу, как можно, используя VBA и приложения Office, автоматизировать рутину в работе. VBA (Visual Basic for Applications) – это упрощенная версия Visual Basic, встроенная в множество продуктов Microsoft Office, и соответственно, эти продукты можно подружить между собой.
Самое очевидное применение VBA (который ещё часто и не вполне корректно называют макросами) – это автоматизация типовых задач с множеством повторяющихся шагов, делать которые руками долго, скучно и чревато ошибкам от усталости. Рассмотрим одну из таких задач.
Создание событий в Outlook через Excel
Итак, у меня есть задача: необходимо создавать события в календаре и отправлять пользователям приглашения с данными для входа на терминальный сервер.
Звучит на первый взгляд не очень сложно, но:
Приглашения нужно отправлять из общего почтового ящика
Тело приглашения должно содержать корпоративный стиль оформления
Есть лимит по количеству пользователей на терминальном сервере в сутки, поэтому необходимо следить за количеством событий
Соответственно, мало просто открыть Outlook с календарем, перед созданием события нужно проверить, не превысит ли лимит на текущий день данное приглашение, задать диапазон времени, перенести тело письма из файла или из предыдущего приглашения. Все это требует выполнения большого числа действий и отнимает заметное количество времени.
Как же упростить эту рутину, используя Excel, Outlook и VBA? Рассказываю
Распишем действия по шагам.
1. Создаем книгу Excel и получаем данные из календаря
В таблице теперь видны все созданные события, но нам необходимо видеть ещё и дни, где пока нет событий. Для этого мы создаем новый запрос и вызываем функцию List.Dates:
Она нам создаст список дней, начиная с сегодняшнего, на 21 день вперед:
Теперь объединим 2 данных запроса в один. Для этого переводим лист с датами в таблицу с помощью инструмента “В таблицу” на вкладке “преобразование” и переходим на запрос, где мы собрали все приглашения из почты, после чего на вкладке “Главная” выбираем инструмент “Добавить запросы”. Выбираем созданную ранее таблицу с датами и объединяем:
*Важно, при объединении столбцы в таблицах должны иметь одинаковые названия.
Создаем дополнительные столбцы «Subject», «Location» и «Статус брони», которые будут нести информацию о теме события, локации события и о том, из какого запроса пришли данные: если из календаря, то «Бронь», если из вызванной функции — «Свободно». Делаем сведение по столбцу «Статус брони» для определения количества свободных окон по дням и присваиваем статус для возможности бронирования. Закрываем PowerQuery и получаем следующую таблицу:
Отлично! Создав столбец “Окон свободно”, мы освободились от подсчета событий и видим возможность бронирования.
2. Создание событий в Outlook
Теперь нам необходимо написать скрипт на VBA для создания событий в Outlook. Для этого переходим во вкладку “Разработчик” в Excel и открываем VisualBasic:
В открывшемся окне выбираем рабочий лист, где находится итоговая таблица по событиям:
Запускать код мы будем, используя двойной клик на строки столбца «Доступность бронирования», и при условии, что статус бронирования «Забронировать»:
Для работы с Outlook мы будем использовать функцию GetObject("Outlook.Application"). GetObject — это функция для приложений VBA. Она используется для прикрепления к запущенным объектам. Более подробно с синтаксисом функции можно ознакомиться в документации Microsoft.
Для соблюдения корпоративного стиля код ищет предыдущее приглашение и копирует из него тело письма. Далее создается новое приглашение, и в него заносится вся необходимая информация.
Протестируем. Открываем файл, ищем строку с датой, которая нас интересует, и двойным кликом на статус бронирования запускаем скрипт:
Приглашение на выбранный нами день с необходимой темой и телом письма успешно создано, осталось только указать получателя
3. Обновление данных
Чтобы при открытии книги происходило обновление данных, сохраним скрипт в саму книгу:
Кроме того, отключим фоновое обновление в свойствах подключения таблицы:
Подведем итоги
Итак, мы упростили создание однотипных событий в календаре, а также точно уверены, что не превысим лимит событий на день. Это позволило нам избавиться от рутинной работы и уменьшило вероятность человеческой ошибки.
Конечно, в идеале можно было доработать нашу платформу обучения и полностью автоматизировать процесс бронирования. Но скрипты VBA тем и хороши, что могут заметно упростить жизнь без разработки и изменения существующих систем. Они пригодятся там, где скрипт пишется за несколько часов, а на полноценную автоматизацию и доработку существующих решений нужны недели или месяцы.
Интересно, что подобные решения могут быть не всегда очевидны. Например, в этой задаче изначально вообще не использовался Excel. Кажется, что раз необходимо создавать события, то нужно использовать только Outlook. Но Excel помогает собирать и обрабатывать данные из разных источников.
Если вам интересны похожие способы избавления от рутины, пишите комментарии, я расскажу о других кейсах в следующих статьях.
Читайте также: