Makro-Quelltexte massenhaft durchsuchen
Guten Tag,
ich habe eine Sammlung von mehreren tausend Excel-Files in einem Ordner mit Unterordnern vorliegen, die größtenteils (ungeschützte) Makros enthalten. In einigen dieser Makros wird ein nicht mehr gültiger UNC-Pfade verwendet durch einen Aufruf in etwas wie nachfolgend (etwas verkürzt dargestellt):
Ich suche nach einer Möglichkeit, alle Excel-Files automatisch nach dem UNC-Pfad durchsuchen zu lassen. Die Korrektur der falschen Pfade kann anschließend von Hand geschehen, notwendig ist eine Übersicht der betroffenen Excel-Files. Der ungültige UNC-Pfad ist immer gleich.
Vielen Dank vorab für eure Hilfe,
Dennis
ich habe eine Sammlung von mehreren tausend Excel-Files in einem Ordner mit Unterordnern vorliegen, die größtenteils (ungeschützte) Makros enthalten. In einigen dieser Makros wird ein nicht mehr gültiger UNC-Pfade verwendet durch einen Aufruf in etwas wie nachfolgend (etwas verkürzt dargestellt):
Private Sub CommandButton1_Click()
Dim WBName As String
WBName = ActiveWorkbook.Name
On Error GoTo weiter
Workbooks.Open Filename:="\\Server\PC Software\V\Software.xlam"
weiter:
Application.Run ("Software.xlam!Zeiterfassung"), WBName
End Sub
Ich suche nach einer Möglichkeit, alle Excel-Files automatisch nach dem UNC-Pfad durchsuchen zu lassen. Die Korrektur der falschen Pfade kann anschließend von Hand geschehen, notwendig ist eine Übersicht der betroffenen Excel-Files. Der ungültige UNC-Pfad ist immer gleich.
Vielen Dank vorab für eure Hilfe,
Dennis
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3740737294
Url: https://administrator.de/forum/makro-quelltexte-massenhaft-durchsuchen-3740737294.html
Ausgedruckt am: 06.06.2025 um 14:06 Uhr
4 Kommentare
Neuester Kommentar

Ungetestetes Ergebnis von ChatGPT:
# Pfad zum Verzeichnis, in dem die Excel-Dateien gespeichert sind
$VerzeichnisPfad = "C:\Pfad\Zu\Deinem\Verzeichnis"
# Der Text, nach dem du suchen möchtest
$ZuSuchenderText = "DeinSuchtext"
# Datei, in der die Ergebnisse gespeichert werden
$ErgebnisDatei = "C:\Pfad\Zu\Deiner\Ergebnisdatei.txt"
# Erstelle ein Excel-Anwendungsobjekt
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
# Erstelle eine Liste, um die Ergebnisse zu speichern
$Ergebnisse = @()
# Durchsuche alle Excel-Dateien im Verzeichnis
Get-ChildItem -Path $VerzeichnisPfad -Filter *.xls* | ForEach-Object {
$Datei = $_.FullName
# Öffne die Excel-Datei
$Arbeitsmappe = $excel.Workbooks.Open($Datei)
# Durchsuche alle Makros in der Arbeitsmappe
$Arbeitsmappe.VBProject.VBComponents | ForEach-Object {
$Modul = $_
$Code = $Modul.CodeModule.Lines(1, $Modul.CodeModule.CountOfLines)
# Überprüfe, ob der Text im Makro gefunden wurde
if ($Code -like "*$ZuSuchenderText*") {
$Ergebnis = "Datei: $Datei - Modul: $($Modul.Name) - Zeile: $($Code.IndexOf($ZuSuchenderText) + 1)"
$Ergebnisse += $Ergebnis
}
}
# Schließe die Arbeitsmappe
$Arbeitsmappe.Close()
}
# Speichere die Ergebnisse in der Ergebnisdatei
$Ergebnisse | Out-File -FilePath $ErgebnisDatei
# Schließe die Excel-Anwendung
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
Remove-Variable excel
Write-Host "Die Suche wurde abgeschlossen. Die Ergebnisse wurden in $ErgebnisDatei gespeichert."

Gibt die Pfade der Dateien aus bei denen es einen Treffer gibt.
Powershell:
# Dateiordner der rekursiv durchsucht wird
$folder = "D:\Ordner"
# Zu verarbeitende Dateierweiterungen
$extensions = '*.xlsm','*.xltm'
# Suchbegriff im VBA-Code
$searchstring = '\\Server\PC Software\V\Software.xlam'
# ----------------
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.Filesystem
$vbapfile = "$env:TEMP\vbaProject.bin"
$log = foreach ($file in Get-ChildItem $folder -File -Recurse -Include $extensions){
$zipfile = [System.IO.Compression.ZipFile]::Open($file.Fullname,[System.IO.Compression.ZipArchiveMode]::Read)
$entry = $zipfile.Entries | ? Name -eq 'vbaProject.bin' | select -First 1
remove-item $vbapfile -Force -EA Ignore
if ($entry){
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry,$vbapfile)
$zipfile.Dispose()
if (Select-String -Path $vbapfile -Pattern $searchstring -SimpleMatch -Quiet){
$file.Fullname
}
}
}
$log
Sid.