lgibbs
Goto Top

VBA Makro mittels PowerShell ausführen

Servus Community,

mir liegen derzeit eine Vielzahl von Word-Dokumenten vor (*.doc, *docm, *docx), in denen ContentControls-Objekte verbaut sind.
Um alle Dateien zu standardisieren habe ich folgendes Makro geschrieben:

Sub RunMacro()
   Dim Rng As Range, CCtrl As ContentControl

For Each Rng In ActiveDocument.StoryRanges
     For Each CCtrl In Rng.ContentControls
       CCtrl.LockContentControl = False
       CCtrl.LockContents = False
       CCtrl.Delete
     Next
   Next
    
   If ActiveDocument.Revisions.Count >= 1 Then
     ActiveDocument.Revisions.AcceptAll
   End If

End Sub

Da ich aber nicht jedes Word-Dokument mit diesem Makro händisch befüllen möchte, stelle ich mir vor, dies über ein PowerShell Skript laufen zu lassen:

$wrd = New-Object -ComObject "Word.Application"  
$files = Get-ChildItem "C:\PBs\Input" -Filter "*.doc*"  

foreach ($file in $files) {
    $doc = $wrd.Documents.Open("C:\PBs\Input\$file")  
    $wrd.Run("RunMacro")  
    $doc.Save()
    $doc.Close()
}

Jetzt stellt sich mir die Frage, wie ich das oben benannte Makro in PowerShell genau ausführe - innerhalb der Word-Dokumente liegt es nicht vor...
Speicher ich es vorher als .vbs und source es dann oder kann ich es innerhalb des PowerShell Skripts speichern?

Content-Key: 2740715354

Url: https://administrator.de/contentid/2740715354

Printed on: April 19, 2024 at 00:04 o'clock

Member: MrCount
MrCount May 10, 2022 at 15:27:26 (UTC)
Goto Top
Servus,

evtl. kann dir dieser Beitrag helfen, auch wenn es um Excel-Makros geht: https://www.mrexcel.com/board/threads/copy-module-to-external-workbook.3 ...
Member: colinardo
Solution colinardo May 11, 2022 updated at 07:47:38 (UTC)
Goto Top
Servus,
$folder = 'C:\PBs\Input'  
$objWord = New-Object -Com Word.Application -Property @{Visible = $false;DisplayAlerts=0}
foreach($file in Get-ChildItem $folder -File -Filter *.doc*){
    $doc = $objWord.Documents.Open($file.Fullname)
    foreach ($story in $doc.StoryRanges){
        $story.ContentControls | %{
            $_.LockContentControl = $false
            $_.LockContents = $false
            $_.Delete()
        }
    }
    if ($doc.Revisions.Count -gt 0){
        $doc.Revisions.AcceptAll()
    }
    $doc.Save()
    $doc.Close($true)
}
$objWord.DisplayAlerts=-1
$objWord.Quit()
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($objWord)
Grüße Uwe