Discussion:
Code Example: Create a custom footer for all employees in a corperate Network
(too old to reply)
J. Steinblock
2005-10-05 16:28:43 UTC
Permalink
Ok,

because I had spend a couple of houres with this topic and I think I am
not the first or last person who is interested in this, I will post a
little Howto:

The task was to create an identical footer in every new created
word-document in our company (1.600 employees) with the following
Information:
- UserName
- Creation Date of the Document
- Printdate
- Document Name
- Pagecount

The main problem is that you never ever should replace the normal.dot,
because custom macros and the user settings will be lost.
The Code how to handle global events comes from this page:
http://www.word.mvps.org/FAQs/MacrosVBA/PseudoAutoMacros.htm
(thanks to Jonathan West for the link)


How it works:
Create a new document and save it as a *.dot file
Follow the instructions on the page linked above to handle the global
events in word.

Add the following code to the PsuedoAutoNew Sub

Private Sub PsuedoAutoNew()
If LCase(ActiveDocument.AttachedTemplate.Name) = "normal.dot" Then
Application.ScreenUpdating = False
WriteDocumentFooter
Application.ScreenUpdating = True
End If
On Error GoTo 0
End Sub

WriteDocumentFooter is a Sub that fills the footer with content. Disable
ScreenUpdating seems not to work in Word 2000 (maybe later versions, I had
no change to test it.) so you see the document move to the bottom of the
page and then to the top again within a few milisecs.

Add this sub to your code:
Private Sub WriteDocumentFooter()
' Go to PageFooter
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter

' Draw a table
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2,
NumColumns:= _
3, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed

' Add Createdate
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"CREATEDATE \@ dd.MM.yyyy", PreserveFormatting:=True
Selection.MoveRight Unit:=wdCell

' Add document name
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"FILENAME ", PreserveFormatting:=True
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
Selection.MoveRight Unit:=wdCell


' Add Page Count (Page X of Y)
Selection.TypeText Text:="Seite "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"PAGE ", PreserveFormatting:=True
Selection.TypeText Text:=" von "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"NUMPAGES ", PreserveFormatting:=True
Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
Selection.MoveRight Unit:=wdCell

' Add Username
' If you do not maintaine the word user and company names (like us :-)
you could write a little function to get the name from AD for example.
' In this case you can use the code: Selection.TypeText
Text:=GetUserNameFromAD
' (GetUserNameFromAD must be a Function that returns the username
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"USERNAME ", PreserveFormatting:=True
Selection.MoveRight Unit:=wdCell

' Empty Row
Selection.MoveRight Unit:=wdCell

