28.02.2026, 11:03
Ich habe mal folgende Anfrage an Copilot gestellt:
Kannst Du mir bitte folgenden VBA-Code analysieren?
Set wShell = CreateObject("WScript.Shell")
Set oExec = wShell.Exec("mshta.exe ""about:<input type=file id=FILE><script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""")
sFileSelected = oExec.StdOut.ReadLine
Die Antwort war:
Der Code, den du zeigst, ist ein bekannter VBA‑Trick, um einen Dateiauswahldialog ohne API‑Deklarationen zu öffnen – aber er nutzt dafür einen eher ungewöhnlichen und sicherheitstechnisch fragwürdigen Weg über mshta.exe und eingebettetes HTML/JavaScript.
? Was der Code macht – in Klartext
Der Ablauf ist:
WScript.Shell wird erzeugt.
Über wShell.Exec wird mshta.exe gestartet – ein Host für HTML‑Anwendungen.
mshta lädt eine Mini‑HTML‑Seite aus einem about:‑String:
Sie enthält ein <input type=file>‑Element.
Ein Script führt automatisch FILE.click() aus → der Dateiauswahldialog öffnet sich.
Nach der Auswahl wird der Dateipfad über GetStandardStream(1).WriteLine(FILE.value) an VBA zurückgegeben.
Das Fenster wird sofort geschlossen und auf Größe 0×0 gesetzt.
VBA liest die Ausgabe über oExec.StdOut.ReadLine.
Ergebnis:
sFileSelected enthält den vollständigen Pfad der ausgewählten Datei.
? Detaillierte Analyse der einzelnen Teile
1. Erzeugen des Shell‑Objekts
vba
Set wShell = CreateObject("WScript.Shell")
Standard‑VBA‑Technik, um externe Programme zu starten.
2. Starten von mshta.exe mit eingebettetem HTML
vba
Set oExec = wShell.Exec("mshta.exe ""about:<input type=file id=FILE> ... """)
mshta.exe ist ein Windows‑Programm, das HTML‑Anwendungen (HTA) ausführt.
Der about:‑Trick erlaubt, HTML direkt als String zu übergeben.
Das HTML erzeugt ein unsichtbares Fenster mit einem Dateiauswahlfeld.
3. Automatisches Öffnen des Dateidialogs
html
FILE.click();
Das <input type=file> wird automatisch geklickt → der Benutzer sieht den Dateiauswahldialog.
4. Rückgabe des Dateipfads
js
new ActiveXObject('Scripting.FileSystemObject')
.GetStandardStream(1)
.WriteLine(FILE.value);
GetStandardStream(1) = Standard Output (stdout)
WriteLine(FILE.value) = gibt den Dateipfad an VBA zurück
5. Lesen der Ausgabe in VBA
vba
sFileSelected = oExec.StdOut.ReadLine
Damit landet der Dateiname in der Variablen.
⚠️ Sicherheits- und Kompatibilitätsaspekte
1. mshta.exe ist veraltet
Microsoft stuft mshta.exe inzwischen als deprecated ein.
Viele Admins blockieren es, weil es oft für Malware missbraucht wurde.
2. ActiveX + HTA = potenziell unsicher
Der Code ist harmlos, aber die Technik ist dieselbe, die Schadsoftware nutzt.
3. Funktioniert nicht mehr zuverlässig
Unter Windows 11 teilweise blockiert
Unter restriktiven Gruppenrichtlinien oft deaktiviert
In Office mit gehärteten Makroeinstellungen kann es scheitern
? Vorteile der Methode
Kein API‑Code nötig
Funktioniert ohne Referenzen
Sehr kompakt
Öffnet einen echten Windows‑Dateidialog
? Nachteile
Abhängig von mshta.exe (veraltet, unsicher)
Kann durch Sicherheitsrichtlinien blockiert sein
Nicht zukunftssicher
Nicht plattformübergreifend (nur Windows)
? Empfohlene Alternative (viel sicherer & stabiler)
Wenn du nur einen Dateidialog brauchst, ist FileDialog die beste Lösung:
vba
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
If fd.Show = -1 Then
sFileSelected = fd.SelectedItems(1)
End If
Keine externen Programme
Keine ActiveX‑Tricks
Funktioniert in allen modernen Office‑Versionen
Kannst Du mir bitte folgenden VBA-Code analysieren?
Set wShell = CreateObject("WScript.Shell")
Set oExec = wShell.Exec("mshta.exe ""about:<input type=file id=FILE><script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""")
sFileSelected = oExec.StdOut.ReadLine
Die Antwort war:
Der Code, den du zeigst, ist ein bekannter VBA‑Trick, um einen Dateiauswahldialog ohne API‑Deklarationen zu öffnen – aber er nutzt dafür einen eher ungewöhnlichen und sicherheitstechnisch fragwürdigen Weg über mshta.exe und eingebettetes HTML/JavaScript.
? Was der Code macht – in Klartext
Der Ablauf ist:
WScript.Shell wird erzeugt.
Über wShell.Exec wird mshta.exe gestartet – ein Host für HTML‑Anwendungen.
mshta lädt eine Mini‑HTML‑Seite aus einem about:‑String:
Sie enthält ein <input type=file>‑Element.
Ein Script führt automatisch FILE.click() aus → der Dateiauswahldialog öffnet sich.
Nach der Auswahl wird der Dateipfad über GetStandardStream(1).WriteLine(FILE.value) an VBA zurückgegeben.
Das Fenster wird sofort geschlossen und auf Größe 0×0 gesetzt.
VBA liest die Ausgabe über oExec.StdOut.ReadLine.
Ergebnis:
sFileSelected enthält den vollständigen Pfad der ausgewählten Datei.
? Detaillierte Analyse der einzelnen Teile
1. Erzeugen des Shell‑Objekts
vba
Set wShell = CreateObject("WScript.Shell")
Standard‑VBA‑Technik, um externe Programme zu starten.
2. Starten von mshta.exe mit eingebettetem HTML
vba
Set oExec = wShell.Exec("mshta.exe ""about:<input type=file id=FILE> ... """)
mshta.exe ist ein Windows‑Programm, das HTML‑Anwendungen (HTA) ausführt.
Der about:‑Trick erlaubt, HTML direkt als String zu übergeben.
Das HTML erzeugt ein unsichtbares Fenster mit einem Dateiauswahlfeld.
3. Automatisches Öffnen des Dateidialogs
html
FILE.click();
Das <input type=file> wird automatisch geklickt → der Benutzer sieht den Dateiauswahldialog.
4. Rückgabe des Dateipfads
js
new ActiveXObject('Scripting.FileSystemObject')
.GetStandardStream(1)
.WriteLine(FILE.value);
GetStandardStream(1) = Standard Output (stdout)
WriteLine(FILE.value) = gibt den Dateipfad an VBA zurück
5. Lesen der Ausgabe in VBA
vba
sFileSelected = oExec.StdOut.ReadLine
Damit landet der Dateiname in der Variablen.
⚠️ Sicherheits- und Kompatibilitätsaspekte
1. mshta.exe ist veraltet
Microsoft stuft mshta.exe inzwischen als deprecated ein.
Viele Admins blockieren es, weil es oft für Malware missbraucht wurde.
2. ActiveX + HTA = potenziell unsicher
Der Code ist harmlos, aber die Technik ist dieselbe, die Schadsoftware nutzt.
3. Funktioniert nicht mehr zuverlässig
Unter Windows 11 teilweise blockiert
Unter restriktiven Gruppenrichtlinien oft deaktiviert
In Office mit gehärteten Makroeinstellungen kann es scheitern
? Vorteile der Methode
Kein API‑Code nötig
Funktioniert ohne Referenzen
Sehr kompakt
Öffnet einen echten Windows‑Dateidialog
? Nachteile
Abhängig von mshta.exe (veraltet, unsicher)
Kann durch Sicherheitsrichtlinien blockiert sein
Nicht zukunftssicher
Nicht plattformübergreifend (nur Windows)
? Empfohlene Alternative (viel sicherer & stabiler)
Wenn du nur einen Dateidialog brauchst, ist FileDialog die beste Lösung:
vba
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
If fd.Show = -1 Then
sFileSelected = fd.SelectedItems(1)
End If
Keine externen Programme
Keine ActiveX‑Tricks
Funktioniert in allen modernen Office‑Versionen


