Excellent, we like progress...

Adding more PST files just involves doing loop in the App_satrtup routine fro each one. so if I have two PST files with Outlook folder names:
"Personal Folders"
and
"Personal Folders 2"
I'd have two loops[VBA]For Each f In ns.Folders.Item("Personal Folders").Folders
Set objFolderItems = New cItems
objFolderItems.Init f.Items
colFolderItems.Add objFolderItems
Next f

For Each f In ns.Folders.Item("Personal Folders 2").Folders
Set objFolderItems = New cItems
objFolderItems.Init f.Items
colFolderItems.Add objFolderItems
Next f[/VBA]Now about these other options...

I don't want to overcomplicate things, but input boxes are going to be a pain in the a$$. First, you have to type and nobody likes to do that if they don't need to. Second, you have to type accurately, or it won't do anything.

I would suggest a userform would be a better approach. It can contain options for the On/Offshore and the type (invoice, communication, etc).
And you also want the option to cancel it for attachments you don't want to save.
Now, I did say it might get complicated, for which I apologise in advance, but we should be able to work through it, so here goes...

The class code still needs to loop through each attachment in the mail item, but instead of doing the save here, we can call a userform, pass it a reference to the attachment and let the form do the rest.
So now that class routine looks like this[VBA]Private Sub folderitems_ItemAdd(ByVal Item As Object)
Dim a As Attachment

For Each a In Item.Attachments
UserForm1.AttachedFile = a
UserForm1.Show
Next a
End Sub[/VBA]Now I realise that a userform doesn't normally have an "AttachedFile" property, but a userform is just another class module that behaves in a certain way, so we can write our own property, so the top of my userform code looks like this[VBA]'module level variable for the attchment
Private myAttachment As Attachment

Property Let AttachedFile(a As Attachment)
'this property is passed for each attachment from
'the calling class cItems so we have a reference
'to each attachment the form is dealing with
Set myAttachment = a
'I have a label "lblAttName" to display the
'file we're currently working with
lblAttName.Caption = myAttachment.FileName
End Property[/VBA]On my form, I have a pair of option buttons to choose between On and Off shore and a combobox that can contain all the file types which is populated when the form initializes[VBA]Private Sub UserForm_Initialize()
'a combobox called "cboAttType" for each of the file types
With cboAttType
.AddItem "Invoice"
.AddItem "Communication"
.ListIndex = 0
End With
End Sub[/VBA]After the initialize event, the property will be set, so we will have the filename in the label and an attachment variable set up and ready to use.

A cancel button can just unload the form - that attachment will be skipped.

An Ok button can do the save:
The optionbutton value can determine if the description or the WebViewURL is used in the file save path.
The combobox value can determine the next part of the filepath (these values should match the corresponding folder names) and then its finished off with the attachment name as before[VBA]Private Sub cmdOK_Click()

Dim strPathPrefix As String

If Me.optOn Then 'OnShore
strPathPrefix = Item.Parent.Description
Else 'OffShore
strPathPrefix = Item.Parent.WebViewURL
End If
myAttachment.SaveAsFile strPathPrefix & cboAttType.Value & "\" & myAttachment.FileName

End Sub[/VBA]And that should do it.
I hope... I'll be honest, I haven't tested it because I'm too lazy to set up the folders and it's nearly time for me to change locations. I'll check in later to see how you get on.
And I've attached the userform I did to avoid confusion over control names