When you use a VBA macro to save messages or files you can hard code the file path, use the user account's My Documents folder, or select a folder on the hard drive. The first two methods are fairly short and sweet.
Note: this function will work in any Office application, it is not specific to Outlook. (Actually, it's not specific to Office either, it's a general VB function.)
Dim strFolderpath as String strFolderpath = "C:\OLAttachments\"
Or use this to save to a folder using the user's profile in the path (example, C:\Users\Diane\)
Dim enviro As String enviro = CStr(Environ("USERPROFILE")) strFolderpath = enviro & "\OLAttachments\"
For more examples, see Using Windows environment variables in Outlook macros
If you want to bring up a folder picker dialog, you need to use a function, such as the one below.
Add the function to your project and call the folderpath using the following format. You can use any valid file path, either a drive letter or network path (\\). If the path is not valid, the folder picker will show all folders (desktop level), as seen in the screenshot.
strFolderpath = BrowseForFolder("C:\Users\username\documents\")
Use this to save the file:
strFile = strFolderpath & "\" & strFile
(The lines above can be used in Save Attachments to the hard drive)
BrowseForFolder Function
Function BrowseForFolder(Optional OpenAt As Variant) As Variant Dim ShellApp As Object Set ShellApp = CreateObject("Shell.Application"). _ BrowseForFolder(0, "Please choose a folder", 0, OpenAt) On Error Resume Next BrowseForFolder = ShellApp.self.Path On Error GoTo 0 Set ShellApp = Nothing Select Case Mid(BrowseForFolder, 2, 1) Case Is = ":" If Left(BrowseForFolder, 1) = ":" Then GoTo Invalid Case Is = "\" If Not Left(BrowseForFolder, 1) = "\" Then GoTo Invalid Case Else GoTo Invalid End Select Exit Function Invalid: BrowseForFolder = False End Function
Save attachments macro using BrowseForFolder
This macro uses BrowseForFolder function when saving email attachments on the selected message. When you use this function, you can browse to or create subfolders but cannot "browse up" to a folder above the preselected root.
Public Sub SaveAttachmentstoFolder() Dim objOL As Outlook.Application Dim objMsg As Outlook.MailItem 'Object Dim objAttachments As Outlook.Attachments Dim i As Long Dim lngCount As Long Dim StrFile As String Dim strPath As String Dim StrFolderPath As String Dim strDeletedFiles As String Dim sFileType As String On Error Resume Next Set objOL = CreateObject("Outlook.Application") Set objMsg = objOL.ActiveExplorer.Selection.Item(1) ' Get the BrowseForFolder function http://slipstick.me/u1a2d StrFolderPath = BrowseForFolder("D:\My Stuff\Email Attachments\") Set objAttachments = objMsg.Attachments lngCount = objAttachments.Count If lngCount > 0 Then For i = lngCount To 1 Step -1 StrFile = objAttachments.Item(i).FileName StrFile = StrFolderPath & "\" & StrFile objAttachments.Item(i).SaveAsFile StrFile Next i End If ExitSub: Set objAttachments = Nothing Set objMsg = Nothing Set objSelection = Nothing Set objOL = Nothing End Sub
To make this macro portable when you use a folder under the user's directory, replace StrFolderPath = BrowseForFolder("D:\My Stuff\Email Attachments\") with the following:
Dim StrUserPath as Variant Dim enviro As String enviro = CStr(Environ("USERPROFILE")) StrUserPath = enviro & "\Documents\Email Attachments\" StrFolderPath = BrowseForFolder(StrUserPath)
Hi Diane,
i'd like to modify the macro to prompt for a folder location on a file as dialog.
Is it possible?
If you want to use the office file pocker from word or excel, I have an example here - https://www.slipstick.com/outlook/hyperlink-templates/#fileopen
it uses objectname.FileDialog(msoFileDialogFolderPicker) - Outlook doesn't have a filedialog of its own, so you need to use word or excel's.
Hello, thank you for the code BrowseForFolder. Do you know if it possible to open a more complete browser (I mean with favorites and also shortcuts)?Thank you.
Yohann
You can use the file open browser (or Save) from word or excel to see all folders.
https://www.slipstick.com/outlook/hyperlink-templates/#fileopen
Thank you.
I seem to have some problem with the function. For some reason it takes the environment variable, opens the select folder window. I select it, then it exits the function and immediately calls the function again. This time, the environment variable is not passed. I tried to figure out why the function is called twice, but not sure. Maybe any ideas?
Are you using the macro code on this page or other code?
Hi Diane,
This code is working great! I want to ask you if the folder picker can let me select shortcut links as well? I have all my important folder shortcuts saved in \Documents\Favourites folder. However, the current folder picker only allows me to select a folder and not further quick navigate to the final folder via my shortcuts. Any suggestions?
Thank you so much.
No, it won't let you select shortlinks. Sorry. You'd need to write a custom picker. It wouldn't be hard, if you only ever wanted to use those links... as you wont be able to select other folders, only the links.
Hi Diane - great work you do here - thanks!
I have BrowseForFolder working perfectly. is there a way to hard code only a handfull of choices, like 4, subfolders from the folder that BrowseForFolder returns? I ask because on my corporate network there are dozens of subfolders in the returned folder but I only use 3 or 4 of them at anytime. The drive is shared by many so I can't move my folder into their own subfolder.
Thanks again!
AFAIK, no, you can only hard code the parent folder.
Ok, thanks.
Hi Diane Poremsky
On Outlook 2013 I'm looking for a specific macro that could change the default path for the Attach File Command Button at Ribbon every time a call a macro .
Can you please post some code that can help me
Thanks!
Your website has help massively with what I'm trying to achieve, I have got my emails saving to my documents but I'm wanting to add to the macro so you can select the folder on a server using a input text box. how would this be done. I'm not clued up on VBA code so any assistance would be greatly appreciated.
You'd use the network path - \\server\path in the link.
Ican't get the Browsefor Folder function to work. The savemsg macro is working as expected and I can make a copy of the desired msg in the "My Documents" folder. How do I incorporate the browseforfolder function? Thanks in advance!