HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Entdecke rund 2 Millionen Excel-Lösungen im
Forumsarchiv
Forumbeitrag
Excel-Version des Fragestellers:
2022
Erfahrungslevel des Fragestellers:
Excel gut - VBA gut
schauan
20.05.2026 18:01:08
AW: Ohne Verzögerung...
... irgendwo hatte ich im Hinterkopf, dass man ps auch direkt mit bypass -command verwenden kann ;-)

Darüber habe ich - ehe ich bei mir lange suche - gleich mal mit dem Copilot von GPT geChattet oder wie die da alle heißen und auch eine Lösung bekommen ...
Diese hier noch ohne exclude ;-) - siehe Zusatz weiter unten. Die ist auch rekursiv, d.h. man müsste das -Recurse ggf. (r)ausbauen.

Sub SearchAndOpenFiles()

Dim psCommand As String
Dim wsh As Object
Dim execObj As Object
Dim line As String
Dim searchPath As String
Dim searchPattern As String
Dim fDialog As FileDialog
Dim fileCount As Long

' === Suchmuster festlegen ===
searchPattern = "*abc*.xls*" ' Suchmuster anpassen

' === Ordnerauswahl-Dialog ===
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
With fDialog
.Title = "Bitte Suchordner auswählen"
.AllowMultiSelect = False
If .Show <> -1 Then
MsgBox "Suche abgebrochen.", vbInformation
Exit Sub
End If
searchPath = .SelectedItems(1)
End With

' === PowerShell-Befehl ===
' Gibt nur vollständige Dateipfade aus
psCommand = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command " & _
"""Get-ChildItem -Path '" & searchPath & "' -Filter '" & searchPattern & "' -File -Recurse | " & _
"Select-Object -ExpandProperty FullName"""

' === PowerShell starten ===
Set wsh = CreateObject("WScript.Shell")
Set execObj = wsh.Exec(psCommand)

' === Jede gefundene Datei öffnen ===
fileCount = 0
Do While Not execObj.StdOut.AtEndOfStream
line = Trim(execObj.StdOut.ReadLine)
If Len(line) > 0 Then
fileCount = fileCount + 1
On Error Resume Next
Workbooks.Open Filename:=line, ReadOnly:=True
If Err.Number <> 0 Then
MsgBox "Fehler beim Öffnen: " & line, vbExclamation
Err.Clear
End If
On Error GoTo 0
End If
Loop

' === Ergebnis-Info ===
If fileCount = 0 Then
MsgBox "Keine Dateien gefunden.", vbInformation
Else
MsgBox fileCount & " Dateien geöffnet.", vbInformation
End If
End Sub


Für den Ausschluss von Mustern könnte das ps so aussehen:

    psCommand = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command " & _

"""Get-ChildItem -Path '" & searchPath & "' -Filter '" & searchPattern & "' -File -Recurse | " & _
"Where-Object { $_.Name -notmatch '" & excludePattern & "' } | " & _
"Select-Object -ExpandProperty FullName"""


Der Unterschied zu Ralf's Variante ist, dass die Files mit dem Suchstring schon in der Zeile mit Get-ChildItem ... stärker reduziert werden und deshalb bei Where nur noch der unerwünschte Rest ausgeschlossen wird.
(der excludePattern muss natürlich auch zuvor definiert werden ...)

Als Antwort auf diesen Beitrag
Case
20.05.2026 15:05:24
Ohne Verzögerung...
Moin, :-)

… beim ersten Start wäre dann PowerShell. ;-)

Das in eine FJ.ps1 Datei: ;-)
$path = "C:\Temp"

$include = Read-Host "Dateiname MUSS enthalten"
$exclude = Read-Host "Dateiname DARF NICHT enthalten"
Get-ChildItem $path -Filter "*.xls*" |
Where-Object {$_.Name -like "*$include*" -and $_.Name -notlike "*$exclude*"} |
ForEach-Object {$excel.Workbooks.Open($_.FullName)}

Dann Doppelklick auf die Datei, oder per VBA aufrufen (man kann in PowerShell auch eine VB-Inputbox aufrufen). ;-)

Oder die Parameter aus VBA übergeben - dann so in VBA: ;-)
Option Explicit

Public Sub Main()
Dim strSuch As String
Dim strEx As String
strSuch = "Juni"
strEx = "abc"
Shell "powershell.exe -ExecutionPolicy Bypass -File ""C:\Temp\FJ.ps1"" """ & strSuch & """ """ & strEx & """", vbHide 'vbNormalFocus
End Sub

Und die FJ.ps1 Datei sieht dann so aus: ;-)
param([string]$Include, [string]$Exclude)

$path = "C:\Temp"
Get-ChildItem $path -Filter "*.xls*" |
Where-Object {$_.Name -like "*$Include*" -and $_.Name -notlike "*$Exclude*"} |
ForEach-Object {Start-Process $_.FullName}

Das wäre dann für die Wein- bzw. Sake Trinker. ;-)

Servus
Case
Folgenachrichten
Antwort auf Beitrag erstellen
Bitte einen Anwendernamen ohne @ eingeben.
Bitte das Passwort eingeben.
Bitte eine gültige E-Mail-Adresse eingeben.
Bitte einen Betreff eingeben.
Weitere Optionen
Aktivieren, wenn die Frage/der Beitrag noch nicht beantwortet wurde und unter Listen > Offene Threads erscheinen soll.
Beispieldatei hochladen

Bitte einen Nachrichtentext eingeben.