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!