' This field will be empty until you print the first time, than the
text will be: "printed: 01.01.2111
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="IF "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="PRINTDATE \@ ddMMyyyy"
Selection.MoveRight Unit:=wdCharacter, Count:=2
Selection.TypeText Text:="=""00000000"" """" "
Selection.TypeText Text:=""""
Selection.TypeText Text:="printed: "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="PRINTDATE \@ dd.MM.yyyy"
Selection.TypeText Text:=""""
Selection.Fields.Update
Selection.ParagraphFormat.Alignment = wdAlignParagraphRight


' Go back to the top of the main-document
ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
Selection.MoveUp Unit:=wdScreen, Count:=1
Selection.MoveUp Unit:=wdScreen, Count:=1
End Sub




This should produce a table at the bottom of the page that should look
like this:
------------------------------------------------------------------
| 21.09.2005 | DocName.doc | Page 3 of 5 |
------------------------------------------------------------------
| Boll Gotes | | printed: 04.10.2005 |
------------------------------------------------------------------

If you prefer a different formatting for the date search the string
"CREATEDATE \@ dd.MM.yyyy" and change the "dd.MM.yyyy" to whatever you
like (search the vba-help for the format function. Should be exactly the
same syntax.
J. Steinblock
2005-10-05 16:42:08 UTC
Permalink
A little addition:

to make sure every user gets this template I used a network share and
configured our logon-script to add following registry-value:
HKCU\Software\Microsoft\Office\9.0\Word\Options\STARTUP-PATH=x:\path\to\add-in\folder

If you run a different version of word (we use Office 2000) you have to
use 10.0 (XP) 11.0 (2003) or something different for minor versions.

If you want this to work for notebook-users you have to make this folder
offline available.




I made something similar in excel (It is a little bit easier, because you
have more events in excel). If someone is interested in the code, please
request here. (do not reply to my e-mail, this is only a spam-account.
Charles Kenyon
2005-10-05 13:59:20 UTC
Permalink
How about creating your footer with fields as an autotext entry and simply
having your macro insert the AutoText entry?
--
Charles Kenyon

Word New User FAQ & Web Directory: http://addbalance.com/word

Intermediate User's Guide to Microsoft Word (supplemented version of
Microsoft's Legal Users' Guide) http://addbalance.com/usersguide

See also the MVP FAQ: http://word.mvps.org/FAQs/ which is awesome!
--------- --------- --------- --------- --------- ---------
This message is posted to a newsgroup. Please post replies
and questions to the newsgroup so that others can learn
from my ignorance and your wisdom.
Post by J. Steinblock
Ok,
because I had spend a couple of houres with this topic and I think I am
not the first or last person who is interested in this, I will post a
The task was to create an identical footer in every new created
word-document in our company (1.600 employees) with the following
- UserName
- Creation Date of the Document
- Printdate
- Document Name
- Pagecount
The main problem is that you never ever should replace the normal.dot,
because custom macros and the user settings will be lost.
http://www.word.mvps.org/FAQs/MacrosVBA/PseudoAutoMacros.htm
(thanks to Jonathan West for the link)
Create a new document and save it as a *.dot file
Follow the instructions on the page linked above to handle the global
events in word.
Add the following code to the PsuedoAutoNew Sub
Private Sub PsuedoAutoNew()
If LCase(ActiveDocument.AttachedTemplate.Name) = "normal.dot" Then
Application.ScreenUpdating = False
WriteDocumentFooter
Application.ScreenUpdating = True
End If
On Error GoTo 0
End Sub
WriteDocumentFooter is a Sub that fills the footer with content. Disable
ScreenUpdating seems not to work in Word 2000 (maybe later versions, I had
no change to test it.) so you see the document move to the bottom of the
page and then to the top again within a few milisecs.
Private Sub WriteDocumentFooter()
' Go to PageFooter
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
' Draw a table
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2,
NumColumns:= _
3, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed
' Add Createdate
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
Selection.MoveRight Unit:=wdCell
' Add document name
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"FILENAME ", PreserveFormatting:=True
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
Selection.MoveRight Unit:=wdCell
' Add Page Count (Page X of Y)
Selection.TypeText Text:="Seite "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"PAGE ", PreserveFormatting:=True
Selection.TypeText Text:=" von "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"NUMPAGES ", PreserveFormatting:=True
Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
Selection.MoveRight Unit:=wdCell
' Add Username
' If you do not maintaine the word user and company names (like us :-)
you could write a little function to get the name from AD for example.
' In this case you can use the code: Selection.TypeText
Text:=GetUserNameFromAD
' (GetUserNameFromAD must be a Function that returns the username
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"USERNAME ", PreserveFormatting:=True
Selection.MoveRight Unit:=wdCell
' Empty Row
Selection.MoveRight Unit:=wdCell
' This field will be empty until you print the first time, than the
text will be: "printed: 01.01.2111
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="IF "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.MoveRight Unit:=wdCharacter, Count:=2
Selection.TypeText Text:="=""00000000"" """" "
Selection.TypeText Text:=""""
Selection.TypeText Text:="printed: "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=""""
Selection.Fields.Update
Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
' Go back to the top of the main-document
ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
Selection.MoveUp Unit:=wdScreen, Count:=1
Selection.MoveUp Unit:=wdScreen, Count:=1
End Sub
This should produce a table at the bottom of the page that should look
------------------------------------------------------------------
| 21.09.2005 | DocName.doc | Page 3 of 5 |
------------------------------------------------------------------
| Boll Gotes | | printed: 04.10.2005 |
------------------------------------------------------------------
If you prefer a different formatting for the date search the string
like (search the vba-help for the format function. Should be exactly the
same syntax.
J. Steinblock
2005-10-05 16:45:19 UTC
Permalink
That was exactly what I did. I recorded a macro and got the resulting vba
source code.
Look here:
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
"CREATEDATE \@ dd.MM.yyyy", PreserveFormatting:=True
Selection.MoveRight Unit:=wdCell

That is what word returns if I add the fild CREATEDATE.

The Autotext with the Printdate (Invisible if not printed yet) isn´t
recorded correctly so I had have to patch the code a little.
Fell free to record your own macro for the footer and replace it with my
code for yourself...




On Wed, 5 Oct 2005 08:59:20 -0500, Charles Kenyon
Post by Charles Kenyon
How about creating your footer with fields as an autotext entry and simply
having your macro insert the AutoText entry?
Charles Kenyon
2005-10-05 17:14:26 UTC
Permalink
You misunderstand me. How about creating one AutoText entry that has all of
your fields. Then use a macro to insert that single entry. You can keep the
AutoText entry in a global template. See
http://addbalance.com/word/movetotemplate.htm for step-by-step instructions
on moving / sharing / copying / backing-up customizations including
AutoText, AutoCorrect, keyboard assignments, toolbars, macros, etc.
--
Charles Kenyon

Word New User FAQ & Web Directory: http://addbalance.com/word

Intermediate User's Guide to Microsoft Word (supplemented version of
Microsoft's Legal Users' Guide) http://addbalance.com/usersguide

See also the MVP FAQ: http://word.mvps.org/FAQs/ which is awesome!
--------- --------- --------- --------- --------- ---------
This message is posted to a newsgroup. Please post replies
and questions to the newsgroup so that others can learn
from my ignorance and your wisdom.
Post by J. Steinblock
That was exactly what I did. I recorded a macro and got the resulting vba
source code.
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:= _
Selection.MoveRight Unit:=wdCell
That is what word returns if I add the fild CREATEDATE.
The Autotext with the Printdate (Invisible if not printed yet) isnŽt
recorded correctly so I had have to patch the code a little.
Fell free to record your own macro for the footer and replace it with my
code for yourself...
On Wed, 5 Oct 2005 08:59:20 -0500, Charles Kenyon
Post by Charles Kenyon
How about creating your footer with fields as an autotext entry and simply
having your macro insert the AutoText entry?
Loading...