Outlook VBA - moving mail item to public folder using variable within path

Status
Not open for further replies.

aaroncrt

Member
Outlook version
Outlook 2010 32 bit
Email Account
Exchange Server
Hi,

First of all, I am new to VBA so hopefully this will be an easy fix.

I have created a VBA script to move a selected email to a public folder location. The script prompts using an inputbox (in this example it's a project folder "001") and moves the email to the public folder called >Projects>"001 - TEST FOLDER". It uses the inputbox data as the folder location.

It is currently working until the folders reach above 099. All Public Folders are labelled like "001 - Test Folder", "023 - Project Name", "042 - Random" etc.

Is it just a case that I'm using the wrong variable type for the inputbox data?

Any help is appreciated.

Code:
Sub MoveProject() 
 
'Dim objFolder As Outlook.MAPIFolder, objInbox As Outlook.MAPIFolder 
 
Dim objNS As Outlook.NameSpace, objItem As Outlook.MailItem 
 
Dim strProject As String 
 
Dim Proceed As VbMsgBoxResult 
 
Set objNS = Application.GetNamespace("MAPI") 
 
Dim appOutlook As New Outlook.Application 
 
Set nms = appOutlook.GetNamespace("MAPI") 
 
strProject = InputBox("Please enter Project") 
 
' If the public folder location is not \\public folders\ all public folders\projects\001 etc then the below line is required to be changed 
 
' Set objFolder = objNS.Folders("Public Folders").Folders("All Public Folders").Folders("Projects").Folders(strProject) 
 
strFolder = nms.Session.GetDefaultFolder(olPublicFoldersAllPublicFolders).Parent 
 
Set fld = nms.Folders(strFolder).Folders("All Public Folders").Folders("Projects").Folders(strProject)
  
 
For intX = 1 To objNS.Folders.Count 
 
If objNS.Folders.Item(intX).Name = "Public Folders" Then 
 
Exit For 
 
End If 
 
Next 
 
If Application.ActiveExplorer.Selection.Count = 0 Then 
 
'Require that this procedure be called only when a message is Selected 
 
Exit Sub 
 
End If 
 
Set oSelection = Application.ActiveExplorer.Selection 
 
For intX = ActiveExplorer.Selection.Count To 1 Step -1 
 
Set objX = ActiveExplorer.Selection.Item(intX) 
 
If objX.Class = olMail Then
   Proceed = MsgBox("Are you sure you want move the message to the Projects Folder " & strProject & "?", _
   vbYesNo + vbQuestion, "Confirm Move")
   If Proceed = vbYes Then 
 
Set objEmail = objX 
 
objEmail.Move fld
   End If 
 
End If 
 
Next 
 
Set objItem = Nothing 
 
Set objFolder = Nothing 
 
Set objInbox = Nothing 
 
Set objNS = Nothing 
 
End Sub
 

aaroncrt

Member
Outlook version
Outlook 2010 32 bit
Email Account
Exchange Server
it gives me

"Run-time error '440':

Array index out of bounds."

Debug then highlights "Set fld = nms.Folders(strFolder).Folders("All Public Folders").Folders("Backup Notifications").Folders(strProject)"

I was thinking a search might do it, but couldn't work out how to then make the search result into the variable I need.
 

Diane Poremsky

Senior Member
Outlook version
Outlook 2016 32 bit
Email Account
Office 365 Exchange
This code from michael at VBOffice.net - finds folders .

this line returns the folder path:

Set Application.ActiveExplorer.CurrentFolder = m_Folder

you don't want to actually open it, so maybe this will work:

Set fld = m_Folder

And if it doesn't work with public folders... back to the drawing board. (Just checked - it finds PF.)
 

aaroncrt

Member
Outlook version
Outlook 2010 32 bit
Email Account
Exchange Server
Thanks for the response Diane,

That won't work for this instance, as I'm already using an active selection for the email to be transferred. Basically I need to be able to click on an email and run the script, it prompts user which PF to transfer to and moves the email to it. This is to avoid the requirement of expanding the public folders and locating the folder etc to move to.

If there is a way to use the inputbox data as a search string for part of the public folder path, the result could then be used as the variable.

Something similar to the following perhaps? I just don't know enough VB to utilize it correctly.

Code:
Dim FldSub As Outlook.MAPIFolder 
 
For Each FldSub In nms.Folders(strFolder).Folders("All Public Folders").Folders("Projects").Folders
   If Left(FldSub.Name, 3) = strProject Then
 

Diane Poremsky

Senior Member
Outlook version
Outlook 2016 32 bit
Email Account
Office 365 Exchange
I'd try it. It looks like it should work, but so does your other code.
 

aaroncrt

Member
Outlook version
Outlook 2010 32 bit
Email Account
Exchange Server
FYI I got this working by searching the public folders for a match with the input variable.

Code:
ReDim sArray(0) As String 
 
If fld.Folders.Count Then
          
 For i = 1 To fld.Folders.Count
   If Left(fld.Folders(i).Name, 3) = strProject Then
       iElement = IIf(sArray(0) = "", 0, UBound(sArray) + 1)
       ReDim Preserve sArray(iElement) As String
       sArray(iElement) = fld.Folders(i).Name
   End If
 Next i
 
Status
Not open for further replies.
Top