![]() |
|
#1
|
|||
|
|||
|
Is it possible? How do I...?
Trying to determine a (best) way to **programatically** change out the macros for templates scattered across many sites. The requirements have changed and the macros need to be upgraded and enhanced. Macros include AutoNew, AutoExit, etc. in addition to several AddOn menu event actions. Need to retain the other template objects as is (AutoText, Styles, menu AddOns, etc.) but replace the macros. Each site can have any number of templates, and the templates are all unique; so cannot just switch out the templates in mass. Would be nice to just strip off the existing macro module (using VBA) from each template and replace it, then resave the template. But have not found any way to accomplish that. Any suggestions as to how best to accomplish this? |
|
#2
|
||||
|
||||
|
The following macro updates a line of VBA code in all code modules in all templates in the selected folder. The actual editing is done by the ‘EditCode’ module. The rest of the code is for the locating and looping through the files. The StrFnd and StrRep variables can contain from as little as a single letter to a whole code module.
Simply add the code to a document, then run it & point its browser to the folder containing the templates to be updated. Code:
Sub UpdateTemplates()
Application.ScreenUpdating = False
Dim strFolder As String, strFile As String, wdDoc As Document
strFolder = GetFolder
If strFolder = "" Then Exit Sub
strFile = Dir(strFolder & "\*.dotm", vbNormal)
While strFile <> ""
Set wdDoc = Documents.Open(FileName:=strFolder & "\" & strFile, AddToRecentFiles:=False, Visible:=False)
Call EditCode(wdDoc)
wdDoc.Close SaveChanges:=True
strFile = Dir()
Wend
Set wdDoc = Nothing
Application.ScreenUpdating = True
End Sub
Function GetFolder() As String
Dim oFolder As Object
GetFolder = ""
Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Choose a folder", 0)
If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path
Set oFolder = Nothing
End Function
Sub EditCode(wdDoc As Document)
Dim VBC, VBComp
Dim i As Long, j As Long, bFnd As Boolean
Dim StrFnd As String, StrRep As String, StrNew As String
StrFnd = "Old code line1" & vbCr & "Old code line2" 'Text to Find
StrRep = "New code line1" & vbCr & "New code line2" ' Replacement Text
Set VBC = wdDoc.VBProject.VBComponents
bFnd = True
For Each VBComp In VBC
With VBComp.CodeModule
i = 1
j = .CountOfLines
bFnd = .Find(Target:=StrFnd, StartLine:=i, StartColumn:=1, EndLine:=j, _
EndColumn:=255, WholeWord:=True, MatchCase:=False, PatternSearch:=False)
Do Until bFnd = False
StrNew = Replace(.Lines(i, 1), StrFnd, StrRep)
.ReplaceLine i, StrNew
j = .CountOfLines
bFnd = .Find(Target:=StrFnd, StartLine:=i, StartColumn:=1, EndLine:=j, _
EndColumn:=255, WholeWord:=True, MatchCase:=False, PatternSearch:=False)
Loop
End With
Next VBComp
Set VBC = Nothing
End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
|
| Tags |
| macros, replace, template |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Updating active R/O templates (dot) and macros (dotm) | gw1500se | Word | 0 | 05-27-2014 12:11 PM |
| Office 2010 change location workgroup templates appear in from My Templates folder | nickc | Word | 0 | 11-20-2013 03:38 AM |
| Can you make templates dynamically update macros/etc. from Normal.DOT? | New Daddy | Word | 2 | 11-18-2013 09:07 AM |
| Assigning templates to existing documents. Update Styles Enmasse. | bannerdog | Word | 1 | 02-28-2012 03:53 PM |
| Templates and Macros | eliz.bell | Excel | 2 | 03-28-2011 11:44 AM |