#1
|
|||
|
|||
Programatically change macros for existing templates
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 |