This macro is used to publish a template to another user's mailbox. If the template name never changes you can 'hard code' the template name into the code.
You need to have proper permissions to publish forms to other users folder; you need at least Folder Visible and Create Items permission.

Nonediting Author and above have the required permissions, or select just those two permissions in the dialog.
Why would you use a macro to publish a template instead of using the Publish command in Forms Designer? Because you can. :) It's also the only way to remotely publish custom forms in someone else's mailbox.
To use this macro, you need to confirm macro security is set to low.
- Press Alt+F11 in to open the VBA editor.
- Right-click on Project1 and choose Insert > Module.
- Paste the code into the new module.
- Press F8 to run it.
Use a macro to publish custom forms
Option Explicit
Sub PublishForm()
'fromhttp://slipstick.me/0clkw
Dim olNS As Outlook.NameSpace
Dim MyFolder
Dim MyItem
Dim MyForm As FormDescription
Dim myRecipient As Recipient
Dim recip, fname, tname, appdata As String
Dim oShell
Set oShell = CreateObject("WScript.Shell")
appdata = oShell.ExpandEnvironmentStrings("%appdata%")
tname = InputBox("Template name (only) path is in Templates folder")
recip = InputBox("Publish to mailbox: name or alias")
fname = InputBox("Publish form as: name")
tname = appdata & "\Microsoft\Templates\" & tname & ".oft"
Set olNS = Application.GetNamespace("MAPI")
Set MyItem = Application.CreateItemFromTemplate(tname)
Set MyForm = MyItem.FormDescription
Set myRecipient = olNS.CreateRecipient(recip)
myRecipient.Resolve
If myRecipient.Resolved Then
Set MyFolder = olNS.GetSharedDefaultFolder(myRecipient, 9) 'calendar
End If
MyForm.Name = fname
MyForm.PublishForm 3, MyFolder '3=olFolderRegistry
Set olNS = Nothing
End Sub
Use a template to publish a form
If you need to publish forms frequently (in your mailbox or other mailboxes), you can use a custom form with VBScript. The advantage of this method is that the "publish form" form is available when you open your mailbox on any computer.
To create this form, follow these steps:
- Open a new Post form in Forms Designer.
- Click View code and paste this code into the code window.
- Create 4 textbox controls on P.2 tab using these names: fame, tname,recip, fno and 5 labels (the fifth label is a cheat sheet to identify template types).
| Label | Textbox |
|---|---|
| Publish form as | fname |
| Template name | tname |
| Username | recip |
| Template type | fno |
You should hide the Message tab, since you aren't using that page. In Outlook 2007, 2010, 2013 click on the Page button, then click on Display This Page to remove the checkmark. Adding controls to the P.2 page will show the page by default.
You can change the name of P.2 tab, but its not necessary since it's not visible in the finished form. If you change the name, you need to change the name in the macro code too.

Add a command button and run the form to test it.
Option Explicit
'http://slipstick.me/0clkw
Dim olNS
Dim MyFolder
Dim MyItem
Dim MyForm
Dim myRecipient
Dim recip
Dim fname
Dim tname
Dim fno
Dim appdata
Dim oShell
Sub CommandButton2_Click()
Set olNS = Item.Application.GetNamespace("MAPI")
Set MyFolder = olNS.GetDefaultFolder(9) '6=olFolderInbox
Set oShell = CreateObject( "WScript.Shell" )
appdata=oShell.ExpandEnvironmentStrings("%appdata%")
fname = Item.GetInspector.ModifiedFormPages("P.2").Controls("fname").Value
tname = Item.GetInspector.ModifiedFormPages("P.2").Controls("tname").Value
recip = Item.GetInspector.ModifiedFormPages("P.2").Controls("recip").Value
fno = Item.GetInspector.ModifiedFormPages("P.2").Controls("fno").Value
Set MyItem = Application.CreateItemFromTemplate(appdata & "\Microsoft\Templates\" & tname & ".oft")
Set myRecipient = olNS.CreateRecipient(recip)
myRecipient.Resolve
If myRecipient.Resolved Then
Set MyFolder = olNS.GetSharedDefaultFolder(myRecipient, fno) 'calendar
End If
Set MyForm = MyItem.FormDescription
MyForm.Name = fname
MyForm.PublishForm 3, MyFolder '3=olFolderRegistry
Item.Close 1 '1=olDiscard
End Sub
Sub CommandButton1_Click()
Dim oDialog
Set oDialog = Application.Session.GetSelectNamesDialog
oDialog.Display
End Sub
A pst file containing the template is here.
GetSharedDefaultFolder Values
The code above is using the Calendar folder. to use a diffierent folder, you need to change the value for GetSharedDefaultFolder (or GetDefaultFolder if using it on your own mailbox):
Set MyFolder = olNS.GetDefaultFolder(9) 'calendar
Set MyFolder = olNS.GetSharedDefaultFolder(myRecipient, 9)
Valid entries are listed in the table below.
| Folder Name | GetDefaultFolder(#) |
|---|---|
| Calendar | 9 |
| Contacts | 10 |
| Inbox | 6 |
| Journal | 11 |
| Tasks | 13 |
More Information
OL98: How to Programmatically Publish a Form MSKB (valid for all versions of Outlook)
How to design custom template under message/mail form !
How to design custom template under message/mail form !
I was asked to design Request for Leave form as a template which can be later used by the users .
I designed the template by choosing Home ->New Mail->Developer->Design a Form -> Selected Message (Look IN : Standard Forms Library)
Here In this design mode I can see To,Cc,Subject and body . I deleted Body (Rich Text Box) and added the other controls like Multiple Labels,Textboxes and Textbox(Multiline to true) in place of Body
I saved this whole thing into local machine outlook/templates folder with .oft extension .
When I close whole thing and open by clicking choose form in New Mail . The template is loading . When I write something in the textbox and fill the
fields and try to send to other user . It is just showing the Empty body and it is not showing any of the controls/Input data to the receiver mail .
Please reply me ASAP
Thanks in advance
If you aren't using Exchange server and publishing it to the organizational forms library, you need to send the form definition. It's on the properties tab when customizing the form.