Script om alle Word bestanden in een directory na te gaan op de gebruikte templates.
Uitvoer van script komt in strLogFilePath en voortgang word bijgehouden in strCheckedFiles, zodat het script herstart kan worden en dan oppakt waar het gebleven was.
'WhichTemplate.vbs 'Gebaseerd op code van http://support.microsoft.com/?kbid=823372 'Getest met Word 2003 SP2. '20081103 v1. '20081105 v2, nu met voortgangs en hervattings code. strFilePath = InputBox("Which directory?") strLogFilePath = "C:\temp\listofdoctemplates.txt" strCheckedFiles = "C:\temp\checkeddocs.txt" CONST bReadOnly = True CONST bDontConfirmConversion = False 'CONST msoAutomationSecurityForceDisable = 3 CONST ForReading = 1 CONST ForWriting = 2 CONST ForAppending = 8 CONST bCreate = True If Right(strFilePath, 1) <> "\" Then strFilePath = strFilePath & "\" End If 'Maak de benodigde objecten. Set objFso = CreateObject("Scripting.FileSystemObject") Set WorkFolder = objFso.GetFolder(strFilePath) Set objWord = CreateObject("Word.Application") 'Word moet onzichtbaar geopend worden. objWord.Visible=False 'Waarschuwingen hoeven niet te worden weergegeven. objWord.DisplayAlerts=False 'Haal de huidige security setting op. 'lngAutomation = objWord.AutomationSecurity 'Pas de security setting aan om macro's uit te schakelen. 'objWord.AutomationSecurity = msoAutomationSecurityForceDisable 'Bovenstaande code werkt wel, maar popup verschijnt dat macro's zijn uitgezet die je weer moet wegklikken. 'Onderstaande gevonden via http://social.msdn.microsoft.com/forums/en-US/vsto/thread/4c9daac8-06b8-413f-8b2f-12e3b6089fbb/ objWord.WordBasic.DisableAutoMacros 'Als het lobestand al bestaat... If objFso.FileExists(strLogFilePath) Then 'Open het voor toevoegen. Set fhLogFile = objFso.OpenTextFile(strLogFilePath, ForAppending) Else 'Zo niet, omaak het bestand dan aan. Set fhLogFile = objFso.OpenTextFile(strLogFilePath, ForWriting, bCreate) End If 'Als het voortgangsbestand al bestaat... If objFso.FileExists(strCheckedFiles) Then 'Open het voortgangsbestand voor lezen. Set fhCheckedFiles = objFso.OpenTextFile(strCheckedFiles, ForReading) c = 0 'Lees alle regels uit het voortgangsbestand in een array. Do While Not fhCheckedFiles.AtEndOfStream 'Laat de array groeien. Redim Preserve arrayCheckedFiles(c) 'Lees een regel uit het voortgangsbestand in. arrayCheckedFiles(c) = fhCheckedFiles.ReadLine c = c + 1 Loop 'Sluit het voortgangsbestand. fhCheckedFiles.Close() 'Open het voortgangsbestand opnieuw, maar nu voor toevoegen. Set fhCheckedFiles = objFso.OpenTextFile(strCheckedFiles, ForAppending) Else 'Zo niet, maak het voortgangsbestand aan. Set fhCheckedFiles = objFso.OpenTextFile(strCheckedFiles, ForWriting, bCreate) 'Schrijf alvast de eerste regel in het voortgangsbestand. 'Dit om te voorkomen dat hiermee een tekstbestand aangemaakt word, 'wat na een vastloper van het script leeg is en problemen geeft bij uitlezen. fhCheckedFiles.WriteLine("---------------" & Now & "---------------") End If 'Voor elk bestand in de opgegeven folder... For Each file in WorkFolder.Files 'Als het om een niet tijdelijk Word document gaat, dan... If objFso.GetExtensionName(file.Name) = "doc" And Left(file.Name, 1) <> "~" Then 'Lees het voortgangsbestand in. 'Moet een lege array teruggeven als bestand niet in de lijst voorkomt. arrayResults = Filter(arrayCheckedFiles, strFilePath & file.Name) 'Als het huidige bestand niet gelijk is aan een bestand in arrayCheckedFiles, dan... 'Bij een lege array geeft UBound -1 terug, bij een array met één waarde 0, met twee waardes 1, enz. If UBound(arrayResults) = -1 Then 'Als je dit script silent wil laten lopen, zet dan een ' voor onderstaande regel. 'Als je dit script met cscript in een cmd start, kun je bijhouden hoever het proces is. WScript.Echo strFilePath & file.Name 'Open het Word document readonly. Set objDoc = objWord.Documents.Open(strFilePath & file.Name, bDontConfirmConversion, bReadOnly) fhLogFile.WriteLine("**********************************************************") 'Schrijf de bestandsnaam weg in het logbestand. fhLogFile.WriteLine("Filename: " & strFilePath & file.Name) fhLogFile.WriteBlankLines(1) 'Schrijf de bestandsnaam weg in het voortgangsbestand. fhCheckedFiles.WriteLine(strFilePath & file.Name) 'Schrijf voor elke template in het logbestand... For Each objTemplate in objWord.Templates 'De volledige naam met Exists erachter als het bestand bestaat. If objFso.FileExists(objTemplate.FullName) Then fhLogFile.WriteLine("Template: " & objTemplate.FullName & ", Exists") Else 'De volledige naam met Does Not Exist erachter als het bestand niet bestaat. fhLogFile.WriteLine("Template: " & objTemplate.FullName & ", Does Not Exist") End If Next 'Sluit het Word document. objDoc.Close fhLogFile.WriteBlankLines(1) End If End If Next 'Stel de security weer in op de eerder opgehaalde instelling. 'Zie notitie bovenaan waarom onderstaande uitgecommentarieerd is. 'objWord.AutomationSecurity = lngAutomation 'Sluit het log- en het voortgangsbestand. fhLogFile.Close() fhCheckedFiles.Close() 'Sluit Word af. objWord.Quit 'Cleanup Set objDoc = Nothing Set objWord = Nothing Set fhLogFile = Nothing Set WorkFolder = Nothing Set objFso = Nothing
Bronnen:
MSDN Office Developer Centre - Office 2003 VBA Language Reference
MSDN Forums - MS Word: msoAutomationSecurityForceDisable generates "The macros in this project are disabled" message
Reading Word Documents in WSH
ActiveXperts - Microsoft Word Scripts
Microsoft Support - Het duurt lang om een Word-document te openen waaraan een sjabloon is gekoppeld
How to implement the Application.AutomationSecurity property in Office XP
Microsoft Support - The AutomationSecurity property behavior has changed in Office 2003
Using VBA to disable macros when opening files
VBA Code to disable a macro